Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: a0faddd38a6d4f20735b1404c116e79eee972275
      
https://github.com/WebKit/WebKit/commit/a0faddd38a6d4f20735b1404c116e79eee972275
  Author: Yusuke Suzuki <[email protected]>
  Date:   2025-10-13 (Mon, 13 Oct 2025)

  Changed paths:
    A JSTests/stress/dfg-promise-resolve-fulfilled-identity.js
    A JSTests/stress/dfg-promise-resolve-fulfilled-then.js
    A JSTests/stress/dfg-promise-resolve-fulfilled.js
    M Source/JavaScriptCore/builtins/AsyncDisposableStackPrototype.js
    M Source/JavaScriptCore/builtins/BuiltinNames.h
    M Source/JavaScriptCore/builtins/DisposableStackPrototype.js
    M Source/JavaScriptCore/builtins/PromiseConstructor.js
    M Source/JavaScriptCore/builtins/PromiseOperations.js
    M Source/JavaScriptCore/builtins/WebAssembly.js
    M Source/JavaScriptCore/bytecode/LinkTimeConstant.h
    M Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h
    M Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
    M Source/JavaScriptCore/dfg/DFGClobberize.h
    M Source/JavaScriptCore/dfg/DFGConstantFoldingPhase.cpp
    M Source/JavaScriptCore/dfg/DFGDoesGC.cpp
    M Source/JavaScriptCore/dfg/DFGFixupPhase.cpp
    M Source/JavaScriptCore/dfg/DFGGraph.h
    M Source/JavaScriptCore/dfg/DFGJITCode.cpp
    M Source/JavaScriptCore/dfg/DFGJITCode.h
    M Source/JavaScriptCore/dfg/DFGNodeType.h
    M Source/JavaScriptCore/dfg/DFGOperations.cpp
    M Source/JavaScriptCore/dfg/DFGOperations.h
    M Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp
    M Source/JavaScriptCore/dfg/DFGSafeToExecute.h
    M Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
    M Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h
    M Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp
    M Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp
    M Source/JavaScriptCore/ftl/FTLCapabilities.cpp
    M Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp
    M Source/JavaScriptCore/runtime/Intrinsic.h
    M Source/JavaScriptCore/runtime/JSGlobalObject.cpp
    M Source/JavaScriptCore/runtime/JSPromise.cpp
    M Source/JavaScriptCore/runtime/JSPromise.h
    M Source/JavaScriptCore/runtime/JSPromiseConstructor.cpp
    M Source/JavaScriptCore/runtime/JSPromiseConstructor.h
    M Source/WebCore/Modules/compression/CompressionStream.js
    M Source/WebCore/Modules/compression/DecompressionStream.js
    M Source/WebCore/Modules/streams/ReadableStreamDefaultReader.js
    M Source/WebCore/Modules/streams/ReadableStreamInternals.js
    M Source/WebCore/Modules/streams/StreamInternals.js
    M Source/WebCore/Modules/streams/TransformStreamInternals.js
    M Source/WebCore/Modules/streams/WritableStreamDefaultWriter.js
    M Source/WebCore/Modules/streams/WritableStreamInternals.js
    M Source/WebCore/bindings/js/JSDOMPromise.cpp
    M Source/WebCore/bindings/js/JSDOMPromise.h
    M Source/WebCore/bindings/js/JSDOMPromiseDeferred.cpp
    M Source/WebCore/dom/TextDecoderStream.js
    M Source/WebCore/dom/TextEncoderStream.js

  Log Message:
  -----------
  [JSC] Move Promise.resolve and Promise.reject to C++
https://bugs.webkit.org/show_bug.cgi?id=300603
rdar://162500561

Reviewed by Yijia Huang.

This patch moves Promise.resolve / Promise.reject implementations from
JS to C++ to improve stability and performance. Doing so will further
allow us to move more things (e.g. Promise.all) to C++ to gain
significant performance improvement.

The most difficult part of this is Promise.resolve and its optimization.
Since we were using inlined Promise.resolve and avoiding various costly
operations when we detect some input values in DFG / FTL, we cannot just
move them to C++. In this patch, we implement intrinsic for them and add
DFG nodes handling these optimizations.

1. We check Promise input and if it is fine & watchpoint is fine, then
   we will just convert Promise.resolve(promise) to identity.
2. We check non object input and convert it to fulfilled promise
   allocation.
3. We check an object input without having "then" property and convert
   it to (2) as well with watchpoints.

Also, we expose @promiseResolve / @promiseReject abstract operations
and use tme instead of Promise.@resolve / Promise.@reject.

