• Benedikt Meurer's avatar
    [debug] Simplify async function instrumentation. · 41f0c0ba
    Benedikt Meurer authored
    This unifies and simplifies the way we instrument async functions for
    the purpose of async stack traces and async stepping. It does so while
    retaining the observable behavior on the inspector level (for now).
    
    Previously we'd mark the implicit promise of the async function object
    with the async task ID, and whenever we awaited, we'd copy the async
    task ID to the throwaway promise that is created by the `await`. This
    however made things unnecessarily interesting in the following regards:
    
    1. We'd see `DebugDidHandle` and `DebugWillHandle` events after the
    `AsyncFunctionFinished` events, coming from the throwaway promises,
    while the implicit promise is "done". This is especially confusing
    with rejection propagation and requires very complex stepping logic
    for async functions (after this CL it'll be possible to unify and
    simplify the stepping logic).
    2. We have to thread through the "can suspend" information from the
    Parser all the way through AsyncFunctionReject/AsyncFunctionResolve
    to the async function instrumentation to decide whether to cancel the
    pending task when the async function finishes.
    
    This CL changes the instrumentation to only happen (non recurringly) for
    the throwaway promises allocated upon `await`. This solves both problems
    mentioned above, and works because upon the first `await` the stack
    captured for the throwaway promise will include the synchronous part as
    expected, while upon later `await`s the synchronous part will be empty
    and the asynchronous part will be the stack captured for the previous
    throwaway promise (and the V8Debugger automatically short circuits
    stacks with empty synchronous part).
    
    Bug: chromium:1280519, chromium:1277451, chromium:1246867
    Change-Id: Id604dabc19ea133ea2e9dd63181b1fc33ccb5eda
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3383775Reviewed-by: 's avatarLeszek Swirski <leszeks@chromium.org>
    Reviewed-by: 's avatarMaya Lekova <mslekova@chromium.org>
    Reviewed-by: 's avatarSimon Zünd <szuend@chromium.org>
    Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
    Cr-Commit-Position: refs/heads/main@{#78599}
    41f0c0ba
js-operator.cc 60 KB