f96f93128c
This is a reland of 5bddc0e142
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}
47 lines
1.6 KiB
JavaScript
47 lines
1.6 KiB
JavaScript
// 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");
|
|
});
|