Skip to content

Commit

Permalink
[JSC] optimize Promise.withResolvers to avoid unnecessary object co…
Browse files Browse the repository at this point in the history
…nstruction

https://bugs.webkit.org/show_bug.cgi?id=259175

Reviewed by Yusuke Suzuki.

Rework `newPromiseCapability` (and `newPromiseCapabilitySlow`) to return an object containing `promise`/`resolve`/`reject` instead of `@promise`/`@resolve`/`@reject` so that `Promise.withResolvers` can directly use it instead of transforming it into another object.

As a result, update all the other callsites that use `@promise`/`@resolve`/`@reject` to use `promise`/`resolve`/`reject` as well.

* Source/JavaScriptCore/builtins/ModuleLoader.js:
(fulfillFetch):
* Source/JavaScriptCore/builtins/PromiseConstructor.js:
(promiseAllSlow):
(promiseNewOnRejected):
(allSettled):
(any):
(race):
(withResolvers):
* Source/JavaScriptCore/builtins/PromiseOperations.js:
(newPromiseCapabilitySlow):
(newPromiseCapability):
(promiseResolveSlow):
(promiseRejectSlow):
(createResolvingFunctions):
(createResolvingFunctionsWithoutPromise):
(promiseReactionJob):
(promiseResolveThenableJob):
(promiseResolveThenableJobWithDerivedPromise):
* Source/JavaScriptCore/builtins/PromisePrototype.js:
(then):
* Source/JavaScriptCore/runtime/JSPromise.cpp:
(JSC::JSPromise::convertCapabilityToDeferredData):
* Source/WebCore/Modules/streams/ReadableStreamBYOBReader.js:
(closed):
* Source/WebCore/Modules/streams/ReadableStreamDefaultReader.js:
(closed):
* Source/WebCore/Modules/streams/ReadableStreamInternals.js:
(readableStreamReaderGenericInitialize):
(readableStreamPipeTo):
(readableStreamPipeToWritableStream):
(pipeToErrorsMustBePropagatedForward):
(pipeToErrorsMustBePropagatedBackward):
(pipeToClosingMustBePropagatedForward):
(pipeToShutdownWithAction):
(pipeToShutdown):
(pipeToFinalize):
(readableStreamTee):
(pullAlgorithm):
(readableStreamTeePullFunction):
(readableStreamTeeBranch1CancelFunction):
(readableStreamTeeBranch2CancelFunction):
(readableStreamError):
(readableStreamClose):
(readableStreamReaderGenericRelease):
* Source/WebCore/Modules/streams/TransformStreamInternals.js:
(createInternalTransformStreamFromTransformer):
(createTransformStream):
(transformStreamSetBackpressure):
(transformStreamDefaultControllerPerformTransform):
(transformStreamDefaultSinkWriteAlgorithm):
(transformStreamDefaultSinkCloseAlgorithm):
(transformStreamDefaultSourcePullAlgorithm):
* Source/WebCore/Modules/streams/WritableStreamDefaultWriter.js:
(closed):
(ready):
* Source/WebCore/Modules/streams/WritableStreamInternals.js:
(setUpWritableStreamDefaultWriter):
(writableStreamAbort):
(writableStreamClose):
(writableStreamAddWriteRequest):
(writableStreamFinishErroring):
(writableStreamFinishInFlightWrite):
(writableStreamFinishInFlightWriteWithError):
(writableStreamRejectCloseAndClosedPromiseIfNeeded):
(writableStreamUpdateBackpressure):
(writableStreamDefaultWriterEnsureClosedPromiseRejected):
(writableStreamDefaultWriterEnsureReadyPromiseRejected):

Canonical link: https://commits.webkit.org/266036@main
  • Loading branch information
dcrousso committed Jul 13, 2023
1 parent 41d744b commit 0aebf75
Show file tree
Hide file tree
Showing 11 changed files with 148 additions and 154 deletions.
2 changes: 1 addition & 1 deletion Source/JavaScriptCore/builtins/ModuleLoader.js
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ function fulfillFetch(entry, source)
"use strict";

if (!entry.fetch)
entry.fetch = @newPromiseCapability(@InternalPromise).@promise;
entry.fetch = @newPromiseCapability(@InternalPromise).promise;
@forceFulfillPromise(entry.fetch, source);
@setStateToMax(entry, @ModuleInstantiate);
}
Expand Down
42 changes: 18 additions & 24 deletions Source/JavaScriptCore/builtins/PromiseConstructor.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ function promiseAllSlow(iterable)

--remainingElementsCount;
if (remainingElementsCount === 0)
return promiseCapability.@resolve.@call(@undefined, values);
return promiseCapability.resolve.@call(@undefined, values);

return @undefined;
};
Expand All @@ -65,18 +65,18 @@ function promiseAllSlow(iterable)
var nextPromise = promiseResolve.@call(this, value);
var resolveElement = newResolveElement(index);
++remainingElementsCount;
nextPromise.then(resolveElement, promiseCapability.@reject);
nextPromise.then(resolveElement, promiseCapability.reject);
++index;
}

--remainingElementsCount;
if (remainingElementsCount === 0)
promiseCapability.@resolve.@call(@undefined, values);
promiseCapability.resolve.@call(@undefined, values);
} catch (error) {
promiseCapability.@reject.@call(@undefined, error);
promiseCapability.reject.@call(@undefined, error);
}

return promiseCapability.@promise;
return promiseCapability.promise;
}

@linkTimeConstant
Expand Down Expand Up @@ -212,7 +212,7 @@ function allSettled(iterable)

--remainingElementsCount;
if (remainingElementsCount === 0)
return promiseCapability.@resolve.@call(@undefined, values);
return promiseCapability.resolve.@call(@undefined, values);

return @undefined;
},
Expand All @@ -231,7 +231,7 @@ function allSettled(iterable)

--remainingElementsCount;
if (remainingElementsCount === 0)
return promiseCapability.@resolve.@call(@undefined, values);
return promiseCapability.resolve.@call(@undefined, values);

return @undefined;
}
Expand All @@ -254,12 +254,12 @@ function allSettled(iterable)

--remainingElementsCount;
if (remainingElementsCount === 0)
promiseCapability.@resolve.@call(@undefined, values);
promiseCapability.resolve.@call(@undefined, values);
} catch (error) {
promiseCapability.@reject.@call(@undefined, error);
promiseCapability.reject.@call(@undefined, error);
}

return promiseCapability.@promise;
return promiseCapability.promise;
}

function any(iterable)
Expand Down Expand Up @@ -287,7 +287,7 @@ function any(iterable)

--remainingElementsCount;
if (remainingElementsCount === 0)
return promiseCapability.@reject.@call(@undefined, new @AggregateError(errors));
return promiseCapability.reject.@call(@undefined, new @AggregateError(errors));

return @undefined;
};
Expand All @@ -303,18 +303,18 @@ function any(iterable)
var nextPromise = promiseResolve.@call(this, value);
var rejectElement = newRejectElement(index);
++remainingElementsCount;
nextPromise.then(promiseCapability.@resolve, rejectElement);
nextPromise.then(promiseCapability.resolve, rejectElement);
++index;
}

--remainingElementsCount;
if (remainingElementsCount === 0)
throw new @AggregateError(errors);
} catch (error) {
promiseCapability.@reject.@call(@undefined, error);
promiseCapability.reject.@call(@undefined, error);
}

return promiseCapability.@promise;
return promiseCapability.promise;
}

function race(iterable)
Expand All @@ -333,13 +333,13 @@ function race(iterable)

for (var value of iterable) {
var nextPromise = promiseResolve.@call(this, value);
nextPromise.then(promiseCapability.@resolve, promiseCapability.@reject);
nextPromise.then(promiseCapability.resolve, promiseCapability.reject);
}
} catch (error) {
promiseCapability.@reject.@call(@undefined, error);
promiseCapability.reject.@call(@undefined, error);
}

return promiseCapability.@promise;
return promiseCapability.promise;
}

