Skip to content

Commit c3634e2

Browse files
committed
Add more exception checking
1 parent 2220613 commit c3634e2

File tree

2 files changed

+6
-3
lines changed

2 files changed

+6
-3
lines changed

Source/JavaScriptCore/runtime/JSMicrotask.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -409,12 +409,13 @@ void runInternalMicrotask(JSGlobalObject* globalObject, InternalMicrotask task,
409409
if (auto* promise = jsDynamicCast<JSPromise*>(promiseOrCapability)) {
410410
promise->rejectPromise(globalObject, error);
411411
#if USE(BUN_JSC_ADDITIONS)
412-
// Restore async context after promise operation
412+
// Restore async context before exception check (must restore even if exception occurs)
413413
if (hasAsyncContext) {
414414
if (auto* asyncContextData = globalObject->m_asyncContextData.get())
415415
asyncContextData->putInternalField(vm, 0, previousAsyncContext);
416416
}
417417
#endif
418+
RETURN_IF_EXCEPTION(scope, void());
418419
return;
419420
}
420421

@@ -439,12 +440,13 @@ void runInternalMicrotask(JSGlobalObject* globalObject, InternalMicrotask task,
439440
if (auto* promise = jsDynamicCast<JSPromise*>(promiseOrCapability)) {
440441
promise->resolvePromise(globalObject, result);
441442
#if USE(BUN_JSC_ADDITIONS)
442-
// Restore async context after promise operation
443+
// Restore async context before exception check (must restore even if exception occurs)
443444
if (hasAsyncContext) {
444445
if (auto* asyncContextData = globalObject->m_asyncContextData.get())
445446
asyncContextData->putInternalField(vm, 0, previousAsyncContext);
446447
}
447448
#endif
449+
RETURN_IF_EXCEPTION(scope, void());
448450
return;
449451
}
450452

Source/JavaScriptCore/runtime/JSPromise.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,7 @@ void JSPromise::rejectPromise(JSGlobalObject* globalObject, JSValue argument)
424424
void JSPromise::fulfillPromise(JSGlobalObject* globalObject, JSValue argument)
425425
{
426426
VM& vm = globalObject->vm();
427+
auto scope = DECLARE_THROW_SCOPE(vm);
427428

428429
ASSERT(status() == Status::Pending);
429430
uint32_t flags = this->flags();
@@ -432,7 +433,7 @@ void JSPromise::fulfillPromise(JSGlobalObject* globalObject, JSValue argument)
432433
internalField(Field::ReactionsOrResult).set(vm, this, argument);
433434
if (!reactions)
434435
return;
435-
triggerPromiseReactions(globalObject, Status::Fulfilled, reactions, argument);
436+
RELEASE_AND_RETURN(scope, triggerPromiseReactions(globalObject, Status::Fulfilled, reactions, argument));
436437
}
437438

438439
void JSPromise::resolvePromise(JSGlobalObject* globalObject, JSValue resolution)

0 commit comments

Comments
 (0)