mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-05 23:38:38 +09:00
Issue #1691 - Part 6d: Optimize handling of internally-created Promise objects. https://bugzilla.mozilla.org/show_bug.cgi?id=1358879 The patch uses a different test: PROMISE_FLAG_DEFAULT_REJECT_FUNCTION which doesn't exist in our codebase. It was added in this bug, which appears to be partly complete: https://bugzilla.mozilla.org/show_bug.cgi?id=1313049
(cherry picked from commit 97fc74b693813eaaa9ab833d9c51fc5868ff039f)
This commit is contained in:
parent
9a19e9d165
commit
c3daecc218
4 changed files with 19 additions and 27 deletions
|
|
@ -227,15 +227,6 @@ Promise::Then(JSContext* aCx,
|
|||
aRetval.setObject(*retval);
|
||||
}
|
||||
|
||||
// We need a dummy function to pass to JS::NewPromiseObject.
|
||||
static bool
|
||||
DoNothingPromiseExecutor(JSContext*, unsigned aArgc, JS::Value* aVp)
|
||||
{
|
||||
JS::CallArgs args = CallArgsFromVp(aArgc, aVp);
|
||||
args.rval().setUndefined();
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
Promise::CreateWrapper(JS::Handle<JSObject*> aDesiredProto, ErrorResult& aRv)
|
||||
{
|
||||
|
|
@ -246,17 +237,7 @@ Promise::CreateWrapper(JS::Handle<JSObject*> aDesiredProto, ErrorResult& aRv)
|
|||
}
|
||||
JSContext* cx = jsapi.cx();
|
||||
|
||||
JSFunction* doNothingFunc =
|
||||
JS_NewFunction(cx, DoNothingPromiseExecutor, /* nargs = */ 2,
|
||||
/* flags = */ 0, nullptr);
|
||||
if (!doNothingFunc) {
|
||||
JS_ClearPendingException(cx);
|
||||
aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
|
||||
return;
|
||||
}
|
||||
|
||||
JS::Rooted<JSObject*> doNothingObj(cx, JS_GetFunctionObject(doNothingFunc));
|
||||
mPromiseObj = JS::NewPromiseObject(cx, doNothingObj, aDesiredProto);
|
||||
mPromiseObj = JS::NewPromiseObject(cx, nullptr, aDesiredProto);
|
||||
if (!mPromiseObj) {
|
||||
JS_ClearPendingException(cx);
|
||||
aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
|
||||
|
|
|
|||
|
|
@ -2478,8 +2478,11 @@ RunResolutionFunction(JSContext *cx, HandleObject resolutionFun, HandleValue res
|
|||
{
|
||||
// The absence of a resolve/reject function can mean that, as an
|
||||
// optimization, those weren't created. In that case, a flag is set on
|
||||
// the Promise object. There are also reactions where the Promise
|
||||
// itself is missing. For those, there's nothing left to do here.
|
||||
// the Promise object. (It's also possible to not have a resolution
|
||||
// function without that flag being set. This can occur if a Promise
|
||||
// subclass constructor passes null/undefined to `super()`.)
|
||||
// There are also reactions where the Promise itself is missing. For
|
||||
// those, there's nothing left to do here.
|
||||
assertSameCompartment(cx, resolutionFun);
|
||||
assertSameCompartment(cx, result);
|
||||
assertSameCompartment(cx, promiseObj);
|
||||
|
|
@ -4826,7 +4829,7 @@ PromiseObject::reject(JSContext* cx, Handle<PromiseObject*> promise, HandleValue
|
|||
return true;
|
||||
|
||||
if (PromiseHasAnyFlag(*promise, PROMISE_FLAG_DEFAULT_RESOLVING_FUNCTIONS))
|
||||
return RejectMaybeWrappedPromise(cx, promise, rejectionValue);
|
||||
return ResolvePromise(cx, promise, rejectionValue, JS::PromiseState::Rejected);
|
||||
|
||||
RootedValue funVal(cx, promise->getFixedSlot(PromiseSlot_RejectFunction));
|
||||
MOZ_ASSERT(IsCallable(funVal));
|
||||
|
|
|
|||
|
|
@ -4902,11 +4902,14 @@ JS_PUBLIC_API(JSObject*)
|
|||
JS::NewPromiseObject(JSContext* cx, HandleObject executor, HandleObject proto /* = nullptr */)
|
||||
{
|
||||
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment()));
|
||||
MOZ_ASSERT(IsCallable(executor));
|
||||
AssertHeapIsIdle(cx);
|
||||
CHECK_REQUEST(cx);
|
||||
assertSameCompartment(cx, executor, proto);
|
||||
|
||||
if (!executor)
|
||||
return PromiseObject::createSkippingExecutor(cx);
|
||||
|
||||
MOZ_ASSERT(IsCallable(executor));
|
||||
return PromiseObject::create(cx, executor, proto);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4536,9 +4536,14 @@ SetPromiseRejectionTrackerCallback(JSContext* cx, JSPromiseRejectionTrackerCallb
|
|||
|
||||
/**
|
||||
* Returns a new instance of the Promise builtin class in the current
|
||||
* compartment, with the right slot layout. If a `proto` is passed, that gets
|
||||
* set as the instance's [[Prototype]] instead of the original value of
|
||||
* `Promise.prototype`.
|
||||
* compartment, with the right slot layout.
|
||||
*
|
||||
* The `executor` can be a `nullptr`. In that case, the only way to resolve or
|
||||
* reject the returned promise is via the `JS::ResolvePromise` and
|
||||
* `JS::RejectPromise` JSAPI functions.
|
||||
*
|
||||
* If a `proto` is passed, that gets set as the instance's [[Prototype]]
|
||||
* instead of the original value of `Promise.prototype`.
|
||||
*/
|
||||
extern JS_PUBLIC_API(JSObject*)
|
||||
NewPromiseObject(JSContext* cx, JS::HandleObject executor, JS::HandleObject proto = nullptr);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue