diff options
author | 2022-11-20 14:33:57 -0800 | |
---|---|---|
committer | 2022-11-20 14:33:57 -0800 | |
commit | 948fdfe48265353f408c616112c79d8dba4b64ea (patch) | |
tree | 624d4fdd1b62808fbdfef805995cf04a3ed77d1c /src/bun.js/bindings/bindings.cpp | |
parent | 757d19c2f756820628d6683c31f70cd9a26d2285 (diff) | |
download | bun-948fdfe48265353f408c616112c79d8dba4b64ea.tar.gz bun-948fdfe48265353f408c616112c79d8dba4b64ea.tar.zst bun-948fdfe48265353f408c616112c79d8dba4b64ea.zip |
Fix spurious rejected promise handler calls
Diffstat (limited to 'src/bun.js/bindings/bindings.cpp')
-rw-r--r-- | src/bun.js/bindings/bindings.cpp | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/src/bun.js/bindings/bindings.cpp b/src/bun.js/bindings/bindings.cpp index f2ce1d201..09c1caf80 100644 --- a/src/bun.js/bindings/bindings.cpp +++ b/src/bun.js/bindings/bindings.cpp @@ -1431,10 +1431,28 @@ JSC__JSPromise* JSC__JSPromise__resolvedPromise(JSC__JSGlobalObject* arg0, JSC__ return promise; } -JSC__JSValue JSC__JSPromise__result(const JSC__JSPromise* arg0, JSC__VM* arg1) +JSC__JSValue JSC__JSPromise__result(JSC__JSPromise* promise, JSC__VM* arg1) { - return JSC::JSValue::encode(arg0->result(reinterpret_cast<JSC::VM&>(arg1))); + auto& vm = *arg1; + + // if the promise is rejected we automatically mark it as handled so it + // doesn't end up in the promise rejection tracker + switch (promise->status(vm)) { + case JSC::JSPromise::Status::Rejected: { + uint32_t flags = promise->internalField(JSC::JSPromise::Field::Flags).get().asUInt32(); + if (!(flags & JSC::JSPromise::isFirstResolvingFunctionCalledFlag)) { + promise->internalField(JSC::JSPromise::Field::Flags).set(vm, promise, jsNumber(flags | JSC::JSPromise::isHandledFlag)); + } + } + // fallthrough intended + case JSC::JSPromise::Status::Fulfilled: { + return JSValue::encode(promise->result(vm)); + } + default: + return JSValue::encode(JSValue {}); + } } + uint32_t JSC__JSPromise__status(const JSC__JSPromise* arg0, JSC__VM* arg1) { switch (arg0->status(reinterpret_cast<JSC::VM&>(arg1))) { |