Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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: v8/v8@86991d0
  • Loading branch information
Benjamin Coe committed Nov 25, 2020
commit d5a93e87e18495365850ebe8e22fe99aee3b27e2
2 changes: 1 addition & 1 deletion common.gypi
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@

# Reset this number to 0 on major V8 upgrades.
# Increment by one for each non-official patch applied to deps/v8.
'v8_embedder_string': '-node.19',
'v8_embedder_string': '-node.20',

##### V8 defaults for Node.js #####

Expand Down
16 changes: 16 additions & 0 deletions deps/v8/src/builtins/builtins-callsite.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down
2 changes: 2 additions & 0 deletions deps/v8/src/builtins/builtins-definitions.h
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,8 @@ namespace internal {
\
/* CallSite */ \
CPP(CallSitePrototypeGetColumnNumber) \
CPP(CallSitePrototypeGetEnclosingColumnNumber) \
CPP(CallSitePrototypeGetEnclosingLineNumber) \
CPP(CallSitePrototypeGetEvalOrigin) \
CPP(CallSitePrototypeGetFileName) \
CPP(CallSitePrototypeGetFunction) \
Expand Down
46 changes: 46 additions & 0 deletions deps/v8/src/execution/messages.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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_);
Expand Down Expand Up @@ -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) {}
Expand Down
11 changes: 11 additions & 0 deletions deps/v8/src/execution/messages.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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(); }
Expand Down Expand Up @@ -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;
Expand Down
4 changes: 4 additions & 0 deletions deps/v8/src/init/bootstrapper.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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},
Expand Down
20 changes: 20 additions & 0 deletions deps/v8/test/mjsunit/stack-traces.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
15 changes: 15 additions & 0 deletions deps/v8/test/mjsunit/wasm/asm-wasm-stack.js
Original file line number Diff line number Diff line change
Expand Up @@ -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());
})();