Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 177aa8b796d47768ec1b52ffc37bf92e6659b596
https://github.com/WebKit/WebKit/commit/177aa8b796d47768ec1b52ffc37bf92e6659b596
Author: Keith Miller <[email protected]>
Date: 2026-06-11 (Thu, 11 Jun 2026)
Changed paths:
M Source/JavaScriptCore/CMakeLists.txt
M Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
A Source/JavaScriptCore/runtime/CloneBase.h
A Source/JavaScriptCore/runtime/CloneDeserializerBase.h
A Source/JavaScriptCore/runtime/CloneSerializerBase.h
A Source/JavaScriptCore/runtime/StructuredCloneTags.h
M Source/WebCore/bindings/js/SerializedScriptValue.cpp
M Source/WebCore/bindings/js/SerializedScriptValue.h
Log Message:
-----------
Move JSC's non-cell primitive structured cloning into Source/JavaScriptCore
https://bugs.webkit.org/show_bug.cgi?id=316699
rdar://179152880
Reviewed by Yusuke Suzuki.
Today every byte of structured-clone code lives in WebCore's
SerializedScriptValue.cpp, even though the wire format encodes
many JSC-implemented types (Array, Object, Map, Set, Date,
RegExp, ArrayBuffer, ...). This is the first patch of a series
that moves JSC-type serialization into JSC. Later patches will
move the walker, collections, the ArrayBuffer family, and so on.
This patch introduces three new JSC headers:
- StructuredCloneTags.h owns the full SerializationTag
enum, the version constants, and the shared
SerializationReturnCode. WebCore-only tags keep their names but
are now defined in JSC so the wire format and the version-retry
path stay coherent in one place.
- CloneBase.h promotes the existing pure-JSC CloneBase out of
WebCore. It also hosts the SERIALIZE_TRACE macro and the
verboseCloneTrace flag used by both sides.
- CloneSerializerBase.h and CloneDeserializerBase.h are CRTP
templates constrained by C++20 concepts
(StructuredCloneSerializerHandler /
StructuredCloneDeserializerHandler). They handle immediate-value
tags inline (Undefined, Null, Int, Zero, One, False, True,
Double) and dispatch every remaining tag through the Derived
hooks dumpDerivedTerminal / readDerivedTerminal.
WebCore's CloneSerializer / CloneDeserializer now derive from
these bases. dumpIfTerminal and the immediate-value branch of
readTerminal move into JSC. Everything else (DOM tags, the
walker, transfer state, version-upgrade retry orchestration)
stays in WebCore for this patch. The wire format is
byte-identical to the previous version.
No new tests, no behavior change. Covered by existing tests.
* Source/JavaScriptCore/CMakeLists.txt:
* Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj:
* Source/JavaScriptCore/runtime/CloneBase.h: Added.
(JSC::CloneBase::CloneBase):
(JSC::CloneBase::fail):
(JSC::CloneBase::objectPoolTags const):
(JSC::CloneBase::appendObjectPoolTag):
(JSC::CloneBase::isSafeToRecurse):
* Source/JavaScriptCore/runtime/CloneDeserializerBase.h: Added.
(JSC::requires):
(JSC::StructuredCloneInternal::readLittleEndian):
(JSC::CloneDeserializerBase::CloneDeserializerBase):
(JSC::CloneDeserializerBase::readLittleEndian):
(JSC::CloneDeserializerBase::read):
(JSC::CloneDeserializerBase::readTag):
(JSC::CloneDeserializerBase::readTerminalImpl):
(JSC::CloneDeserializerBase::readTerminal):
* Source/JavaScriptCore/runtime/CloneSerializerBase.h: Added.
(JSC::requires):
(JSC::StructuredCloneInternal::writeLittleEndian):
(JSC::StructuredCloneInternal::writeLittleEndian<uint8_t>):
(JSC::CloneSerializerBase::CloneSerializerBase):
(JSC::CloneSerializerBase::write):
(JSC::CloneSerializerBase::dumpIfTerminal):
* Source/JavaScriptCore/runtime/StructuredCloneTags.h: Added.
(JSC::majorVersionFor):
(JSC::minorVersionFor):
(JSC::makeVersion):
(JSC::currentVersion):
(JSC::canBeAddedToObjectPool):
(JSC::name):
(WTF::printInternal):
* Source/WebCore/bindings/js/SerializedScriptValue.cpp:
(WebCore::CloneSerializer::serialize):
(WebCore::CloneSerializer::CloneSerializer):
(WebCore::CloneSerializer::dumpDerivedTerminal):
(WebCore::CloneSerializer::write):
(WebCore::CloneDeserializer::deserializeString):
(WebCore::CloneDeserializer::readString):
(WebCore::CloneDeserializer::isTagExposed const):
(WebCore::CloneDeserializer::readDerivedTerminal):
(WebCore::name): Deleted.
(WTF::printInternal): Deleted.
(WebCore::canBeAddedToObjectPool): Deleted.
(WebCore::majorVersionFor): Deleted.
(WebCore::minorVersionFor): Deleted.
(WebCore::makeVersion): Deleted.
(WebCore::currentVersion): Deleted.
(WebCore::CloneBase::CloneBase): Deleted.
(WebCore::CloneBase::fail): Deleted.
(WebCore::CloneBase::objectPoolTags const): Deleted.
(WebCore::CloneBase::appendObjectPoolTag): Deleted.
(WebCore::CloneBase::isSafeToRecurse): Deleted.
(WebCore::writeLittleEndian): Deleted.
(WebCore::writeLittleEndian<uint8_t>): Deleted.
(WebCore::CloneSerializer::dumpImmediate): Deleted.
(WebCore::CloneSerializer::dumpIfTerminal): Deleted.
(WebCore::CloneDeserializer::readLittleEndian): Deleted.
(WebCore::CloneDeserializer::readTag): Deleted.
(WebCore::CloneDeserializer::readTerminal): Deleted.
* Source/WebCore/bindings/js/SerializedScriptValue.h:
Canonical link: https://commits.webkit.org/315074@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications