Skip to content

Commit f59ee44

Browse files
bcoetargos
authored andcommitted
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 <[email protected]> > > Commit-Queue: Benjamin Coe <[email protected]> > > Cr-Commit-Position: refs/heads/master@{#71343} > > [email protected],[email protected],[email protected] > > 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 <[email protected]> > Commit-Queue: Bill Budge <[email protected]> > Cr-Commit-Position: refs/heads/master@{#71345} [email protected],[email protected],[email protected],[email protected] # 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 <[email protected]> Commit-Queue: Bill Budge <[email protected]> Cr-Commit-Position: refs/heads/master@{#71348} Refs: v8/v8@86991d0 PR-URL: #36254 Reviewed-By: Benjamin Gruenbaum <[email protected]> Reviewed-By: Antoine du Hamel <[email protected]>
1 parent 73b5aa7 commit f59ee44

File tree

8 files changed

+115
-1
lines changed

8 files changed

+115
-1
lines changed

common.gypi

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636

3737
# Reset this number to 0 on major V8 upgrades.
3838
# Increment by one for each non-official patch applied to deps/v8.
39-
'v8_embedder_string': '-node.64',
39+
'v8_embedder_string': '-node.65',
4040

4141
##### V8 defaults for Node.js #####
4242

deps/v8/src/builtins/builtins-callsite.cc

+16
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,22 @@ BUILTIN(CallSitePrototypeGetColumnNumber) {
5353
return PositiveNumberOrNull(it.Frame()->GetColumnNumber(), isolate);
5454
}
5555

56+
BUILTIN(CallSitePrototypeGetEnclosingColumnNumber) {
57+
HandleScope scope(isolate);
58+
CHECK_CALLSITE(recv, "getEnclosingColumnNumber");
59+
FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
60+
GetFrameIndex(isolate, recv));
61+
return PositiveNumberOrNull(it.Frame()->GetEnclosingColumnNumber(), isolate);
62+
}
63+
64+
BUILTIN(CallSitePrototypeGetEnclosingLineNumber) {
65+
HandleScope scope(isolate);
66+
CHECK_CALLSITE(recv, "getEnclosingLineNumber");
67+
FrameArrayIterator it(isolate, GetFrameArray(isolate, recv),
68+
GetFrameIndex(isolate, recv));
69+
return PositiveNumberOrNull(it.Frame()->GetEnclosingLineNumber(), isolate);
70+
}
71+
5672
BUILTIN(CallSitePrototypeGetEvalOrigin) {
5773
HandleScope scope(isolate);
5874
CHECK_CALLSITE(recv, "getEvalOrigin");

deps/v8/src/builtins/builtins-definitions.h

+2
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,8 @@ namespace internal {
376376
\
377377
/* CallSite */ \
378378
CPP(CallSitePrototypeGetColumnNumber) \
379+
CPP(CallSitePrototypeGetEnclosingColumnNumber) \
380+
CPP(CallSitePrototypeGetEnclosingLineNumber) \
379381
CPP(CallSitePrototypeGetEvalOrigin) \
380382
CPP(CallSitePrototypeGetFileName) \
381383
CPP(CallSitePrototypeGetFunction) \

deps/v8/src/execution/messages.cc

+46
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,26 @@ int JSStackFrame::GetColumnNumber() {
513513
return kNone;
514514
}
515515

516+
int JSStackFrame::GetEnclosingLineNumber() {
517+
if (HasScript()) {
518+
Handle<SharedFunctionInfo> shared = handle(function_->shared(), isolate_);
519+
return Script::GetLineNumber(GetScript(),
520+
shared->function_token_position()) + 1;
521+
} else {
522+
return kNone;
523+
}
524+
}
525+
526+
int JSStackFrame::GetEnclosingColumnNumber() {
527+
if (HasScript()) {
528+
Handle<SharedFunctionInfo> shared = handle(function_->shared(), isolate_);
529+
return Script::GetColumnNumber(GetScript(),
530+
shared->function_token_position()) + 1;
531+
} else {
532+
return kNone;
533+
}
534+
}
535+
516536
int JSStackFrame::GetPromiseIndex() const {
517537
return is_promise_all_ ? offset_ : kNone;
518538
}
@@ -601,6 +621,12 @@ int WasmStackFrame::GetPosition() const {
601621

602622
int WasmStackFrame::GetColumnNumber() { return GetModuleOffset(); }
603623

624+
int WasmStackFrame::GetEnclosingColumnNumber() {
625+
const int function_offset =
626+
GetWasmFunctionOffset(wasm_instance_->module(), wasm_func_index_);
627+
return function_offset;
628+
}
629+
604630
int WasmStackFrame::GetModuleOffset() const {
605631
const int function_offset =
606632
GetWasmFunctionOffset(wasm_instance_->module(), wasm_func_index_);
@@ -669,6 +695,26 @@ int AsmJsWasmStackFrame::GetColumnNumber() {
669695
return Script::GetColumnNumber(script, GetPosition()) + 1;
670696
}
671697

698+
int AsmJsWasmStackFrame::GetEnclosingLineNumber() {
699+
DCHECK_LE(0, GetPosition());
700+
Handle<Script> script(wasm_instance_->module_object().script(), isolate_);
701+
DCHECK(script->IsUserJavaScript());
702+
int byte_offset = GetSourcePosition(wasm_instance_->module(),
703+
wasm_func_index_, 0,
704+
is_at_number_conversion_);
705+
return Script::GetLineNumber(script, byte_offset) + 1;
706+
}
707+
708+
int AsmJsWasmStackFrame::GetEnclosingColumnNumber() {
709+
DCHECK_LE(0, GetPosition());
710+
Handle<Script> script(wasm_instance_->module_object().script(), isolate_);
711+
DCHECK(script->IsUserJavaScript());
712+
int byte_offset = GetSourcePosition(wasm_instance_->module(),
713+
wasm_func_index_, 0,
714+
is_at_number_conversion_);
715+
return Script::GetColumnNumber(script, byte_offset) + 1;
716+
}
717+
672718
FrameArrayIterator::FrameArrayIterator(Isolate* isolate,
673719
Handle<FrameArray> array, int frame_ix)
674720
: isolate_(isolate), array_(array), frame_ix_(frame_ix) {}

deps/v8/src/execution/messages.h

+11
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@ class StackFrameBase {
8686
// Return 0-based Wasm function index. Returns -1 for non-Wasm frames.
8787
virtual int GetWasmFunctionIndex();
8888

89+
virtual int GetEnclosingColumnNumber() = 0;
90+
virtual int GetEnclosingLineNumber() = 0;
91+
8992
// Returns index for Promise.all() async frames, or -1 for other frames.
9093
virtual int GetPromiseIndex() const = 0;
9194

@@ -130,6 +133,9 @@ class JSStackFrame : public StackFrameBase {
130133
int GetLineNumber() override;
131134
int GetColumnNumber() override;
132135

136+
int GetEnclosingColumnNumber() override;
137+
int GetEnclosingLineNumber() override;
138+
133139
int GetPromiseIndex() const override;
134140

135141
bool IsNative() override;
@@ -178,6 +184,8 @@ class WasmStackFrame : public StackFrameBase {
178184
int GetPosition() const override;
179185
int GetLineNumber() override { return 0; }
180186
int GetColumnNumber() override;
187+
int GetEnclosingColumnNumber() override;
188+
int GetEnclosingLineNumber() override { return 0; }
181189
int GetWasmFunctionIndex() override { return wasm_func_index_; }
182190

183191
int GetPromiseIndex() const override { return GetPosition(); }
@@ -225,6 +233,9 @@ class AsmJsWasmStackFrame : public WasmStackFrame {
225233
int GetLineNumber() override;
226234
int GetColumnNumber() override;
227235

236+
int GetEnclosingColumnNumber() override;
237+
int GetEnclosingLineNumber() override;
238+
228239
private:
229240
friend class FrameArrayIterator;
230241
AsmJsWasmStackFrame() = default;

deps/v8/src/init/bootstrapper.cc

+4
Original file line numberDiff line numberDiff line change
@@ -4079,6 +4079,10 @@ void Genesis::InitializeCallSiteBuiltins() {
40794079

40804080
FunctionInfo infos[] = {
40814081
{"getColumnNumber", Builtins::kCallSitePrototypeGetColumnNumber},
4082+
{"getEnclosingColumnNumber",
4083+
Builtins::kCallSitePrototypeGetEnclosingColumnNumber},
4084+
{"getEnclosingLineNumber",
4085+
Builtins::kCallSitePrototypeGetEnclosingLineNumber},
40824086
{"getEvalOrigin", Builtins::kCallSitePrototypeGetEvalOrigin},
40834087
{"getFileName", Builtins::kCallSitePrototypeGetFileName},
40844088
{"getFunction", Builtins::kCallSitePrototypeGetFunction},

deps/v8/test/mjsunit/stack-traces.js

+20
Original file line numberDiff line numberDiff line change
@@ -439,3 +439,23 @@ var constructor = new Error().stack[0].constructor;
439439
assertThrows(() => constructor.call());
440440
assertThrows(() => constructor.call(
441441
null, {}, () => undefined, {valueOf() { return 0 }}, false));
442+
443+
// Test stack frames populated with line/column information for both call site
444+
// and enclosing function:
445+
Error.prepareStackTrace = function(e, frames) {
446+
assertMatches(/stack-traces\.js/, frames[0].getFileName());
447+
assertEquals(3, frames[0].getEnclosingColumnNumber());
448+
assertEquals(11, frames[0].getColumnNumber());
449+
assertTrue(frames[0].getEnclosingLineNumber() < frames[0].getLineNumber());
450+
}
451+
try {
452+
function a() {
453+
b();
454+
}
455+
function b() {
456+
throw Error('hello world');
457+
}
458+
a();
459+
} catch (err) {
460+
err.stack;
461+
}

deps/v8/test/mjsunit/wasm/asm-wasm-stack.js

+15
Original file line numberDiff line numberDiff line change
@@ -154,3 +154,18 @@ function generateOverflowWasmFromAsmJs() {
154154
['f', 135, 12] // --
155155
]);
156156
})();
157+
158+
(function EnclosingFunctionOffsets() {
159+
const fun = generateWasmFromAsmJs(this, {throwFunc: throwException});
160+
assertTrue(%IsWasmCode(fun));
161+
let e = null;
162+
try {
163+
fun(0);
164+
} catch (ex) {
165+
e = ex;
166+
}
167+
assertEquals(68, e.stack[2].getLineNumber());
168+
assertEquals(15, e.stack[2].getColumnNumber());
169+
assertEquals(65, e.stack[2].getEnclosingLineNumber());
170+
assertEquals(3, e.stack[2].getEnclosingColumnNumber());
171+
})();

0 commit comments

Comments
 (0)