* JSTests/stress/dfg-promise-resolve-fulfilled-identity.js: Added.
(shouldBe):
(test):
(async testMain):
* JSTests/stress/dfg-promise-resolve-fulfilled-then.js: Added.
(shouldBe):
(test):
(DerivedPromise.prototype.then):
(DerivedPromise):
(async testMain):
* JSTests/stress/dfg-promise-resolve-fulfilled.js: Added.
(shouldBe):
(test):
(async testMain):
* Source/JavaScriptCore/builtins/AsyncDisposableStackPrototype.js:
(disposeAsync):
* Source/JavaScriptCore/builtins/BuiltinNames.h:
* Source/JavaScriptCore/builtins/DisposableStackPrototype.js:
(linkTimeConstant.getAsyncDisposableMethod):
* Source/JavaScriptCore/builtins/PromiseConstructor.js:
(linkTimeConstant.promiseNewOnRejected):
(linkTimeConstant.promiseNewOnRejected.return.reject): Deleted.
(reject): Deleted.
(resolve): Deleted.
* Source/JavaScriptCore/builtins/PromiseOperations.js:
(linkTimeConstant.newPromiseCapability):
(linkTimeConstant.newPromiseCapability.resolve): Deleted.
(linkTimeConstant.newPromiseCapability.reject): Deleted.
(linkTimeConstant.promiseResolve): Deleted.
(linkTimeConstant.promiseResolveSlow): Deleted.
(linkTimeConstant.promiseRejectSlow): Deleted.
* Source/JavaScriptCore/builtins/WebAssembly.js:
(compileStreaming):
(instantiateStreaming):
* Source/JavaScriptCore/bytecode/LinkTimeConstant.h:
* Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h:
(JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
* Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp:
(JSC::DFG::ByteCodeParser::handleIntrinsicCall):
* Source/JavaScriptCore/dfg/DFGClobberize.h:
(JSC::DFG::clobberize):
* Source/JavaScriptCore/dfg/DFGConstantFoldingPhase.cpp:
(JSC::DFG::ConstantFoldingPhase::foldConstants):
* Source/JavaScriptCore/dfg/DFGDoesGC.cpp:
(JSC::DFG::doesGC):
* Source/JavaScriptCore/dfg/DFGFixupPhase.cpp:
(JSC::DFG::FixupPhase::fixupNode):
* Source/JavaScriptCore/dfg/DFGGraph.h:
* Source/JavaScriptCore/dfg/DFGJITCode.cpp:
(JSC::DFG::JITData::JITData):
(JSC::DFG::JITData::tryInitialize):
* Source/JavaScriptCore/dfg/DFGJITCode.h:
* Source/JavaScriptCore/dfg/DFGNodeType.h:
* Source/JavaScriptCore/dfg/DFGOperations.cpp:
(JSC::DFG::JSC_DEFINE_JIT_OPERATION):
* Source/JavaScriptCore/dfg/DFGOperations.h:
* Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp:
* Source/JavaScriptCore/dfg/DFGSafeToExecute.h:
(JSC::DFG::safeToExecute):
* Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp:
* Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h:
* Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp:
(JSC::DFG::SpeculativeJIT::compile):
* Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp:
(JSC::DFG::SpeculativeJIT::compile):
* Source/JavaScriptCore/ftl/FTLCapabilities.cpp:
(JSC::FTL::canCompile):
* Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp:
(JSC::FTL::DFG::LowerDFGToB3::compileNode):
(JSC::FTL::DFG::LowerDFGToB3::compileCompareStrictEq):
* Source/JavaScriptCore/runtime/Intrinsic.h:
* Source/JavaScriptCore/runtime/JSGlobalObject.cpp:
(JSC::JSC_DEFINE_HOST_FUNCTION):
(JSC::JSGlobalObject::init):
* Source/JavaScriptCore/runtime/JSPromise.cpp:
(JSC::JSPromise::promiseResolve):
(JSC::JSPromise::promiseReject):
* Source/JavaScriptCore/runtime/JSPromise.h:
* Source/JavaScriptCore/runtime/JSPromiseConstructor.cpp:
(JSC::JSPromiseConstructor::create):
(JSC::JSC_DEFINE_HOST_FUNCTION):
(JSC::JSPromiseConstructor::addOwnInternalSlots): Deleted.
* Source/JavaScriptCore/runtime/JSPromiseConstructor.h:
* Source/WebCore/Modules/compression/CompressionStream.js:
(initializeCompressionStream):
* Source/WebCore/Modules/compression/DecompressionStream.js:
(initializeDecompressionStream):
* Source/WebCore/Modules/streams/ReadableStreamDefaultReader.js:
(cancel):
(read):
(getter.closed):
* Source/WebCore/Modules/streams/ReadableStreamInternals.js:
(readableStreamPipeToForBindings):
(readableStreamDefaultReaderClosedForBindings):
(readableStreamDefaultReaderReadForBindings):
(readableStreamDefaultReaderCancelForBindings):
(readableStreamReaderGenericInitialize):
(readableStreamPipeToWritableStream):
(const.pullAlgorithm):
(readableStreamTeePullFunction):
(readableStreamCancel):
(readableStreamClose):
(readableStreamFulfillReadRequest):
(readableStreamDefaultReaderRead):
(readableStreamDefaultReaderErrorReadRequests):
* Source/WebCore/Modules/streams/StreamInternals.js:
(shieldingPromiseResolve):
(promiseInvokeOrNoopMethodNoCatch):
(promiseInvokeOrNoopMethod):
(promiseInvokeOrNoop):
(promiseInvokeOrFallbackOrNoop):
(createFulfilledPromise):
* Source/WebCore/Modules/streams/TransformStreamInternals.js:
(initializeTransformStream):
(setUpTransformStreamDefaultControllerFromTransformer):
(transformStreamDefaultSinkAbortAlgorithm):
* Source/WebCore/Modules/streams/WritableStreamDefaultWriter.js:
(getter.closed):
(getter.ready):
(abort):
(close):
(write):
* Source/WebCore/Modules/streams/WritableStreamInternals.js:
(writableStreamCloseForBindings):
(writableStreamAbortForBindings):
(writableStreamAbort):
(writableStreamClose):
(writableStreamDefaultWriterCloseWithErrorPropagation):
(writableStreamDefaultWriterWrite):
(setUpWritableStreamDefaultController):
* Source/WebCore/bindings/js/JSDOMPromise.cpp:
(WebCore::DOMPromise::whenPromiseIsSettled):
* Source/WebCore/bindings/js/JSDOMPromise.h:
* Source/WebCore/bindings/js/JSDOMPromiseDeferred.cpp:
(WebCore::createRejectedPromiseWithTypeError):
* Source/WebCore/dom/TextDecoderStream.js:
(initializeTextDecoderStream):
* Source/WebCore/dom/TextEncoderStream.js:
(initializeTextEncoderStream):

Canonical link: https://commits.webkit.org/301423@main



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to