v8/test/debugger/debug
Benedikt Meurer 0038e5f05f [async] Improve async function handling.
This change introduces new intrinsics used to desugar async functions
in the Parser and the BytecodeGenerator, namely we introduce a new
%_AsyncFunctionEnter intrinsic that constructs the generator object
for the async function (and in the future will also create the outer
promise for the async function). This generator object is internal
and never escapes to user code, plus since async functions don't have
a "prototype" property, we can just a single map here instead of tracking
the prototype/initial_map on every async function. This saves one word
per async function plus one initial_map per async function that was
invoked at least once.

We also introduce two new intrinsics %_AsyncFunctionReject, which
rejects the outer promise with the caught exception, and another
%_AsyncFunctionResolve, which resolves the outer promise with the
right hand side of the `return` statement. These functions also perform
the DevTools part of the job (aka popping from the promise stack and
sending the debug event). This allows us to get rid of the implicit
try-finally from async functions completely; because the finally
block only called to the %AsyncFunctionPromiseRelease builtin, which
was used to inform DevTools.

In essence we now turn an async function like

```js
async function f(x) { return await bar(x); }
```

into something like this (in Parser and BytecodeGenerator respectively):

```
function f(x) {
  .generator_object = %_AsyncFunctionEnter(.closure, this);
  .promise = %AsyncFunctionCreatePromise();
  try {
    .tmp = await bar(x);
    return %_AsyncFunctionResolve(.promise, .tmp);
  } catch (e) {
    return %_AsyncFunctionReject(.promise, e);
  }
}
```

Overall the bytecode for async functions gets significantly shorter
already (and will get even shorter once we put the outer promise into
the async function generator object). For example the bytecode for a
simple async function

```js
async function f(x) { return await x; }
```

goes from 175 bytes to 110 bytes (a ~38% reduction in size), which
is in particular due to the simplification around the try-finally
removal.

Overall this seems to improve the doxbee-async-es2017-native test by
around 2-3%. On the test case mentioned in v8:8276 we go from
1124ms to 441ms, which corresponds to a 60% reduction in total
execution time!

