v8/test/debugger/debug/debug-evaluate-repl-mode-await.js

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

47 lines
1.6 KiB
JavaScript
Raw Normal View History

Reland "Implement top-level await for REPL mode" This is a reland of 5bddc0e1429dd5885462c26a5082097766776d37 The original CL was speculatively reverted as it was suspected to cause failures on the non-determinism bot. This was ultimately confirmed to not be the case, so this CL is safe to reland as-is. Original change's description: > Implement top-level await for REPL mode > > Design doc: bit.ly/v8-repl-mode > > This CL allows the usage of 'await' without wrapping code in an async > function when using REPL mode in global evaluate. REPL mode evaluate > is changed to *always* return a Promise. The resolve value of the > promise is the completion value of the REPL script. > > The implementation is based on two existing mechanisms: > - Similar to async functions, the content of a REPL script is > enclosed in a synthetic 'try' block. Any thrown error > is used to reject the Promise of the REPL script. > > - The content of the synthetic 'try' block is also re-written the > same way a normal script is. This is, artificial assignments to > a ".result" variable are inserted to simulate a completion > value. The difference for REPL scripts is, that ".result" is > used to resolve the Promise of the REPL script. > > - ".result" is not returned directly but wrapped in an object > literal: "{ .repl_result: .result}". This is done to prevent > resolved promises from being chained and resolved prematurely: > > > Promse.resolve(42); > > should evaluate to a promise, not 42. > > Bug: chromium:1021921 > Change-Id: I00a5aafd9126ca7c97d09cd8787a3aec2821a67f > Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1900464 > Reviewed-by: Yang Guo <yangguo@chromium.org> > Reviewed-by: Leszek Swirski <leszeks@chromium.org> > Reviewed-by: Toon Verwaest <verwaest@chromium.org> > Commit-Queue: Simon Zünd <szuend@chromium.org> > Cr-Commit-Position: refs/heads/master@{#65273} TBR: yangguo@chromium.org,verwaest@chromium.org Bug: chromium:1021921 Change-Id: I95c5dc17593161009a533188f91b4cd67234c32f Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1954388 Reviewed-by: Simon Zünd <szuend@chromium.org> Reviewed-by: Yang Guo <yangguo@chromium.org> Commit-Queue: Simon Zünd <szuend@chromium.org> Cr-Commit-Position: refs/heads/master@{#65360}
2019-11-25 09:33:49 +00:00
// Copyright 2019 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
Debug = debug.Debug
const evaluate = Debug.evaluateGlobalREPL;
(async () => {
// Test that the completion value of the REPL script is the resolve value of the
// promise returned by evalute.
let result = evaluate('5;');
assertPromiseResult(result, (value) => {
assertEquals(5, value);
}, assertUnreachable);
// Test that top-level await in REPL mode works.
result = evaluate('let x = await Promise.resolve(42);');
assertPromiseResult(result, (value) => {
assertEquals(undefined, value);
assertEquals(42, x);
}, assertUnreachable);
// Test that a throwing REPL script results in a rejected promise.
result = evaluate('throw new Error("ba dum tsh");');
assertPromiseResult(result, assertUnreachable, (error) => {
assertEquals("ba dum tsh", error.message);
});
// Test that a rejected promise throws.
result = evaluate('await Promise.reject("Reject promise!");');
assertPromiseResult(result, assertUnreachable, (error) => {
assertEquals('Reject promise!', error);
});
// Test that we can bind a promise in REPL mode.
await evaluate('let y = Promise.resolve(21);');
assertPromiseResult(y, (value) => {
assertEquals(21, value);
}, assertUnreachable);
})().then(() => {
print("Async test completed successfully.");
}).catch(e => {
print(e.stack);
%AbortJS("Async test is failing");
});