Reland "stack-trace-api: implement getEnclosingLine/Column"
This reverts commit5557a63beb
. Reason for revert: Sheriff's mistake, failing test was previously flaking. Original change's description: > Revert "stack-trace-api: implement getEnclosingLine/Column" > > This reverts commitc48ae2d96c
. > > 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}
This commit is contained in:
parent
873e5aa32a
commit
86991d0587
@ -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");
|
||||
|
@ -367,6 +367,8 @@ namespace internal {
|
||||
\
|
||||
/* CallSite */ \
|
||||
CPP(CallSitePrototypeGetColumnNumber) \
|
||||
CPP(CallSitePrototypeGetEnclosingColumnNumber) \
|
||||
CPP(CallSitePrototypeGetEnclosingLineNumber) \
|
||||
CPP(CallSitePrototypeGetEvalOrigin) \
|
||||
CPP(CallSitePrototypeGetFileName) \
|
||||
CPP(CallSitePrototypeGetFunction) \
|
||||
|
@ -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) {}
|
||||
|
@ -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;
|
||||
|
@ -4202,6 +4202,10 @@ void Genesis::InitializeCallSiteBuiltins() {
|
||||
|
||||
FunctionInfo infos[] = {
|
||||
{"getColumnNumber", Builtins::kCallSitePrototypeGetColumnNumber},
|
||||
{"getEnclosingColumnNumber",
|
||||
Builtins::kCallSitePrototypeGetEnclosingColumnNumber},
|
||||
{"getEnclosingLineNumber",
|
||||
Builtins::kCallSitePrototypeGetEnclosingLineNumber},
|
||||
{"getEvalOrigin", Builtins::kCallSitePrototypeGetEvalOrigin},
|
||||
{"getFileName", Builtins::kCallSitePrototypeGetFileName},
|
||||
{"getFunction", Builtins::kCallSitePrototypeGetFunction},
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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());
|
||||
})();
|
||||
|
Loading…
Reference in New Issue
Block a user