v8/test/inspector/debugger/async-for-await-of-promise-stack.js
kozyatinskiy fe0d5c7ca8 Revert of [inspector] use creation stack trace as parent for async call chains (patchset #2 id:20001 of https://codereview.chromium.org/2868493002/ )
Reason for revert:
CHECK is too strict.

Original issue's description:
> [inspector] use creation stack trace as parent for async call chains
>
> Creation stack trace points to the place where callback was actually chained, scheduled points where parent promise was resolved.
> For async tasks without creation stack (e.g. setTimeout) we continue to use scheduled as creation since usually they are the same.
>
> BUG=v8:6189
> R=dgozman@chromium.org
>
> Review-Url: https://codereview.chromium.org/2868493002
> Cr-Commit-Position: refs/heads/master@{#45198}
> Committed: e118462f18

TBR=dgozman@chromium.org,alexclarke@chromium.org
# Not skipping CQ checks because original CL landed more than 1 days ago.
BUG=v8:6189

Review-Url: https://codereview.chromium.org/2868423004
Cr-Commit-Position: refs/heads/master@{#45242}
2017-05-10 21:24:37 +00:00

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);
}