326d4f436d
Add a mechanic to set these Builtin exception predictions per-Isolate rather than per-Context in the Bootstrapper. Also add Debugger tests which would fail without these prediction modes set. Does not yet test for AsyncFromSyncIteratorPrototypeReturn, as this requires AsyncGenerators and `yield*` to be hit. BUG=chromium:691875 R=yangguo@chromium.org, jgruber@chromium.org, gsathya@chromium.org Change-Id: Ic2d2aba3870cce2f7321080f4278875edf253c76 Reviewed-on: https://chromium-review.googlesource.com/451967 Reviewed-by: Sathya Gunasekaran <gsathya@chromium.org> Reviewed-by: Jakob Gruber <jgruber@chromium.org> Commit-Queue: Caitlin Potter <caitp@igalia.com> Cr-Commit-Position: refs/heads/master@{#43742}
165 lines
3.3 KiB
JavaScript
165 lines
3.3 KiB
JavaScript
// Copyright 2016 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.
|
|
|
|
// Flags: --harmony-async-iteration
|
|
|
|
InspectorTest.log('Checks that async chains for for-await-of are correct.');
|
|
|
|
InspectorTest.addScript(`
|
|
|
|
function Debugger(value) {
|
|
debugger;
|
|
}
|
|
|
|
function Reject(reason) {
|
|
var reject;
|
|
var promise = new Promise(function(resolvefn, rejectfn) {
|
|
reject = rejectfn;
|
|
});
|
|
setTimeout(reject.bind(undefined, reason), 0);
|
|
return promise;
|
|
}
|
|
|
|
function Throw(reason) {
|
|
return {
|
|
get then() { throw reason; }
|
|
};
|
|
}
|
|
|
|
function ThrowOnReturn(items) {
|
|
var it = items[Symbol.iterator]();
|
|
return {
|
|
[Symbol.iterator]() { return this; },
|
|
next(v) { return it.next(v); },
|
|
return(v) { throw new Error("boop"); }
|
|
};
|
|
}
|
|
|
|
function RejectOnReturn(items) {
|
|
var it = items[Symbol.iterator]();
|
|
return {
|
|
[Symbol.iterator]() { return this; },
|
|
next(v) { return it.next(v); },
|
|
return(v) { return Reject(new Error("boop")); }
|
|
};
|
|
}
|
|
|
|
async function Basic() {
|
|
for await (let x of ["a"]) {
|
|
Debugger();
|
|
}
|
|
}
|
|
|
|
async function UncaughtReject() {
|
|
async function loop() {
|
|
for await (let x of [Reject(new Error("boop"))]) {
|
|
Debugger();
|
|
}
|
|
}
|
|
return loop().catch(Debugger);
|
|
}
|
|
|
|
async function UncaughtThrow() {
|
|
async function loop() {
|
|
for await (let x of [Throw(new Error("boop"))]) {
|
|
Debugger();
|
|
}
|
|
}
|
|
return loop().catch(Debugger);
|
|
}
|
|
|
|
async function CaughtReject() {
|
|
try {
|
|
for await (let x of [Reject(new Error("boop"))]) {
|
|
Debugger(x);
|
|
}
|
|
} catch (e) {
|
|
Debugger(e);
|
|
}
|
|
}
|
|
|
|
async function CaughtThrow() {
|
|
try {
|
|
for await (let x of [Throw(new Error("boop"))]) {
|
|
Debugger(x);
|
|
}
|
|
} catch (e) {
|
|
Debugger(e);
|
|
}
|
|
}
|
|
|
|
async function UncaughtRejectOnBreak() {
|
|
async function loop() {
|
|
for await (let x of RejectOnReturn(["0", "1"])) {
|
|
break;
|
|
}
|
|
}
|
|
return loop().catch(Debugger);
|
|
}
|
|
|
|
async function UncaughtThrowOnBreak() {
|
|
async function loop() {
|
|
for await (let x of ThrowOnReturn(["0", "1"])) {
|
|
break;
|
|
}
|
|
}
|
|
return loop().catch(Debugger);
|
|
}
|
|
|
|
async function CaughtRejectOnBreak() {
|
|
try {
|
|
for await (let x of RejectOnReturn(["0", "1"])) {
|
|
break;
|
|
}
|
|
} catch (e) {
|
|
Debugger(e);
|
|
}
|
|
}
|
|
|
|
async function CaughtThrowOnBreak() {
|
|
try {
|
|
for await (let x of ThrowOnReturn(["0", "1"])) {
|
|
break;
|
|
}
|
|
} catch (e) {
|
|
Debugger(e);
|
|
}
|
|
}
|
|
//# sourceURL=test.js`, 7, 129);
|
|
|
|
InspectorTest.setupScriptMap();
|
|
Protocol.Debugger.onPaused(message => {
|
|
InspectorTest.logCallFrames(message.params.callFrames);
|
|
InspectorTest.logAsyncStackTrace(message.params.asyncStackTrace);
|
|
InspectorTest.log('');
|
|
Protocol.Debugger.resume();
|
|
});
|
|
|
|
Protocol.Debugger.enable();
|
|
Protocol.Debugger.setAsyncCallStackDepth({ maxDepth: 128 });
|
|
var testList = [
|
|
'Basic',
|
|
'UncaughtReject',
|
|
'UncaughtThrow',
|
|
'CaughtReject',
|
|
'CaughtThrow',
|
|
'UncaughtRejectOnBreak',
|
|
'UncaughtThrowOnBreak',
|
|
'CaughtRejectOnBreak',
|
|
'CaughtThrowOnBreak',
|
|
]
|
|
InspectorTest.runTestSuite(testList.map(name => {
|
|
return eval(`
|
|
(function test${capitalize(name)}(next) {
|
|
Protocol.Runtime.evaluate({ expression: \`${name}()
|
|
//# sourceURL=test${capitalize(name)}.js\`, awaitPromise: true})
|
|
.then(next);
|
|
})
|
|
`);
|
|
}));
|
|
|
|
function capitalize(string) {
|
|
return string.charAt(0).toUpperCase() + string.slice(1);
|
|
}
|