Tbr: marja@chromium.org
Bug: v8:7253, v8:7522, v8:8276
Cq-Include-Trybots: luci.chromium.try:linux_chromium_headless_rel;luci.chromium.try:linux_chromium_rel_ng;master.tryserver.blink:linux_trusty_blink_rel
Change-Id: Id29dc92de7490b387ff697860c900cee44c9a7a4
Reviewed-on: https://chromium-review.googlesource.com/c/1269041
Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
Reviewed-by: Benedikt Meurer <bmeurer@chromium.org>
Reviewed-by: Sathya Gunasekaran <gsathya@chromium.org>
Reviewed-by: Ross McIlroy <rmcilroy@chromium.org>
Reviewed-by: Jaroslav Sevcik <jarin@chromium.org>
Reviewed-by: Maya Lekova <mslekova@chromium.org>
Reviewed-by: Yang Guo <yangguo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#56502}
2018-10-10 06:37:53 +00:00
..
compiler [debug-wrapper] Adapt tests, breakpoint.actual_location 2016-11-21 09:29:17 +00:00
es6 [cleanup] Eliminate obsolete TODOs 2018-09-04 14:59:47 +00:00
es8 [async] Improve async function handling. 2018-10-10 06:37:53 +00:00
harmony Reland "[debugger] Rewrite the ScopeIterator/DebugEvaluate to use Scope rather than ScopeInfo for inner scopes." 2018-06-18 09:25:29 +00:00
ignition [ignition] removed nop bytecode 2017-07-18 16:14:29 +00:00
regress [debug] retire ScriptWrapper 2018-07-05 21:33:03 +00:00
side-effect Reland "[interpreter] Separate bytecodes for one-shot property loads and stores" 2018-09-27 13:56:53 +00:00
wasm [debug] remove break_id 2018-08-13 08:48:34 +00:00
debug-allscopes-on-debugger.js [inspector] improve return position of explicit return in non-async function 2017-07-14 19:10:13 +00:00
debug-backtrace.js [tests] Fix assertFalse(exception) anti-pattern 2018-03-21 10:59:46 +00:00
debug-bigint.js Remove always-true --harmony-bigint runtime flag 2018-10-01 11:31:13 +00:00
debug-break-class-fields.js [class] Make class field initializers breakable in the debugger 2018-09-17 22:25:44 +00:00
debug-break-inline.js [debug-wrapper] Conditional breaks, locals, evaluate, scopes 2016-11-11 12:08:34 +00:00
debug-break-microtask.js [debug] add microtask-related tests. 2017-10-03 12:56:17 +00:00
debug-break-native.js [debug] retire ScriptWrapper 2018-07-05 21:33:03 +00:00
debug-break-return.js [debug] removed most debugger js 2018-06-03 06:02:59 +00:00
debug-breakpoints.js [debug-wrapper] Further extend the debug wrapper 2016-11-16 08:34:44 +00:00
debug-clearbreakpoint.js [tests] Fix assertFalse(exception) anti-pattern 2018-03-21 10:59:46 +00:00
debug-compile-event.js [tests] Fix assertFalse(exception) anti-pattern 2018-03-21 10:59:46 +00:00
debug-compile-optimized.js [debug] test that functions optimize without breakpoints. 2017-09-07 07:23:39 +00:00
debug-conditional-breakpoints.js [debug-wrapper] Migrate more tests 2016-11-22 12:44:18 +00:00
debug-constructor.js [debugger] Stepping and break-related functions in wrapper 2016-11-08 13:54:37 +00:00
debug-enable-disable-breakpoints.js [debug-wrapper] Further extend the debug wrapper 2016-11-16 08:34:44 +00:00
debug-eval-scope.js [debug] Add Eval scope type to inspector protocol 2016-11-23 07:30:23 +00:00
debug-evaluate-arguments.js [debug] Fix debug-evaluate for de-materialized function. 2017-11-29 14:53:18 +00:00
debug-evaluate-bool-constructor.js [tests] Fix assertFalse(exception) anti-pattern 2018-03-21 10:59:46 +00:00
debug-evaluate-closure.js [debugger] remove debugger statement support from FCG/CS. 2017-02-22 08:45:09 +00:00
debug-evaluate-declaration.js [debug-wrapper] Conditional breaks, locals, evaluate, scopes 2016-11-11 12:08:34 +00:00
debug-evaluate-locals-capturing.js Reland "[Compiler] Remove CompileDebugCode and EnsureBytecode and replace with Compile" 2017-08-17 13:21:44 +00:00
debug-evaluate-locals-optimized-double.js [tests] Fix assertFalse(exception) anti-pattern 2018-03-21 10:59:46 +00:00
debug-evaluate-locals-optimized.js [tests] Fix assertFalse(exception) anti-pattern 2018-03-21 10:59:46 +00:00
debug-evaluate-locals.js [tests] Fix assertFalse(exception) anti-pattern 2018-03-21 10:59:46 +00:00
debug-evaluate-modify-catch-block-scope.js Reland "[Compiler] Remove CompileDebugCode and EnsureBytecode and replace with Compile" 2017-08-17 13:21:44 +00:00
debug-evaluate-modify-this.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-evaluate-nested-let.js Use --opt instead of --crankshaft in tests. 2017-04-28 14:20:39 +00:00
debug-evaluate-shadowed-context-2.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-evaluate-shadowed-context.js [debug-wrapper] Migrate more tests 2016-11-22 12:44:18 +00:00
debug-evaluate-with.js [tests] Fix assertFalse(exception) anti-pattern 2018-03-21 10:59:46 +00:00
debug-evaluate.js [tests] Fix assertFalse(exception) anti-pattern 2018-03-21 10:59:46 +00:00
debug-event-listener.js [debug-wrapper] Add caught/uncaught to exception pauses 2016-11-10 09:05:29 +00:00
debug-exceptions.js [debug-wrapper] Add caught/uncaught to exception pauses 2016-11-10 09:05:29 +00:00
debug-function-scopes.js [debug-wrapper] Migrate more tests 2016-11-22 12:44:18 +00:00
debug-generator-break-on-stack.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-generator-break.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-liveedit-1.js [debug] migrate all liveedit tests to use LiveEdit::PatchScript 2018-06-21 15:34:16 +00:00
debug-liveedit-2.js [debug] migrate all liveedit tests to use LiveEdit::PatchScript 2018-06-21 15:34:16 +00:00
debug-liveedit-3.js [debug] migrate all liveedit tests to use LiveEdit::PatchScript 2018-06-21 15:34:16 +00:00
debug-liveedit-4.js [debug] migrate all liveedit tests to use LiveEdit::PatchScript 2018-06-21 15:34:16 +00:00
debug-liveedit-arrow-function-at-start.js [liveedit] Fix patching functions with start position zero 2018-07-18 16:20:22 +00:00
debug-liveedit-check-stack.js [debug] migrate all liveedit tests to use LiveEdit::PatchScript 2018-06-21 15:34:16 +00:00
debug-liveedit-compile-error.js [debug] migrate all liveedit tests to use LiveEdit::PatchScript 2018-06-21 15:34:16 +00:00
debug-liveedit-double-call.js [debug] retire ScriptWrapper 2018-07-05 21:33:03 +00:00
debug-liveedit-exceptions.js [debug] migrate all liveedit tests to use LiveEdit::PatchScript 2018-06-21 15:34:16 +00:00
debug-liveedit-inline.js [debug] migrate all liveedit tests to use LiveEdit::PatchScript 2018-06-21 15:34:16 +00:00
debug-liveedit-literals.js [debug] migrate all liveedit tests to use LiveEdit::PatchScript 2018-06-21 15:34:16 +00:00
debug-liveedit-newsource.js [debug] migrate all liveedit tests to use LiveEdit::PatchScript 2018-06-21 15:34:16 +00:00
debug-liveedit-patch-positions-replace.js [debug] migrate all liveedit tests to use LiveEdit::PatchScript 2018-06-21 15:34:16 +00:00
debug-liveedit-recursion.js [test] Rename debugger test 2018-09-14 11:17:04 +00:00
debug-liveedit-replace-code.js [debug] migrate all liveedit tests to use LiveEdit::PatchScript 2018-06-21 15:34:16 +00:00
debug-liveedit-restart-frame.js [ignition/turbo] Perform liveness analysis on the bytecodes 2016-11-29 12:27:15 +00:00
debug-liveedit-stepin.js Reland "[debug] liveedit in native" 2018-07-03 21:01:57 +00:00
debug-materialized.js [debug-wrapper] Conditional breaks, locals, evaluate, scopes 2016-11-11 12:08:34 +00:00
debug-modules-set-variable-value.js Mark flaky test as --no-opt 2018-07-06 05:18:26 +00:00
debug-multiple-breakpoints.js [debug-wrapper] Migrate more tests 2016-11-22 12:44:18 +00:00
debug-multiple-var-decl.js [inspector] improve return position of explicit return in non-async function 2017-07-14 19:10:13 +00:00
debug-negative-break-points.js [debug-wrapper] Migrate more tests 2016-11-22 12:44:18 +00:00
debug-optimize.js [fullcodegen] Remove --stress-fullcodegen flag. 2017-08-10 09:52:49 +00:00
debug-print.js [elements] Rename FAST elements kinds 2017-06-30 13:31:44 +00:00
debug-receiver.js Fix common misspellings 2017-08-02 09:35:28 +00:00
debug-return-value.js [tests] Fix assertFalse(exception) anti-pattern 2018-03-21 10:59:46 +00:00
debug-scopes-suspended-generators.js [turbofan] Only save live registers on suspend 2018-02-07 18:07:30 +00:00
debug-scopes.js Replace Context::closure with Context::scope_info, allowing closure to die. 2018-05-03 12:34:17 +00:00
debug-set-variable-value.js [debugger] remove debugger statement support from FCG/CS. 2017-02-22 08:45:09 +00:00
debug-stack-check-position.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-step-2.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-step-3.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-step-4.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-step-end-of-script.js Reland "[inspector] fixed location of top level function return" 2018-06-18 21:37:49 +00:00
debug-step-into-json.js [inspector] improve return position of explicit return in non-async function 2017-07-14 19:10:13 +00:00
debug-step-into-valueof.js [inspector] improve return position of explicit return in non-async function 2017-07-14 19:10:13 +00:00
debug-step-microtask.js Reland "[inspector] fixed location of top level function return" 2018-06-18 21:37:49 +00:00
debug-step-stub-callfunction.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-step-turbofan.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-step.js [debugger] correctly annotate scripts with debug id. 2017-03-13 09:13:43 +00:00
debug-stepin-accessor-ic.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-stepin-accessor.js [tests] Async test framework 2017-07-26 17:40:15 +00:00
debug-stepin-builtin-callback-opt.js [inspector] improve return position of explicit return in non-async function 2017-07-14 19:10:13 +00:00
debug-stepin-builtin-callback.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-stepin-builtin.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-stepin-call-function-stub.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-stepin-construct-call.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-stepin-constructor.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-stepin-foreach.js [inspector] improve return position of explicit return in non-async function 2017-07-14 19:10:13 +00:00
debug-stepin-function-call.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-stepin-property-function-call.js [tests] Async test framework 2017-07-26 17:40:15 +00:00
debug-stepnext-do-while.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-stepout-recursive-function.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-stepout-scope-part1.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-stepout-scope-part2.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-stepout-scope-part3.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-stepout-scope-part4.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-stepout-scope-part5.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-stepout-scope-part6.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-stepout-scope-part7.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-stepout-scope-part8.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
debug-stepout-to-builtin.js [debugger] Further stepping support in test wrapper 2016-11-07 12:25:24 +00:00
deserialize-script-id.js [debug] retire ScriptWrapper 2018-07-05 21:33:03 +00:00
for-in-opt.js [debugger] Migrate more debugger tests to inspector 2016-11-08 10:39:08 +00:00
function-source.js [debug-wrapper] clearAllBreakPoints and several scripts functions 2016-11-17 09:34:18 +00:00
regress-3225.js Make non-Module generators only context allocate parameters. 2017-05-24 13:54:57 +00:00
regress-5207.js [ignition/turbo] Perform liveness analysis on the bytecodes 2016-11-29 12:27:15 +00:00