function reject(reason)
Expand Down Expand Up @@ -372,13 +372,7 @@ function withResolvers()
{
"use strict";

var promiseCapability = @newPromiseCapability(this);

return {
promise: promiseCapability.@promise,
resolve: promiseCapability.@resolve,
reject: promiseCapability.@reject,
};
return @newPromiseCapability(this);
}

@nakedConstructor
Expand Down
48 changes: 24 additions & 24 deletions Source/JavaScriptCore/builtins/PromiseOperations.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,28 +57,28 @@ function newPromiseCapabilitySlow(constructor)
"use strict";

var promiseCapability = {
@resolve: @undefined,
@reject: @undefined,
@promise: @undefined,
resolve: @undefined,
reject: @undefined,
promise: @undefined,
};

var promise = new constructor((resolve, reject) => {
if (promiseCapability.@resolve !== @undefined)
if (promiseCapability.resolve !== @undefined)
@throwTypeError("resolve function is already set");
if (promiseCapability.@reject !== @undefined)
if (promiseCapability.reject !== @undefined)
@throwTypeError("reject function is already set");

promiseCapability.@resolve = resolve;
promiseCapability.@reject = reject;
promiseCapability.resolve = resolve;
promiseCapability.reject = reject;
});

if (!@isCallable(promiseCapability.@resolve))
if (!@isCallable(promiseCapability.resolve))
@throwTypeError("executor did not take a resolve function");

if (!@isCallable(promiseCapability.@reject))
if (!@isCallable(promiseCapability.reject))
@throwTypeError("executor did not take a reject function");

promiseCapability.@promise = promise;
promiseCapability.promise = promise;

return promiseCapability;
}
Expand All @@ -97,7 +97,7 @@ function newPromiseCapability(constructor)
function @reject(reason) {
return @rejectPromiseWithFirstResolvingFunctionCallCheck(capturedPromise, reason);
}
return { @resolve, @reject, @promise: promise };
return { resolve: @resolve, reject: @reject, promise };
}

return @newPromiseCapabilitySlow(constructor);
Expand Down Expand Up @@ -127,8 +127,8 @@ function promiseResolveSlow(constructor, value)

@assert(constructor !== @Promise);
var promiseCapability = @newPromiseCapabilitySlow(constructor);
promiseCapability.@resolve.@call(@undefined, value);
return promiseCapability.@promise;
promiseCapability.resolve.@call(@undefined, value);
return promiseCapability.promise;
}

@linkTimeConstant
Expand All @@ -138,8 +138,8 @@ function promiseRejectSlow(constructor, reason)

@assert(constructor !== @Promise);
var promiseCapability = @newPromiseCapabilitySlow(constructor);
promiseCapability.@reject.@call(@undefined, reason);
return promiseCapability.@promise;
promiseCapability.reject.@call(@undefined, reason);
return promiseCapability.promise;
}

@linkTimeConstant
Expand Down Expand Up @@ -304,7 +304,7 @@ function createResolvingFunctions(promise)
return @rejectPromise(promise, reason);
});

return { @resolve: resolve, @reject: reject };
return { resolve, reject };
}

@linkTimeConstant
Expand Down Expand Up @@ -413,7 +413,7 @@ function createResolvingFunctionsWithoutPromise(onFulfilled, onRejected, context
@rejectWithoutPromise(reason, onFulfilled, onRejected, context);
});

return { @resolve: resolve, @reject: reject };
return { resolve, reject };
}

@linkTimeConstant
Expand Down Expand Up @@ -458,15 +458,15 @@ function promiseReactionJob(promiseOrCapability, handler, argument, contextOrSta
@rejectPromise(promiseOrCapability, error);
return;
}
promiseOrCapability.@reject.@call(@undefined, error);
promiseOrCapability.reject.@call(@undefined, error);
return;
}

if (@isPromise(promiseOrCapability)) {
@resolvePromise(promiseOrCapability, result);
return;
}
promiseOrCapability.@resolve.@call(@undefined, result);
promiseOrCapability.resolve.@call(@undefined, result);
}

