v8/test/mjsunit/async-stack-traces-prepare-stacktrace-4.js
Benedikt Meurer 93043d6482 [async] Add CallSite#getPromiseIndex() builtin.
In order for Error.prepareStackTrace() to be able to reconstruct the
same stack frame that the internal mechanism can, we need to also
expose the index for the Promise.all() builtin. The newly added
CallSite#getPromiseIndex() does exactly that.

Bug: v8:7522
Change-Id: I904a4c1005f539536a71926ea1da38b31e2a2e8a
Reviewed-on: https://chromium-review.googlesource.com/c/1304293
Reviewed-by: Yang Guo <yangguo@chromium.org>
Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#57055}
2018-10-29 08:47:59 +00:00

40 lines
1.2 KiB
JavaScript

// Copyright 2018 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: --async-stack-traces
// Check that Error.prepareStackTrace properly exposes async
// stack frames and special Promise.all() stack frames.
Error.prepareStackTrace = (e, frames) => {
assertEquals(two, frames[0].getFunction());
assertEquals(two.name, frames[0].getFunctionName());
assertEquals(null, frames[0].getPromiseIndex());
assertFalse(frames[0].isAsync());
assertEquals(Promise.all, frames[1].getFunction());
assertEquals(0, frames[1].getPromiseIndex());
assertTrue(frames[1].isAsync());
assertTrue(frames[1].isPromiseAll());
assertEquals(one, frames[2].getFunction());
assertEquals(one.name, frames[2].getFunctionName());
assertEquals(null, frames[2].getPromiseIndex());
assertTrue(frames[2].isAsync());
assertFalse(frames[2].isPromiseAll());
return frames;
};
async function one(x) {
return await Promise.all([two(x)]);
}
async function two(x) {
try {
x = await x;
throw new Error();
} catch (e) {
return e.stack;
}
}
one(1).catch(e => setTimeout(_ => {throw e}, 0));