• Shu-yu Guo's avatar
    Set is_awaiting on async generators after await's Promise machinery · 8efed0f9
    Shu-yu Guo authored
    The is_awaiting bit on async generators distinguishes waiting on an
    await. When the async generator resumes from an await, the is_awaiting
    bit is cleared.
    
    It is possible through overriding Promise#constructor that `await`
    throws *after* setting is_awaiting. There is an implicit try-catch
    around the body of the async generator such that, usually, caught
    exceptions would clear the is_awaiting bit. However, the exception
    thrown from a monkeypatched Promise#constructor can be caught by script,
    and thus never clear the is_awaiting bit.
    
    This CL sets the is_awaiting bit *after* `await` completes, with the
    exception of the return resumption. It is not possible to have the
    exception thrown by the await in the return resumption be caught by
    script.
    
    Bug: chromium:1171667
    Change-Id: I0b615617a5c949f03350ab0f06c42920d43b5488
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2659508Reviewed-by: 's avatarLeszek Swirski <leszeks@chromium.org>
    Commit-Queue: Shu-yu Guo <syg@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#72593}
    8efed0f9
builtins-async-generator-gen.cc 28.1 KB