@linkTimeConstant
Expand Down Expand Up @@ -535,9 +535,9 @@ function promiseResolveThenableJob(thenable, then, resolvingFunctions)
"use strict";

try {
return then.@call(thenable, resolvingFunctions.@resolve, resolvingFunctions.@reject);
return then.@call(thenable, resolvingFunctions.resolve, resolvingFunctions.reject);
} catch (error) {
return resolvingFunctions.@reject.@call(@undefined, error);
return resolvingFunctions.reject.@call(@undefined, error);
}
}

Expand All @@ -548,10 +548,10 @@ function promiseResolveThenableJobWithDerivedPromise(thenable, constructor, reso

try {
var promiseOrCapability = @newPromiseCapabilitySlow(constructor);
@performPromiseThen(thenable, resolvingFunctions.@resolve, resolvingFunctions.@reject, promiseOrCapability, @undefined);
return promiseOrCapability.@promise;
@performPromiseThen(thenable, resolvingFunctions.resolve, resolvingFunctions.reject, promiseOrCapability, @undefined);
return promiseOrCapability.promise;
} catch (error) {
return resolvingFunctions.@reject.@call(@undefined, error);
return resolvingFunctions.reject.@call(@undefined, error);
}
}

Expand Down
2 changes: 1 addition & 1 deletion Source/JavaScriptCore/builtins/PromisePrototype.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ function then(onFulfilled, onRejected)
promise = promiseOrCapability;
} else {
promiseOrCapability = @newPromiseCapabilitySlow(constructor);
promise = promiseOrCapability.@promise;
promise = promiseOrCapability.promise;
}

@performPromiseThen(this, onFulfilled, onRejected, promiseOrCapability, @undefined);
Expand Down
6 changes: 3 additions & 3 deletions Source/JavaScriptCore/runtime/JSPromise.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,11 +125,11 @@ JSPromise::DeferredData JSPromise::convertCapabilityToDeferredData(JSGlobalObjec
VM& vm = globalObject->vm();
auto scope = DECLARE_THROW_SCOPE(vm);

result.promise = promiseCapability.getAs<JSPromise*>(globalObject, vm.propertyNames->builtinNames().promisePrivateName());
result.promise = promiseCapability.getAs<JSPromise*>(globalObject, vm.propertyNames->builtinNames().promisePublicName());
RETURN_IF_EXCEPTION(scope, { });
result.resolve = promiseCapability.getAs<JSFunction*>(globalObject, vm.propertyNames->builtinNames().resolvePrivateName());
result.resolve = promiseCapability.getAs<JSFunction*>(globalObject, vm.propertyNames->builtinNames().resolvePublicName());
RETURN_IF_EXCEPTION(scope, { });
result.reject = promiseCapability.getAs<JSFunction*>(globalObject, vm.propertyNames->builtinNames().rejectPrivateName());
result.reject = promiseCapability.getAs<JSFunction*>(globalObject, vm.propertyNames->builtinNames().rejectPublicName());
RETURN_IF_EXCEPTION(scope, { });

return result;
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/Modules/streams/ReadableStreamBYOBReader.js
Original file line number Diff line number Diff line change
Expand Up @@ -104,5 +104,5 @@ function closed()
if (!@isReadableStreamBYOBReader(this))
return @Promise.@reject(@makeGetterTypeError("ReadableStreamBYOBReader", "closed"));

return @getByIdDirectPrivate(this, "closedPromiseCapability").@promise;
return @getByIdDirectPrivate(this, "closedPromiseCapability").promise;
}
Original file line number Diff line number Diff line change
Expand Up @@ -91,5 +91,5 @@ function closed()
if (!@isReadableStreamDefaultReader(this))
return @Promise.@reject(@makeGetterTypeError("ReadableStreamDefaultReader", "closed"));

return @getByIdDirectPrivate(this, "closedPromiseCapability").@promise;
return @getByIdDirectPrivate(this, "closedPromiseCapability").promise;
}
Loading

0 comments on commit 0aebf75

Please sign in to comment.