v8/test
Benedikt Meurer eed0d27c2f [stack-traces] Simplify and speedup stack trace collection.
Following up on https://crrev.com/c/2689185, this CL significantly
simplifies the whole implementation of the stack trace capturing.

Before this CL, capturing any stack trace (for the purpose of the API or
Error.stack) would roughly work like this:

  1. The CaptureStackTrace() function uses the StackFrameIterator to
     walk the system stack. For each native frame it uses the
     FrameSummary abstraction to get all (including potentially inlined)
     frames. For each of those it appends a record consisting of six
     elements to a FrameArray (this holds pointers to the actual
     closures and receivers).
  2. Afterwards the FrameArray is shrinked to the required size, and a
     new FixedArray is allocated, and initialized with new
     StackTraceFrame objects where each holds a reference to the
     FrameArray, the index of the frame, and an initially uninitialized
     StackFrameInfo reference. This new FixedArray is then returned from
     CaptureStackTrace() and either stored on a message object or
     provided to the API as v8::StackTrace.

The new approach removes a lot of the machinery in between and directly
creates a FixedArray of StackFrameInfo objects in CaptureStackTrace().
These StackFrameInfo objects are directly exposed as v8::StackFrame on
the public API, and they hold the six fields that were previously stored
flat in the FrameArray. This not only avoids a lot of copying around of
data and creation of temporary objects and handles, but most importantly
unifies and simplifies the stack frame function inside StackFrameInfo,
so you no longer need to wonder which function / object might be
responsible for a certain API.

There's still a lot of room for improvement. In particular we currently
don't cache the source position for a given StackFrameInfo (or
globally), but rather recompute it every time. This is still very fast,
significantly faster than the previous approach.

There are some notable (potentially user visible) changes:

  - The CallSite#GetPosition() method now consistently returns the
    Wasm module relative bytecode offset for all Wasm frames (previously
    it'd return the function relative bytecode offset for non-asm.js
    Wasm frames).
  - The column and line numbers returned from StackFrameInfo methods are
    consistently 1-based now, instead of sometimes being 0-based (Wasm)
    and sometimes being 1-based (JS and asm.js Wasm). The only
    potentially noticable difference is that for
    CallSite#GetLineNumber() no longer returns 0 for Wasm frames, but
    that was wrong and useless anyways.
  - CallSite#GetThis() would sometimes return the_hole, another bug
    flushed out by this CL.

The CL also contains some other not noteworthy drive-by-cleanups.

Fixed: chromium:1057211
Bug: chromium:1077657, chromium:1069425, v8:8742
Bug: chromium:1127391, chromium:1098530, chromium:981541
Change-Id: Iff12f6838a4d99080db8dd96bccc14440affc5a5
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2689183
Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
Reviewed-by: Yang Guo <yangguo@chromium.org>
Reviewed-by: Simon Zünd <szuend@chromium.org>
Reviewed-by: Jakob Kummerow <jkummerow@chromium.org>
Cr-Commit-Position: refs/heads/master@{#72694}
2021-02-12 13:49:27 +00:00
..
benchmarks cppgc-js: Report C++ memory to V8's heap growing 2021-01-27 00:32:05 +00:00
cctest [stack-traces] Simplify and speedup stack trace collection. 2021-02-12 13:49:27 +00:00
common [wasm][interpreter][eh] Implement catch with immediate 2021-02-11 15:38:56 +00:00
debugger Revert "[wasm] Send a single scriptParsed event per script" 2021-02-11 16:35:35 +00:00
debugging [wasm] [debugging] Fix --wasm-gdb-remote 2020-12-08 19:37:25 +00:00
fuzzer [wasm-simd][fuzzer] Add i8x16.popcnt to fuzzer 2021-02-10 23:25:45 +00:00
fuzzilli Fix unhandled promise rejections in REPRL mode 2020-09-30 13:34:23 +00:00
inspector Revert "[wasm] Send a single scriptParsed event per script" 2021-02-11 16:35:35 +00:00
intl [test] Disable tests failing with new msan roll 2021-02-12 11:53:48 +00:00
js-perf-test [super] Rewrite perf tests 2020-11-16 08:36:24 +00:00
memory Reland^4 "[serializer] Allocate during deserialization" 2020-10-07 08:15:50 +00:00
message [wasm-simd] Add a decode failure if hardware does not support SIMD 2021-02-12 01:28:54 +00:00
mjsunit [stack-traces] Simplify and speedup stack trace collection. 2021-02-12 13:49:27 +00:00
mkgrokdump Replace libc functions with base wrappers 2020-11-17 08:50:41 +00:00
mozilla [compiler, infra] Add a --stress-concurrent-inlining flag and a bot 2021-01-29 12:05:03 +00:00
test262 [test] Disable tests failing with new msan roll 2021-02-12 11:53:48 +00:00
torque [torque] Allow returning pairs from builtins 2021-01-19 18:03:12 +00:00
unittests [heap] Fix flaky test for GC epilogues 2021-02-12 10:08:51 +00:00
wasm-api-tests [test][cleanup] Rename WASM_*_GLOBAL to WASM_GLOBAL_* 2020-12-17 21:26:54 +00:00
wasm-js [wasm][memory64] Update spec tests 2021-02-08 13:17:29 +00:00
wasm-spec-tests [wasm-simd] Add a decode failure if hardware does not support SIMD 2021-02-12 01:28:54 +00:00
webkit
BUILD.gn [turbofan] Make OSR and stack slots compatible 2020-10-05 17:41:02 +00:00
OWNERS