Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: fa403f3bda25d07f4d04c6a44c7edb36c647aa04
https://github.com/WebKit/WebKit/commit/fa403f3bda25d07f4d04c6a44c7edb36c647aa04
Author: Yusuke Suzuki <[email protected]>
Date: 2026-03-02 (Mon, 02 Mar 2026)
Changed paths:
M Source/JavaScriptCore/API/JSAPIGlobalObject.cpp
M Source/JavaScriptCore/API/JSAPIGlobalObject.mm
M Source/JavaScriptCore/CMakeLists.txt
M Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
M Source/JavaScriptCore/Sources.txt
M Source/JavaScriptCore/dfg/DFGOperations.cpp
M Source/JavaScriptCore/jsc.cpp
A Source/JavaScriptCore/runtime/CrossTaskToken.cpp
A Source/JavaScriptCore/runtime/CrossTaskToken.h
M Source/JavaScriptCore/runtime/GlobalObjectMethodTable.h
M Source/JavaScriptCore/runtime/JSGlobalObject.cpp
M Source/JavaScriptCore/runtime/JSGlobalObject.h
M Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp
M Source/JavaScriptCore/runtime/JSMicrotask.cpp
M Source/JavaScriptCore/runtime/JSMicrotask.h
M Source/JavaScriptCore/runtime/JSMicrotaskDispatcher.h
M Source/JavaScriptCore/runtime/JSModuleLoader.cpp
M Source/JavaScriptCore/runtime/JSPromise.cpp
M Source/JavaScriptCore/runtime/JSPromise.h
M Source/JavaScriptCore/runtime/JSPromiseConstructor.cpp
M Source/JavaScriptCore/runtime/MicrotaskQueue.cpp
M Source/JavaScriptCore/runtime/MicrotaskQueue.h
M Source/JavaScriptCore/runtime/MicrotaskQueueInlines.h
M Source/JavaScriptCore/runtime/PinballCompletion.cpp
M Source/JavaScriptCore/runtime/ShadowRealmPrototype.cpp
M Source/JavaScriptCore/runtime/VM.cpp
M Source/JavaScriptCore/runtime/VM.h
M Source/JavaScriptCore/runtime/WaiterListManager.cpp
M Source/JavaScriptCore/runtime/WeakGCMap.h
M Source/JavaScriptCore/runtime/WeakGCSet.h
M Source/JavaScriptCore/wasm/WasmStreamingCompiler.cpp
M Source/JavaScriptCore/wasm/js/JSWebAssembly.cpp
M Source/JavaScriptCore/wasm/js/WebAssemblyPromising.cpp
M Source/JavaScriptCore/wasm/js/WebAssemblySuspending.cpp
M Source/WebCore/Modules/streams/ReadableStreamToSharedBufferSink.cpp
M Source/WebCore/Modules/streams/StreamTeeUtilities.cpp
M Source/WebCore/SaferCPPExpectations/UncheckedCallArgsCheckerExpectations
M Source/WebCore/animation/AnimationTimelinesController.cpp
M Source/WebCore/animation/KeyframeEffect.cpp
M Source/WebCore/animation/WebAnimation.cpp
M Source/WebCore/bindings/js/JSCustomElementInterface.cpp
M Source/WebCore/bindings/js/JSDOMAsyncIterator.h
M Source/WebCore/bindings/js/JSDOMGlobalObject.cpp
M Source/WebCore/bindings/js/JSDOMPromiseDeferred.cpp
M Source/WebCore/bindings/js/JSDOMWindowBase.cpp
M Source/WebCore/bindings/js/JSDOMWindowBase.h
M Source/WebCore/bindings/js/JSDOMWindowCustom.cpp
M Source/WebCore/bindings/js/JSExecState.cpp
M Source/WebCore/bindings/js/JSExecState.h
M Source/WebCore/bindings/js/JSShadowRealmGlobalScopeBase.cpp
M Source/WebCore/bindings/js/JSShadowRealmGlobalScopeBase.h
M Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.cpp
M Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.h
M Source/WebCore/bindings/js/JSWorkerGlobalScopeCustom.cpp
M Source/WebCore/bindings/js/JSWorkletGlobalScopeBase.cpp
M Source/WebCore/bindings/js/JSWorkletGlobalScopeBase.h
M Source/WebCore/bindings/js/ScriptController.cpp
M Source/WebCore/dom/Document.cpp
M Source/WebCore/dom/DocumentStorageAccess.cpp
M Source/WebCore/dom/EmptyScriptExecutionContext.h
M Source/WebCore/dom/EventLoop.cpp
M Source/WebCore/dom/EventLoop.h
M Source/WebCore/dom/Microtasks.cpp
M Source/WebCore/dom/Microtasks.h
M Source/WebCore/dom/ScriptExecutionContext.cpp
M Source/WebCore/dom/ScriptExecutionContext.h
M Source/WebCore/dom/ScriptExecutionContextInlines.h
M Source/WebCore/dom/UserGestureIndicator.cpp
M Source/WebCore/dom/UserGestureIndicator.h
M Source/WebCore/dom/WindowEventLoop.cpp
M Source/WebCore/dom/WindowEventLoop.h
M Source/WebCore/html/canvas/EXTDisjointTimerQuery.cpp
M Source/WebCore/html/canvas/EXTDisjointTimerQueryWebGL2.cpp
M Source/WebCore/html/canvas/WebGL2RenderingContext.cpp
M Source/WebCore/html/parser/HTMLDocumentParser.cpp
M Source/WebCore/html/parser/HTMLScriptRunner.cpp
M Source/WebCore/inspector/agents/InspectorCanvasAgent.cpp
M Source/WebCore/page/Navigation.cpp
M Source/WebCore/testing/Internals.cpp
M Source/WebCore/workers/WorkerEventLoop.cpp
M Source/WebCore/workers/WorkerEventLoop.h
M Source/WebCore/workers/WorkerOrWorkletGlobalScope.cpp
M Source/WebCore/workers/WorkerOrWorkletScriptController.cpp
M Source/WebCore/workers/service/ExtendableEvent.cpp
M Source/WebCore/xml/parser/XMLDocumentParserLibxml2.cpp
Log Message:
-----------
[JSC] Move MicrotaskQueue enqueue code from WebCore to JSC
https://bugs.webkit.org/show_bug.cgi?id=308735
rdar://171259688
Reviewed by Yijia Huang.
This patch finally moves MicrotaskQueue implementation completely from
WebCore to JSC, to accelerate its performance by removing
crossing-boundary between WebCore and JSC.
1. Ref<MicrotaskQueue> is held by JSGlobalObject, and WebCore sets its
custom MicrotaskQueue to its JSGlobalObject (e.g. JSDOMWindow etc.).
It has scheduleToRunIfNeeded virtual function which allows JSC to
request scheduling request for MicrotaskQueue draining.
2. MicrotaskQueue::performMicrotaskCheckpoint takes JSGlobalObject
switching lambda, and moving all of draining code into JSC so we do
not need to cross WebCore <-> JSC function for each task invocation.
So, JSC::runMicrotask is no longer exposed to WebCore.
3. JSC::VM holds RefPtr<CrossTaskToken> which is carried between
multiple tasks. And derived class UserGestureToken is implemented in
WebCore and setting it to JSC::VM. So JSC side can just do Microtask
queueing work completely without going to WebCore side.
4. Use reportUncaughtExceptionAtEventLoop so that we can move exception
reporting to JSC side.
5. Remove queueMicrotaskToEventLoop hook.
* Source/JavaScriptCore/API/JSAPIGlobalObject.cpp:
(JSC::JSAPIGlobalObject::globalObjectMethodTable):
* Source/JavaScriptCore/API/JSAPIGlobalObject.mm:
(JSC::JSAPIGlobalObject::globalObjectMethodTable):
(JSC::JSAPIGlobalObject::moduleLoaderFetch):
(JSC::JSAPIGlobalObject::loadAndEvaluateJSScriptModule):
* Source/JavaScriptCore/CMakeLists.txt:
* Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj:
* Source/JavaScriptCore/Sources.txt:
* Source/JavaScriptCore/dfg/DFGOperations.cpp:
(JSC::DFG::JSC_DEFINE_JIT_OPERATION):
* Source/JavaScriptCore/jsc.cpp:
(GlobalObject::moduleLoaderFetch):
* Source/JavaScriptCore/runtime/CrossTaskToken.cpp: Added.
(JSC::CrossTaskToken::createMicrotaskDispatcher):
* Source/JavaScriptCore/runtime/CrossTaskToken.h: Copied from
Source/JavaScriptCore/runtime/JSMicrotaskDispatcher.h.
(JSC::CrossTaskToken::shouldPropagateToMicroTask const):
(JSC::CrossTaskToken::setShouldPropagateToMicroTask):
(JSC::CrossTaskToken::resetShouldPropagateToMicroTask):
* Source/JavaScriptCore/runtime/GlobalObjectMethodTable.h:
* Source/JavaScriptCore/runtime/JSGlobalObject.cpp:
(JSC::JSGlobalObject::baseGlobalObjectMethodTable):
(JSC::JSC_DEFINE_HOST_FUNCTION):
(JSC::JSGlobalObject::JSGlobalObject):
(JSC::JSGlobalObject::queueMicrotaskToEventLoop):
(JSC::JSGlobalObject::queueMicrotask):
(JSC::JSGlobalObject::setMicrotaskQueue):
(JSC::JSGlobalObject::reportUncaughtExceptionAtEventLoop):
* Source/JavaScriptCore/runtime/JSGlobalObject.h:
(JSC::JSGlobalObject::microtaskQueue const):
* Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp:
(JSC::JSC_DEFINE_HOST_FUNCTION):
* Source/JavaScriptCore/runtime/JSMicrotask.cpp:
(JSC::asyncFromSyncIteratorContinueOrDone):
(JSC::promiseRaceResolveJob):
(JSC::promiseAllResolveJob):
(JSC::promiseAllSettledResolveJob):
(JSC::promiseAnyResolveJob):
(JSC::asyncGeneratorResolve):
(JSC::asyncGeneratorBodyCall):
(JSC::asyncGeneratorResumeNext):
(JSC::promiseFinallyAwaitJob):
(JSC::runInternalMicrotask):
* Source/JavaScriptCore/runtime/JSMicrotask.h:
* Source/JavaScriptCore/runtime/JSMicrotaskDispatcher.h:
* Source/JavaScriptCore/runtime/JSModuleLoader.cpp:
(JSC::JSC_DEFINE_HOST_FUNCTION):
* Source/JavaScriptCore/runtime/JSPromise.cpp:
(JSC::JSPromise::resolve):
(JSC::JSPromise::performPromiseThen):
(JSC::JSPromise::performPromiseThenWithInternalMicrotask):
(JSC::JSPromise::resolvePromise):
(JSC::JSC_DEFINE_HOST_FUNCTION):
(JSC::JSPromise::triggerPromiseReactions):
(JSC::JSPromise::resolveWithInternalMicrotaskForAsyncAwait):
(JSC::JSPromise::resolveWithInternalMicrotask):
(JSC::JSPromise::rejectWithInternalMicrotask):
(JSC::JSPromise::fulfillWithInternalMicrotask):
(JSC::JSPromise::promiseResolve):
* Source/JavaScriptCore/runtime/JSPromise.h:
* Source/JavaScriptCore/runtime/JSPromiseConstructor.cpp:
(JSC::JSC_DEFINE_HOST_FUNCTION):
* Source/JavaScriptCore/runtime/MicrotaskQueue.cpp:
(JSC::runMicrotask):
(JSC::runMicrotaskWithDebugger):
(JSC::DebuggableMicrotaskDispatcher::run):
(JSC::MicrotaskQueue::create):
(JSC::MicrotaskQueue::enqueueSlow):
(JSC::MicrotaskQueue::drain):
* Source/JavaScriptCore/runtime/MicrotaskQueue.h:
(JSC::MicrotaskDispatcher::isWebCoreMicrotaskDispatcher const):
(JSC::MarkedMicrotaskDeque::front const):
(JSC::MicrotaskQueue::isScheduledToRun const):
(JSC::MicrotaskQueue::setIsScheduledToRun):
(JSC::MicrotaskQueue::scheduleToRunIfNeeded):
* Source/JavaScriptCore/runtime/MicrotaskQueueInlines.h:
(JSC::MicrotaskQueue::enqueue):
(JSC::MicrotaskQueue::performMicrotaskCheckpoint):
* Source/JavaScriptCore/runtime/PinballCompletion.cpp:
(JSC::pinballHandlerFulfillFunctionContinue):
(JSC::pinballHandlerFinishReject):
* Source/JavaScriptCore/runtime/ShadowRealmPrototype.cpp:
(JSC::JSC_DEFINE_HOST_FUNCTION):
* Source/JavaScriptCore/runtime/VM.cpp:
(JSC::VM::VM):
(JSC::VM::setCrossTaskToken):
(JSC::VM::drainMicrotasks):
(JSC::VM::queueMicrotask): Deleted.
* Source/JavaScriptCore/runtime/VM.h:
(JSC::VM::crossTaskToken const):
(JSC::VM::defaultMicrotaskQueue):
(JSC::VM::drainMicrotaskDelayScope):
* Source/JavaScriptCore/runtime/WaiterListManager.cpp:
(JSC::WaiterListManager::notifyWaiterImpl):
* Source/JavaScriptCore/runtime/WeakGCMap.h:
* Source/JavaScriptCore/runtime/WeakGCSet.h:
* Source/JavaScriptCore/wasm/WasmStreamingCompiler.cpp:
(JSC::Wasm::StreamingCompiler::didComplete):
* Source/JavaScriptCore/wasm/js/JSWebAssembly.cpp:
(JSC::JSWebAssembly::webAssemblyModuleValidateAsync):
(JSC::instantiate):
* Source/JavaScriptCore/wasm/js/WebAssemblyPromising.cpp:
(JSC::JSC_DEFINE_HOST_FUNCTION):
* Source/JavaScriptCore/wasm/js/WebAssemblySuspending.cpp:
(JSC::runWebAssemblySuspendingFunction):
* Source/WebCore/Modules/streams/ReadableStreamToSharedBufferSink.cpp:
(WebCore::ReadableStreamToSharedBufferSink::enqueue):
* Source/WebCore/Modules/streams/StreamTeeUtilities.cpp:
* Source/WebCore/SaferCPPExpectations/UncheckedCallArgsCheckerExpectations:
* Source/WebCore/animation/AnimationTimelinesController.cpp:
(WebCore::AnimationTimelinesController::updateAnimationsAndSendEvents):
* Source/WebCore/animation/KeyframeEffect.cpp:
(WebCore::KeyframeEffect::wasRemovedFromEffectStack):
* Source/WebCore/animation/WebAnimation.cpp:
(WebCore::WebAnimation::cancel):
(WebCore::WebAnimation::resetPendingTasks):
(WebCore::WebAnimation::updateFinishedState):
* Source/WebCore/bindings/js/JSCustomElementInterface.cpp:
(WebCore::constructCustomElementSynchronously):
* Source/WebCore/bindings/js/JSDOMAsyncIterator.h:
(WebCore::IteratorTraits>::runNextSteps):
(WebCore::IteratorTraits>::runReturnSteps):
* Source/WebCore/bindings/js/JSDOMGlobalObject.cpp:
(WebCore::JSDOMGlobalObject::deriveShadowRealmGlobalObject):
* Source/WebCore/bindings/js/JSDOMPromiseDeferred.cpp:
(WebCore::DeferredPromise::callFunction):
* Source/WebCore/bindings/js/JSDOMWindowBase.cpp:
(WebCore::JSDOMWindowBase::globalObjectMethodTable):
(): Deleted.
(WebCore::JSDOMWindowBase::queueMicrotaskToEventLoop): Deleted.
* Source/WebCore/bindings/js/JSDOMWindowBase.h:
* Source/WebCore/bindings/js/JSDOMWindowCustom.cpp:
(WebCore::JSDOMWindow::queueMicrotask):
* Source/WebCore/bindings/js/JSExecState.cpp:
(WebCore::JSExecState::didLeaveScriptContext):
(WebCore::JSExecState::runTask): Deleted.
(WebCore::JSExecState::runTaskWithDebugger): Deleted.
* Source/WebCore/bindings/js/JSExecState.h:
(WebCore::JSExecState::JSExecState):
* Source/WebCore/bindings/js/JSShadowRealmGlobalScopeBase.cpp:
(WebCore::JSShadowRealmGlobalScopeBase::globalObjectMethodTable):
(WebCore::JSShadowRealmGlobalScopeBase::queueMicrotaskToEventLoop):
* Source/WebCore/bindings/js/JSShadowRealmGlobalScopeBase.h:
* Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.cpp:
(WebCore::JSWorkerGlobalScopeBase::globalObjectMethodTable):
(WebCore::JSWorkerGlobalScopeBase::queueMicrotaskToEventLoop): Deleted.
* Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.h:
* Source/WebCore/bindings/js/JSWorkerGlobalScopeCustom.cpp:
(WebCore::JSWorkerGlobalScope::queueMicrotask):
* Source/WebCore/bindings/js/JSWorkletGlobalScopeBase.cpp:
(WebCore::JSWorkletGlobalScopeBase::globalObjectMethodTable):
(WebCore::JSWorkletGlobalScopeBase::queueMicrotaskToEventLoop): Deleted.
* Source/WebCore/bindings/js/JSWorkletGlobalScopeBase.h:
* Source/WebCore/bindings/js/ScriptController.cpp:
(WebCore::ScriptController::initScriptForWindowProxy):
(WebCore::ScriptController::updateDocument):
* Source/WebCore/dom/Document.cpp:
(WebCore::Document::commonTeardown):
(WebCore::Document::considerSpeculationRules):
(WebCore::Document::finishedParsing):
(WebCore::Document::reveal):
* Source/WebCore/dom/DocumentStorageAccess.cpp:
(WebCore::DocumentStorageAccess::requestStorageAccess):
(WebCore::DocumentStorageAccess::requestStorageAccessQuirk):
* Source/WebCore/dom/EmptyScriptExecutionContext.h:
* Source/WebCore/dom/EventLoop.cpp:
(WebCore::EventLoop::queueMicrotask):
(WebCore::EventLoop::performMicrotaskCheckpoint):
(WebCore::EventLoop::scheduleToRunIfNeeded):
(WebCore::EventLoop::run):
(WebCore::EventLoopTaskGroup::stopAndDiscardAllTasks):
(WebCore::EventLoopTaskGroup::queueMicrotask):
(WebCore::EventLoopTaskGroup::performMicrotaskCheckpoint):
(WebCore::EventLoopTaskGroup::runAtEndOfMicrotaskCheckpoint):
(WebCore::EventLoopTaskGroup::jsMicrotaskDispatcherForDebugger): Deleted.
* Source/WebCore/dom/EventLoop.h:
* Source/WebCore/dom/Microtasks.cpp:
(WebCore::MicrotaskQueue::create):
(WebCore::MicrotaskQueue::MicrotaskQueue):
(WebCore::MicrotaskQueue::performMicrotaskCheckpoint):
(WebCore::MicrotaskQueue::scheduleToRunIfNeeded):
(WebCore::MicrotaskQueue::append): Deleted.
(WebCore::MicrotaskQueue::runJSMicrotaskWithDebugger): Deleted.
(WebCore::MicrotaskQueue::runJSMicrotask): Deleted.
(WebCore::MicrotaskQueue::hasMicrotasksForFullyActiveDocument const): Deleted.
* Source/WebCore/dom/Microtasks.h:
* Source/WebCore/dom/ScriptExecutionContext.cpp:
(WebCore::ScriptExecutionContext::addMicrotaskGlobalObject):
(WebCore::ScriptExecutionContext::clearMicrotaskGlobalObjects):
(WebCore::ScriptExecutionContext::suspendActiveDOMObjects):
(WebCore::ScriptExecutionContext::resumeActiveDOMObjects):
(WebCore::ScriptExecutionContext::setMicrotaskGlobalObject): Deleted.
(WebCore::ScriptExecutionContext::microtaskGlobalObject const): Deleted.
(WebCore::ScriptExecutionContext::clearMicrotaskGlobalObject): Deleted.
* Source/WebCore/dom/ScriptExecutionContext.h:
* Source/WebCore/dom/ScriptExecutionContextInlines.h:
(WebCore::ScriptExecutionContext::forEachMicrotaskGlobalObject):
* Source/WebCore/dom/UserGestureIndicator.cpp:
(WebCore::currentToken):
(WebCore::setCurrentToken):
(WebCore::UserGestureToken::createMicrotaskDispatcher):
(WebCore::UserGestureIndicator::UserGestureIndicator):
(WebCore::UserGestureIndicator::~UserGestureIndicator):
(WebCore::UserGestureIndicator::currentUserGesture):
(WebCore::UserGestureIndicator::processingUserGesture):
(WebCore::UserGestureIndicator::processingUserGestureForMedia):
(WebCore::UserGestureIndicator::authorizationToken const):
(WebCore::UserGestureIndicator::currentUserGestureForMainThread): Deleted.
* Source/WebCore/dom/UserGestureIndicator.h:
(WebCore::UserGestureToken::setShouldPropagateToMicroTask):
(WebCore::UserGestureToken::resetShouldPropagateToMicroTask): Deleted.
(WebCore::UserGestureToken::shouldPropagateToMicroTask const): Deleted.
* Source/WebCore/dom/WindowEventLoop.cpp:
(WebCore::WindowEventLoop::microtaskQueue):
(WebCore::WindowEventLoop::shouldEndIdlePeriod):
(WebCore::WindowEventLoop::didReachTimeToRun):
(WebCore::WindowEventLoop::queueMutationObserverCompoundMicrotask):
(WebCore::WindowEventLoop::backupElementQueue):
* Source/WebCore/dom/WindowEventLoop.h:
* Source/WebCore/html/canvas/EXTDisjointTimerQuery.cpp:
(WebCore::EXTDisjointTimerQuery::endQueryEXT):
(WebCore::EXTDisjointTimerQuery::queryCounterEXT):
* Source/WebCore/html/canvas/EXTDisjointTimerQueryWebGL2.cpp:
(WebCore::EXTDisjointTimerQueryWebGL2::queryCounterEXT):
* Source/WebCore/html/canvas/WebGL2RenderingContext.cpp:
(WebCore::WebGL2RenderingContext::endQuery):
* Source/WebCore/html/parser/HTMLDocumentParser.cpp:
(WebCore::HTMLDocumentParser::runScriptsForPausedTreeBuilder):
* Source/WebCore/html/parser/HTMLScriptRunner.cpp:
(WebCore::HTMLScriptRunner::executePendingScriptAndDispatchEvent):
(WebCore::HTMLScriptRunner::runScript):
* Source/WebCore/inspector/agents/InspectorCanvasAgent.cpp:
(WebCore::InspectorCanvasAgent::recordAction):
* Source/WebCore/page/Navigation.cpp:
(WebCore::waitForAllPromises):
* Source/WebCore/testing/Internals.cpp:
(WebCore::Internals::queueMicroTask):
(WebCore::Internals::queueTaskToQueueMicrotask):
* Source/WebCore/workers/WorkerEventLoop.cpp:
(WebCore::WorkerEventLoop::scheduleToRun):
(WebCore::WorkerEventLoop::microtaskQueue):
* Source/WebCore/workers/WorkerEventLoop.h:
* Source/WebCore/workers/WorkerOrWorkletGlobalScope.cpp:
(WebCore::WorkerOrWorkletGlobalScope::prepareForDestruction):
* Source/WebCore/workers/WorkerOrWorkletScriptController.cpp:
(WebCore::WorkerOrWorkletScriptController::loadModuleSynchronously):
(WebCore::WorkerOrWorkletScriptController::loadAndEvaluateModule):
(WebCore::WorkerOrWorkletScriptController::initScriptWithSubclass):
* Source/WebCore/workers/service/ExtendableEvent.cpp:
(WebCore::ExtendableEvent::addExtendLifetimePromise):
* Source/WebCore/xml/parser/XMLDocumentParserLibxml2.cpp:
(WebCore::XMLDocumentParser::startElementNs):
(WebCore::XMLDocumentParser::endElementNs):
Canonical link: https://commits.webkit.org/308483@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications