• Alexey Kozyatinskiy's avatar
    [inspector] reworked async instrumentation for promises · ed9b2072
    Alexey Kozyatinskiy authored
    Old instrumentation was designed to collect promise creation stack and
    promise scheduled stack together. In DevTools for last 6 months we
    show only creation stack for promises. We got strong support from users
    for new model. Now we can drop support for scheduled stacks and
    simplify implementation.
    
    New promise instrumentation is straightforward:
    - we send kDebugPromiseThen when promise is created by .then call,
    - we send kDebugPromiseCatch when promise is created by .catch call,
    - we send kDebugWillHandle before chained callback and kDebugDidHandle
      after chained callback,
    - and we send separate kDebugAsyncFunctionPromiseCreated for internal
      promise inside async await function.
    
    Advantages:
    - we reduce amount of captured stacks (we do not capture stack for
      promise that constructed not by .then or .catch),
    - we can consider async task related to .then and .catch as one shot
      since chained callback is executed once,
    - on V8 side we can implement required instrumentation using only
      promise hooks,
    
    Disadvantage:
    - see await-promise test, sometimes scheduled stack was useful since we
      add catch handler in native code,
    
    Implementation details:
    - on kInit promise hook we need to figure out why promise was created.
      We analyze builtin functions until first user defined function on
      current stack. If there is kAsyncFunctionPromiseCreate function then
      we send kDebugAsyncFunctionPromiseCreated event. If there is
      kPromiseThen or kPromiseCatch then only if this function is bottom
      builtin function we send corresponded event to inspector. We need it
      because Promise.all internally calls .then and in this case we have
      Promise.all and Promise.then on stack at the same time and we do not
      need to report this internally created promise to inspector.
    
    Bug: chromium:778796
    Cq-Include-Trybots: master.tryserver.blink:linux_trusty_blink_rel
    Change-Id: I53f47ce8c5c4a9897655c3396c249ea59529ae47
    Reviewed-on: https://chromium-review.googlesource.com/765208
    Commit-Queue: Aleksey Kozyatinskiy <kozyatinskiy@chromium.org>
    Reviewed-by: 's avatarSathya Gunasekaran <gsathya@chromium.org>
    Reviewed-by: 's avatarYang Guo <yangguo@chromium.org>
    Reviewed-by: 's avatarDmitry Gozman <dgozman@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#49553}
    ed9b2072
collect-old-async-call-chains.js 6.52 KB