summaryrefslogtreecommitdiff
path: root/deps
diff options
context:
space:
mode:
authorBenjamin Coe <bencoe@google.com>2020-11-24 18:01:16 -0800
committerNode.js GitHub Bot <github-bot@iojs.org>2020-11-26 01:51:04 +0000
commit4c97325c4e332836f00b28b1394787182f3cbc07 (patch)
tree4fe24b8a4e84ddda8f3de1b68c515a8e999c1f13 /deps
parent757d7ba12b156ee2c5aaca1702bab2f95d28c750 (diff)
downloadios-node-v8-4c97325c4e332836f00b28b1394787182f3cbc07.tar.gz
ios-node-v8-4c97325c4e332836f00b28b1394787182f3cbc07.tar.bz2
ios-node-v8-4c97325c4e332836f00b28b1394787182f3cbc07.zip
deps: V8: cherry-pick 86991d0587a1
Adds methods for fetching stack trace information about enclosing function. Refs #36042 Original commit message: Reland "stack-trace-api: implement getEnclosingLine/Column" This reverts commit 5557a63beb5a53c93e9b590eaf2933e21bcb3768. Reason for revert: Sheriff's mistake, failing test was previously flaking. Original change's description: > Revert "stack-trace-api: implement getEnclosingLine/Column" > > This reverts commit c48ae2d96cbfdc2216706a5e9a79ae1dce5a638b. > > Reason for revert: Breaks a profiling test: > https://ci.chromium.org/p/v8/builders/ci/V8%20Win32/30010 > > Original change's description: > > stack-trace-api: implement getEnclosingLine/Column > > > > Introduces getEnclosingColumn and getEnclosingLine on CallSite > > so that the position can be used to lookup the original symbol > > for function when source maps are used. > > > > BUG=v8:11157 > > > > Change-Id: I06c4c374d172d206579abb170c7b7a2bd3bb159f > > Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2547218 > > Reviewed-by: Jakob Kummerow <jkummerow@chromium.org> > > Commit-Queue: Benjamin Coe <bencoe@google.com> > > Cr-Commit-Position: refs/heads/master@{#71343} > > TBR=jkummerow@chromium.org,yangguo@chromium.org,bencoe@google.com > > Change-Id: Iab5c250c1c4fbdab86971f4a7e40abc8f87cf79c > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Bug: v8:11157 > Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2555384 > Reviewed-by: Bill Budge <bbudge@chromium.org> > Commit-Queue: Bill Budge <bbudge@chromium.org> > Cr-Commit-Position: refs/heads/master@{#71345} TBR=bbudge@chromium.org,jkummerow@chromium.org,yangguo@chromium.org,bencoe@google.com # Not skipping CQ checks because this is a reland. Bug: v8:11157 Change-Id: I8dba19ceb29a24594469d2cf79626f741dc4cad3 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2555499 Reviewed-by: Bill Budge <bbudge@chromium.org> Commit-Queue: Bill Budge <bbudge@chromium.org> Cr-Commit-Position: refs/heads/master@{#71348} Refs: https://github.com/v8/v8/commit/86991d0587a1f05b973eef8420c0cf48fdaaf915 PR-URL: https://github.com/nodejs/node/pull/36254 Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Diffstat (limited to 'deps')
-rw-r--r--deps/v8/src/builtins/builtins-callsite.cc16
-rw-r--r--deps/v8/src/builtins/builtins-definitions.h2
-rw-r--r--deps/v8/src/execution/messages.cc46
-rw-r--r--deps/v8/src/execution/messages.h11
-rw-r--r--deps/v8/src/init/bootstrapper.cc4
-rw-r--r--deps/v8/test/mjsunit/stack-traces.js20
-rw-r--r--deps/v8/test/mjsunit/wasm/asm-wasm-stack.js15
7 files changed, 114 insertions, 0 deletions
diff --git a/deps/v8/src/builtins/builtins-callsite.cc b/deps/v8/src/builtins/builtins-callsite.cc
index 5b7807ed4a..63e4d7a572 100644
--- a/deps/v8/src/builtins/builtins-callsite.cc
+++ b/deps/v8/src/builtins/builtins-callsite.cc
@@ -53,6 +53,22 @@ BUILTIN(CallSitePrototypeGetColumnNumber) {
return PositiveNumberOrNull(it.Frame()->GetColumnNumber(), isolate);
}
+BUILTIN(CallSitePrototypeGetEnclosingColumnNumber) {
+ HandleScope scope(isolate);
+ CHECK_CALLSITE(recv, "getEnclosingColumnNumber");
+ FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
+ GetFrameIndex(isolate, recv));
+ return PositiveNumberOrNull(it.Frame()->GetEnclosingColumnNumber(), isolate);
+}
+
+BUILTIN(CallSitePrototypeGetEnclosingLineNumber) {
+ HandleScope scope(isolate);
+ CHECK_CALLSITE(recv, "getEnclosingLineNumber");
+ FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
+ GetFrameIndex(isolate, recv));
+ return PositiveNumberOrNull(it.Frame()->GetEnclosingLineNumber(), isolate);
+}
+
BUILTIN(CallSitePrototypeGetEvalOrigin) {
HandleScope scope(isolate);
CHECK_CALLSITE(recv, "getEvalOrigin");
diff --git a/deps/v8/src/builtins/builtins-definitions.h b/deps/v8/src/builtins/builtins-definitions.h
index 511e748acd..10bbd12f8a 100644
--- a/deps/v8/src/builtins/builtins-definitions.h
+++ b/deps/v8/src/builtins/builtins-definitions.h
@@ -364,6 +364,8 @@ namespace internal {
\
/* CallSite */ \
CPP(CallSitePrototypeGetColumnNumber) \
+ CPP(CallSitePrototypeGetEnclosingColumnNumber) \
+ CPP(CallSitePrototypeGetEnclosingLineNumber) \
CPP(CallSitePrototypeGetEvalOrigin) \
CPP(CallSitePrototypeGetFileName) \
CPP(CallSitePrototypeGetFunction) \
diff --git a/deps/v8/src/execution/messages.cc b/deps/v8/src/execution/messages.cc
index 86e3d48882..ab6c6bc392 100644
--- a/deps/v8/src/execution/messages.cc
+++ b/deps/v8/src/execution/messages.cc
@@ -514,6 +514,26 @@ int JSStackFrame::GetColumnNumber() {
return kNone;
}
+int JSStackFrame::GetEnclosingLineNumber() {
+ if (HasScript()) {
+ Handle<SharedFunctionInfo> shared = handle(function_->shared(), isolate_);
+ return Script::GetLineNumber(GetScript(),
+ shared->function_token_position()) + 1;
+ } else {
+ return kNone;
+ }
+}
+
+int JSStackFrame::GetEnclosingColumnNumber() {
+ if (HasScript()) {
+ Handle<SharedFunctionInfo> shared = handle(function_->shared(), isolate_);
+ return Script::GetColumnNumber(GetScript(),
+ shared->function_token_position()) + 1;
+ } else {
+ return kNone;
+ }
+}
+
int JSStackFrame::GetPromiseIndex() const {
return (is_promise_all_ || is_promise_any_) ? offset_ : kNone;
}
@@ -602,6 +622,12 @@ int WasmStackFrame::GetPosition() const {
int WasmStackFrame::GetColumnNumber() { return GetModuleOffset(); }
+int WasmStackFrame::GetEnclosingColumnNumber() {
+ const int function_offset =
+ GetWasmFunctionOffset(wasm_instance_->module(), wasm_func_index_);
+ return function_offset;
+}
+
int WasmStackFrame::GetModuleOffset() const {
const int function_offset =
GetWasmFunctionOffset(wasm_instance_->module(), wasm_func_index_);
@@ -672,6 +698,26 @@ int AsmJsWasmStackFrame::GetColumnNumber() {
return Script::GetColumnNumber(script, GetPosition()) + 1;
}
+int AsmJsWasmStackFrame::GetEnclosingLineNumber() {
+ DCHECK_LE(0, GetPosition());
+ Handle<Script> script(wasm_instance_->module_object().script(), isolate_);
+ DCHECK(script->IsUserJavaScript());
+ int byte_offset = GetSourcePosition(wasm_instance_->module(),
+ wasm_func_index_, 0,
+ is_at_number_conversion_);
+ return Script::GetLineNumber(script, byte_offset) + 1;
+}
+
+int AsmJsWasmStackFrame::GetEnclosingColumnNumber() {
+ DCHECK_LE(0, GetPosition());
+ Handle<Script> script(wasm_instance_->module_object().script(), isolate_);
+ DCHECK(script->IsUserJavaScript());
+ int byte_offset = GetSourcePosition(wasm_instance_->module(),
+ wasm_func_index_, 0,
+ is_at_number_conversion_);
+ return Script::GetColumnNumber(script, byte_offset) + 1;
+}
+
FrameArrayIterator::FrameArrayIterator(Isolate* isolate,
Handle<FrameArray> array, int frame_ix)
: isolate_(isolate), array_(array), frame_ix_(frame_ix) {}
diff --git a/deps/v8/src/execution/messages.h b/deps/v8/src/execution/messages.h
index 16ddd03469..ad72d762d2 100644
--- a/deps/v8/src/execution/messages.h
+++ b/deps/v8/src/execution/messages.h
@@ -87,6 +87,9 @@ class StackFrameBase {
// Return 0-based Wasm function index. Returns -1 for non-Wasm frames.
virtual int GetWasmFunctionIndex();
+ virtual int GetEnclosingColumnNumber() = 0;
+ virtual int GetEnclosingLineNumber() = 0;
+
// Returns the index of the rejected promise in the Promise combinator input,
// or -1 if this frame is not a Promise combinator frame.
virtual int GetPromiseIndex() const = 0;
@@ -133,6 +136,9 @@ class JSStackFrame : public StackFrameBase {
int GetLineNumber() override;
int GetColumnNumber() override;
+ int GetEnclosingColumnNumber() override;
+ int GetEnclosingLineNumber() override;
+
int GetPromiseIndex() const override;
bool IsNative() override;
@@ -183,6 +189,8 @@ class WasmStackFrame : public StackFrameBase {
int GetPosition() const override;
int GetLineNumber() override { return 0; }
int GetColumnNumber() override;
+ int GetEnclosingColumnNumber() override;
+ int GetEnclosingLineNumber() override { return 0; }
int GetWasmFunctionIndex() override { return wasm_func_index_; }
int GetPromiseIndex() const override { return GetPosition(); }
@@ -231,6 +239,9 @@ class AsmJsWasmStackFrame : public WasmStackFrame {
int GetLineNumber() override;
int GetColumnNumber() override;
+ int GetEnclosingColumnNumber() override;
+ int GetEnclosingLineNumber() override;
+
private:
friend class FrameArrayIterator;
AsmJsWasmStackFrame() = default;
diff --git a/deps/v8/src/init/bootstrapper.cc b/deps/v8/src/init/bootstrapper.cc
index c5cfceb069..990a7804fd 100644
--- a/deps/v8/src/init/bootstrapper.cc
+++ b/deps/v8/src/init/bootstrapper.cc
@@ -4090,6 +4090,10 @@ void Genesis::InitializeCallSiteBuiltins() {
FunctionInfo infos[] = {
{"getColumnNumber", Builtins::kCallSitePrototypeGetColumnNumber},
+ {"getEnclosingColumnNumber",
+ Builtins::kCallSitePrototypeGetEnclosingColumnNumber},
+ {"getEnclosingLineNumber",
+ Builtins::kCallSitePrototypeGetEnclosingLineNumber},
{"getEvalOrigin", Builtins::kCallSitePrototypeGetEvalOrigin},
{"getFileName", Builtins::kCallSitePrototypeGetFileName},
{"getFunction", Builtins::kCallSitePrototypeGetFunction},
diff --git a/deps/v8/test/mjsunit/stack-traces.js b/deps/v8/test/mjsunit/stack-traces.js
index a46b2b3940..949d8390b4 100644
--- a/deps/v8/test/mjsunit/stack-traces.js
+++ b/deps/v8/test/mjsunit/stack-traces.js
@@ -439,3 +439,23 @@ var constructor = new Error().stack[0].constructor;
assertThrows(() => constructor.call());
assertThrows(() => constructor.call(
null, {}, () => undefined, {valueOf() { return 0 }}, false));
+
+// Test stack frames populated with line/column information for both call site
+// and enclosing function:
+Error.prepareStackTrace = function(e, frames) {
+ assertMatches(/stack-traces\.js/, frames[0].getFileName());
+ assertEquals(3, frames[0].getEnclosingColumnNumber());
+ assertEquals(11, frames[0].getColumnNumber());
+ assertTrue(frames[0].getEnclosingLineNumber() < frames[0].getLineNumber());
+}
+try {
+ function a() {
+ b();
+ }
+ function b() {
+ throw Error('hello world');
+ }
+ a();
+} catch (err) {
+ err.stack;
+}
diff --git a/deps/v8/test/mjsunit/wasm/asm-wasm-stack.js b/deps/v8/test/mjsunit/wasm/asm-wasm-stack.js
index b416aaa141..9e09419d06 100644
--- a/deps/v8/test/mjsunit/wasm/asm-wasm-stack.js
+++ b/deps/v8/test/mjsunit/wasm/asm-wasm-stack.js
@@ -154,3 +154,18 @@ function generateOverflowWasmFromAsmJs() {
['f', 135, 12] // --
]);
})();
+
+(function EnclosingFunctionOffsets() {
+ const fun = generateWasmFromAsmJs(this, {throwFunc: throwException});
+ assertTrue(%IsWasmCode(fun));
+ let e = null;
+ try {
+ fun(0);
+ } catch (ex) {
+ e = ex;
+ }
+ assertEquals(68, e.stack[2].getLineNumber());
+ assertEquals(15, e.stack[2].getColumnNumber());
+ assertEquals(65, e.stack[2].getEnclosingLineNumber());
+ assertEquals(3, e.stack[2].getEnclosingColumnNumber());
+})();