• Benedikt Meurer's avatar
    [async] First prototype of zero-cost async stack traces. · f537d778
    Benedikt Meurer authored
    This introduces a new flag --async-stack-traces, which enables zero-cost
    async stack traces. This enriches the non-standard Error.stack property
    with async stack frames computed from walking up the promise chains and
    collecting all the await suspension points along the way. In Error.stack
    these async frames are marked with "async" to make it possible to
    distinguish them from regular frames, for example:
    
    ```
    Error: Some error message
        at bar (<anonymous>)
        at async foo (<anonymous>)
    ```
    
    It's zero-cost because no additional information is collected during the
    execution of the program, but only the information already present in the
    promise chains is used to reconstruct an approximation of the async stack
    in case of an exception. But this approximation is limited to suspension
    points at await's in async functions. This depends on a recent ECMAScript
    specification change, flagged behind --harmony-await-optimization and
    implied the --async-stack-traces flag. Without this change there's no
    way to get from the outer promise of an async function to the rest of
    the promise chain, since the link is broken by the indirection introduced
    by await.
    
    For async functions the special outer promise, named .promise in the
    Parser desugaring, is now forcible allocated to stack slot 0 during
    scope resolution, to make it accessible to the stack frame construction
    logic. Note that this first prototype doesn't yet work fully support
    async generators and might have other limitations.
    
    Bug: v8:7522
    Ref: nodejs/node#11865
    Change-Id: I0cc8e3cdfe45dab56d3d506be2d25907409b01a9
    Design-Document: http://bit.ly/v8-zero-cost-async-stack-traces
    Reviewed-on: https://chromium-review.googlesource.com/c/1256762
    Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
    Reviewed-by: 's avatarAdam Klein <adamk@chromium.org>
    Reviewed-by: 's avatarYang Guo <yangguo@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#56363}
    f537d778
Name
Last commit
Last update
benchmarks Loading commit data...
build_overrides Loading commit data...
custom_deps Loading commit data...
docs Loading commit data...
gni Loading commit data...
include Loading commit data...
infra Loading commit data...
samples Loading commit data...
src Loading commit data...
test Loading commit data...
testing Loading commit data...
third_party Loading commit data...
tools Loading commit data...
.clang-format Loading commit data...
.clang-tidy Loading commit data...
.editorconfig Loading commit data...
.git-blame-ignore-revs Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
.gn Loading commit data...
.vpython Loading commit data...
.ycm_extra_conf.py Loading commit data...
AUTHORS Loading commit data...
BUILD.gn Loading commit data...
CODE_OF_CONDUCT.md Loading commit data...
ChangeLog Loading commit data...
DEPS Loading commit data...
LICENSE Loading commit data...
LICENSE.fdlibm Loading commit data...
LICENSE.strongtalk Loading commit data...
LICENSE.v8 Loading commit data...
LICENSE.valgrind Loading commit data...
OWNERS Loading commit data...
PRESUBMIT.py Loading commit data...
README.md Loading commit data...
WATCHLISTS Loading commit data...
codereview.settings Loading commit data...
snapshot_toolchain.gni Loading commit data...