93043d6482
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}
40 lines
1.2 KiB
JavaScript
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));
|