Skip to content

Commit 2e796df

Browse files
verwaestCommit Bot
authored and
Commit Bot
committed
[async] Fix async stack traces for errors created after Promise.reject
Also capture async stack traces if we're in a reject handler. Fixes node issue nodejs/node#30822 Change-Id: I703012ddb88b5b5d17baba843a969b398ef99fa1 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1969897 Auto-Submit: Toon Verwaest <[email protected]> Reviewed-by: Benedikt Meurer <[email protected]> Commit-Queue: Toon Verwaest <[email protected]> Cr-Commit-Position: refs/heads/master@{#65687}
1 parent 0f0329c commit 2e796df

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

src/execution/isolate.cc

+5-1
Original file line numberDiff line numberDiff line change
@@ -1011,7 +1011,11 @@ Handle<Object> CaptureStackTrace(Isolate* isolate, Handle<Object> caller,
10111011
IsBuiltinFunction(isolate, promise_reaction_job_task->handler(),
10121012
Builtins::kAsyncGeneratorAwaitResolveClosure) ||
10131013
IsBuiltinFunction(isolate, promise_reaction_job_task->handler(),
1014-
Builtins::kAsyncGeneratorYieldResolveClosure)) {
1014+
Builtins::kAsyncGeneratorYieldResolveClosure) ||
1015+
IsBuiltinFunction(isolate, promise_reaction_job_task->handler(),
1016+
Builtins::kAsyncFunctionAwaitRejectClosure) ||
1017+
IsBuiltinFunction(isolate, promise_reaction_job_task->handler(),
1018+
Builtins::kAsyncGeneratorAwaitRejectClosure)) {
10151019
// Now peak into the handlers' AwaitContext to get to
10161020
// the JSGeneratorObject for the async function.
10171021
Handle<Context> context(

test/mjsunit/async-stack-traces.js

+37
Original file line numberDiff line numberDiff line change
@@ -317,3 +317,40 @@
317317
await test(one);
318318
})());
319319
})();
320+
321+
// Basic test for reject.
322+
(function() {
323+
async function one(x) {
324+
await two(x);
325+
}
326+
327+
async function two(x) {
328+
try {
329+
await Promise.reject(new Error());
330+
assertUnreachable();
331+
} catch (e) {
332+
throw new Error();
333+
}
334+
}
335+
336+
async function test(f) {
337+
try {
338+
await f(1);
339+
assertUnreachable();
340+
} catch (e) {
341+
assertInstanceof(e, Error);
342+
assertMatches(/Error.+at two.+at async one.+at async test/ms, e.stack);
343+
}
344+
}
345+
346+
assertPromiseResult((async () => {
347+
%PrepareFunctionForOptimization(one);
348+
%PrepareFunctionForOptimization(two);
349+
await test(one);
350+
await test(one);
351+
%OptimizeFunctionOnNextCall(two);
352+
await test(one);
353+
%OptimizeFunctionOnNextCall(one);
354+
await test(one);
355+
})());
356+
})();

0 commit comments

Comments
 (0)