| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 03cf8db commit 66bc206
7 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -53,6 +53,22 @@ BUILTIN(CallSitePrototypeGetColumnNumber) { | |||
| 53 | 53 | return PositiveNumberOrNull(it.Frame()->GetColumnNumber(), isolate); | |
| 54 | 54 | } | |
| 55 | 55 | ||
| 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 | + | ||
| 56 | 72 | BUILTIN(CallSitePrototypeGetEvalOrigin) { | |
| 57 | 73 | HandleScope scope(isolate); | |
| 58 | 74 | CHECK_CALLSITE(recv, "getEvalOrigin"); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -365,6 +365,8 @@ namespace internal { | |||
| 365 | 365 | \ | |
| 366 | 366 | /* CallSite */ \ | |
| 367 | 367 | CPP(CallSitePrototypeGetColumnNumber) \ | |
| 368 | + CPP(CallSitePrototypeGetEnclosingColumnNumber) \ | ||
| 369 | + CPP(CallSitePrototypeGetEnclosingLineNumber) \ | ||
| 368 | 370 | CPP(CallSitePrototypeGetEvalOrigin) \ | |
| 369 | 371 | CPP(CallSitePrototypeGetFileName) \ | |
| 370 | 372 | CPP(CallSitePrototypeGetFunction) \ | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -514,6 +514,26 @@ int JSStackFrame::GetColumnNumber() { | |||
| 514 | 514 | return kNone; | |
| 515 | 515 | } | |
| 516 | 516 | ||
| 517 | + int JSStackFrame::GetEnclosingLineNumber() { | ||
| 518 | + if (HasScript()) { | ||
| 519 | + Handle<SharedFunctionInfo> shared = handle(function_->shared(), isolate_); | ||
| 520 | + return Script::GetLineNumber(GetScript(), | ||
| 521 | + shared->function_token_position()) + 1; | ||
| 522 | + } else { | ||
| 523 | + return kNone; | ||
| 524 | + } | ||
| 525 | + } | ||
| 526 | + | ||
| 527 | + int JSStackFrame::GetEnclosingColumnNumber() { | ||
| 528 | + if (HasScript()) { | ||
| 529 | + Handle<SharedFunctionInfo> shared = handle(function_->shared(), isolate_); | ||
| 530 | + return Script::GetColumnNumber(GetScript(), | ||
| 531 | + shared->function_token_position()) + 1; | ||
| 532 | + } else { | ||
| 533 | + return kNone; | ||
| 534 | + } | ||
| 535 | + } | ||
| 536 | + | ||
| 517 | 537 | int JSStackFrame::GetPromiseIndex() const { | |
| 518 | 538 | return (is_promise_all_ || is_promise_any_) ? offset_ : kNone; | |
| 519 | 539 | } | |
@@ -602,6 +622,12 @@ int WasmStackFrame::GetPosition() const { | |||
| 602 | 622 | ||
| 603 | 623 | int WasmStackFrame::GetColumnNumber() { return GetModuleOffset(); } | |
| 604 | 624 | ||
| 625 | + int WasmStackFrame::GetEnclosingColumnNumber() { | ||
| 626 | + const int function_offset = | ||
| 627 | + GetWasmFunctionOffset(wasm_instance_->module(), wasm_func_index_); | ||
| 628 | + return function_offset; | ||
| 629 | + } | ||
| 630 | + | ||
| 605 | 631 | int WasmStackFrame::GetModuleOffset() const { | |
| 606 | 632 | const int function_offset = | |
| 607 | 633 | GetWasmFunctionOffset(wasm_instance_->module(), wasm_func_index_); | |
@@ -672,6 +698,26 @@ int AsmJsWasmStackFrame::GetColumnNumber() { | |||
| 672 | 698 | return Script::GetColumnNumber(script, GetPosition()) + 1; | |
| 673 | 699 | } | |
| 674 | 700 | ||
| 701 | + int AsmJsWasmStackFrame::GetEnclosingLineNumber() { | ||
| 702 | + DCHECK_LE(0, GetPosition()); | ||
| 703 | + Handle<Script> script(wasm_instance_->module_object().script(), isolate_); | ||
| 704 | + DCHECK(script->IsUserJavaScript()); | ||
| 705 | + int byte_offset = GetSourcePosition(wasm_instance_->module(), | ||
| 706 | + wasm_func_index_, 0, | ||
| 707 | + is_at_number_conversion_); | ||
| 708 | + return Script::GetLineNumber(script, byte_offset) + 1; | ||
| 709 | + } | ||
| 710 | + | ||
| 711 | + int AsmJsWasmStackFrame::GetEnclosingColumnNumber() { | ||
| 712 | + DCHECK_LE(0, GetPosition()); | ||
| 713 | + Handle<Script> script(wasm_instance_->module_object().script(), isolate_); | ||
| 714 | + DCHECK(script->IsUserJavaScript()); | ||
| 715 | + int byte_offset = GetSourcePosition(wasm_instance_->module(), | ||
| 716 | + wasm_func_index_, 0, | ||
| 717 | + is_at_number_conversion_); | ||
| 718 | + return Script::GetColumnNumber(script, byte_offset) + 1; | ||
| 719 | + } | ||
| 720 | + | ||
| 675 | 721 | FrameArrayIterator::FrameArrayIterator(Isolate* isolate, | |
| 676 | 722 | Handle<FrameArray> array, int frame_ix) | |
| 677 | 723 | : isolate_(isolate), array_(array), frame_ix_(frame_ix) {} | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -87,6 +87,9 @@ class StackFrameBase { | |||
| 87 | 87 | // Return 0-based Wasm function index. Returns -1 for non-Wasm frames. | |
| 88 | 88 | virtual int GetWasmFunctionIndex(); | |
| 89 | 89 | ||
| 90 | + virtual int GetEnclosingColumnNumber() = 0; | ||
| 91 | + virtual int GetEnclosingLineNumber() = 0; | ||
| 92 | + | ||
| 90 | 93 | // Returns the index of the rejected promise in the Promise combinator input, | |
| 91 | 94 | // or -1 if this frame is not a Promise combinator frame. | |
| 92 | 95 | virtual int GetPromiseIndex() const = 0; | |
@@ -133,6 +136,9 @@ class JSStackFrame : public StackFrameBase { | |||
| 133 | 136 | int GetLineNumber() override; | |
| 134 | 137 | int GetColumnNumber() override; | |
| 135 | 138 | ||
| 139 | + int GetEnclosingColumnNumber() override; | ||
| 140 | + int GetEnclosingLineNumber() override; | ||
| 141 | + | ||
| 136 | 142 | int GetPromiseIndex() const override; | |
| 137 | 143 | ||
| 138 | 144 | bool IsNative() override; | |
@@ -183,6 +189,8 @@ class WasmStackFrame : public StackFrameBase { | |||
| 183 | 189 | int GetPosition() const override; | |
| 184 | 190 | int GetLineNumber() override { return 0; } | |
| 185 | 191 | int GetColumnNumber() override; | |
| 192 | + int GetEnclosingColumnNumber() override; | ||
| 193 | + int GetEnclosingLineNumber() override { return 0; } | ||
| 186 | 194 | int GetWasmFunctionIndex() override { return wasm_func_index_; } | |
| 187 | 195 | ||
| 188 | 196 | int GetPromiseIndex() const override { return GetPosition(); } | |
@@ -231,6 +239,9 @@ class AsmJsWasmStackFrame : public WasmStackFrame { | |||
| 231 | 239 | int GetLineNumber() override; | |
| 232 | 240 | int GetColumnNumber() override; | |
| 233 | 241 | ||
| 242 | + int GetEnclosingColumnNumber() override; | ||
| 243 | + int GetEnclosingLineNumber() override; | ||
| 244 | + | ||
| 234 | 245 | private: | |
| 235 | 246 | friend class FrameArrayIterator; | |
| 236 | 247 | AsmJsWasmStackFrame() = default; | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -4090,6 +4090,10 @@ void Genesis::InitializeCallSiteBuiltins() { | |||
| 4090 | 4090 | ||
| 4091 | 4091 | FunctionInfo infos[] = { | |
| 4092 | 4092 | {"getColumnNumber", Builtins::kCallSitePrototypeGetColumnNumber}, | |
| 4093 | + {"getEnclosingColumnNumber", | ||
| 4094 | + Builtins::kCallSitePrototypeGetEnclosingColumnNumber}, | ||
| 4095 | + {"getEnclosingLineNumber", | ||
| 4096 | + Builtins::kCallSitePrototypeGetEnclosingLineNumber}, | ||
| 4093 | 4097 | {"getEvalOrigin", Builtins::kCallSitePrototypeGetEvalOrigin}, | |
| 4094 | 4098 | {"getFileName", Builtins::kCallSitePrototypeGetFileName}, | |
| 4095 | 4099 | {"getFunction", Builtins::kCallSitePrototypeGetFunction}, | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -439,3 +439,23 @@ var constructor = new Error().stack[0].constructor; | |||
| 439 | 439 | assertThrows(() => constructor.call()); | |
| 440 | 440 | assertThrows(() => constructor.call( | |
| 441 | 441 | 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 | + } | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -154,3 +154,18 @@ function generateOverflowWasmFromAsmJs() { | |||
| 154 | 154 | ['f', 135, 12] // -- | |
| 155 | 155 | ]); | |
| 156 | 156 | })(); | |
| 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 | + })(); | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments