Skip to content

Commit 0ee636b

Browse files
committed
Fix reporting handled promises as unhandled in tracker
Enqueue a job which will perform the check after all reactions. Fixes: #39
1 parent 09d76ed commit 0ee636b

File tree

1 file changed

+34
-12
lines changed

1 file changed

+34
-12
lines changed

quickjs.c

+34-12
Original file line numberDiff line numberDiff line change
@@ -50210,6 +50210,32 @@ static JSValue promise_reaction_job(JSContext *ctx, int argc,
5021050210
return res2;
5021150211
}
5021250212

50213+
static JSValue promise_rejection_tracker_job(JSContext *ctx, int argc,
50214+
JSValueConst *argv)
50215+
{
50216+
JSRuntime *rt;
50217+
JSPromiseData *s;
50218+
JSValueConst promise;
50219+
50220+
assert(argc == 1);
50221+
50222+
rt = ctx->rt;
50223+
promise = argv[0];
50224+
s = JS_GetOpaque(promise, JS_CLASS_PROMISE);
50225+
50226+
if (!s || s->promise_state != JS_PROMISE_REJECTED)
50227+
return JS_UNDEFINED; /* should never happen */
50228+
50229+
promise_trace(ctx, "promise_rejection_tracker_job\n");
50230+
50231+
// Check again in case the hook was removed.
50232+
if (rt->host_promise_rejection_tracker)
50233+
rt->host_promise_rejection_tracker(
50234+
ctx, promise, s->promise_result, s->is_handled, rt->host_promise_rejection_tracker_opaque);
50235+
50236+
return JS_UNDEFINED;
50237+
}
50238+
5021350239
void JS_SetPromiseHook(JSRuntime *rt, JSPromiseHook promise_hook, void *opaque)
5021450240
{
5021550241
rt->promise_hook = promise_hook;
@@ -50247,14 +50273,6 @@ static void fulfill_or_reject_promise(JSContext *ctx, JSValueConst promise,
5024750273
}
5024850274
}
5024950275

50250-
if (s->promise_state == JS_PROMISE_REJECTED && !s->is_handled) {
50251-
JSRuntime *rt = ctx->rt;
50252-
if (rt->host_promise_rejection_tracker) {
50253-
rt->host_promise_rejection_tracker(ctx, promise, value, false,
50254-
rt->host_promise_rejection_tracker_opaque);
50255-
}
50256-
}
50257-
5025850276
list_for_each_safe(el, el1, &s->promise_reactions[is_reject]) {
5025950277
rd = list_entry(el, JSPromiseReactionData, link);
5026050278
args[0] = rd->resolving_funcs[0];
@@ -50272,6 +50290,12 @@ static void fulfill_or_reject_promise(JSContext *ctx, JSValueConst promise,
5027250290
list_del(&rd->link);
5027350291
promise_reaction_data_free(ctx->rt, rd);
5027450292
}
50293+
50294+
if (s->promise_state == JS_PROMISE_REJECTED && !s->is_handled) {
50295+
JSRuntime *rt = ctx->rt;
50296+
if (rt->host_promise_rejection_tracker)
50297+
JS_EnqueueJob(ctx, promise_rejection_tracker_job, 1, &promise);
50298+
}
5027550299
}
5027650300

5027750301
static JSValue js_promise_resolve_thenable_job(JSContext *ctx,
@@ -51018,10 +51042,8 @@ static __exception int perform_promise_then(JSContext *ctx,
5101851042
JSValueConst args[5];
5101951043
if (s->promise_state == JS_PROMISE_REJECTED && !s->is_handled) {
5102051044
JSRuntime *rt = ctx->rt;
51021-
if (rt->host_promise_rejection_tracker) {
51022-
rt->host_promise_rejection_tracker(ctx, promise, s->promise_result,
51023-
true, rt->host_promise_rejection_tracker_opaque);
51024-
}
51045+
if (rt->host_promise_rejection_tracker)
51046+
JS_EnqueueJob(ctx, promise_rejection_tracker_job, 1, &promise);
5102551047
}
5102651048
i = s->promise_state - JS_PROMISE_FULFILLED;
5102751049
rd = rd_array[i];

0 commit comments

Comments
 (0)