Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 300fd8c35ee742fef346bb3595ccbb19a2069559
https://github.com/WebKit/WebKit/commit/300fd8c35ee742fef346bb3595ccbb19a2069559
Author: Yusuke Suzuki <[email protected]>
Date: 2026-06-02 (Tue, 02 Jun 2026)
Changed paths:
A JSTests/microbenchmarks/map-iterator-fast-entries.js
A JSTests/microbenchmarks/map-iterator-fast-keys.js
A JSTests/microbenchmarks/map-iterator-fast-values.js
A JSTests/microbenchmarks/set-iterator-fast-entries.js
A JSTests/microbenchmarks/set-iterator-fast-keys.js
A JSTests/microbenchmarks/set-iterator-fast-values.js
A JSTests/stress/map-iterator-fast-cross-realm.js
A JSTests/stress/map-iterator-fast-ftl.js
A
JSTests/stress/map-iterator-fast-iterator-proto-symbol-iterator-overridden.js
A JSTests/stress/map-iterator-fast-keys-values-entries.js
A JSTests/stress/map-iterator-fast-mid-iteration.js
A JSTests/stress/map-iterator-fast-watchpoint-invalidate-next.js
A JSTests/stress/map-iterator-fast-watchpoint-invalidate-symbol-iterator.js
A JSTests/stress/set-iterator-fast-cross-realm.js
A JSTests/stress/set-iterator-fast-ftl.js
A
JSTests/stress/set-iterator-fast-iterator-proto-symbol-iterator-overridden.js
A JSTests/stress/set-iterator-fast-keys-values-entries.js
A JSTests/stress/set-iterator-fast-mid-iteration.js
A JSTests/stress/set-iterator-fast-watchpoint-invalidate-next.js
A JSTests/stress/set-iterator-fast-watchpoint-invalidate-symbol-iterator.js
M Source/JavaScriptCore/CMakeLists.txt
M Source/JavaScriptCore/DerivedSources-input.xcfilelist
M Source/JavaScriptCore/DerivedSources.make
M Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
M
Source/JavaScriptCore/SaferCPPExpectations/NoUncountedMemberCheckerExpectations
M Source/JavaScriptCore/builtins/BuiltinNames.h
R Source/JavaScriptCore/builtins/MapIteratorPrototype.js
R Source/JavaScriptCore/builtins/SetIteratorPrototype.js
M Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.cpp
M Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.h
M Source/JavaScriptCore/bytecode/IterationModeMetadata.h
M Source/JavaScriptCore/bytecode/LinkTimeConstant.h
M Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
M Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
M Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
M Source/JavaScriptCore/jit/JITOperations.cpp
M Source/JavaScriptCore/runtime/CommonSlowPaths.cpp
M Source/JavaScriptCore/runtime/Intrinsic.h
M Source/JavaScriptCore/runtime/IteratorOperations.cpp
M Source/JavaScriptCore/runtime/JSGlobalObject.cpp
M Source/JavaScriptCore/runtime/JSMapIterator.cpp
M Source/JavaScriptCore/runtime/JSMapIterator.h
M Source/JavaScriptCore/runtime/JSSetIterator.cpp
M Source/JavaScriptCore/runtime/JSSetIterator.h
M Source/JavaScriptCore/runtime/MapIteratorPrototype.cpp
M Source/JavaScriptCore/runtime/SetIteratorPrototype.cpp
M Source/JavaScriptCore/runtime/VM.cpp
M Source/JavaScriptCore/runtime/VM.h
Log Message:
-----------
[JSC] MapIterator / SetIterator should be handled in DFG
https://bugs.webkit.org/show_bug.cgi?id=316074
rdar://178497481
Reviewed by Sosuke Suzuki.
314334@main introduced a new mechanism to handle arbitrary builtin
iterators in DFG efficiently. This patch leverages this to support Map
and Set iterators.
1. All Map#entries(), Map#values(), Map#keys(), Set#keys(), Set#values(),
Set#entries() are supported. Modeled in a similar way to array iterators.
2. Now next() functions call in the majority of cases are well handled
in DFG. Thus we move MapIterattor#next() and SetIterator#next from
builtin JS to C++. This also removes many helpers which exists only for
these next() function implementations
Tests: JSTests/microbenchmarks/map-iterator-fast-entries.js
JSTests/microbenchmarks/map-iterator-fast-keys.js
JSTests/microbenchmarks/map-iterator-fast-values.js
JSTests/microbenchmarks/set-iterator-fast-entries.js
JSTests/microbenchmarks/set-iterator-fast-keys.js
JSTests/microbenchmarks/set-iterator-fast-values.js
JSTests/stress/map-iterator-fast-cross-realm.js
JSTests/stress/map-iterator-fast-ftl.js
JSTests/stress/map-iterator-fast-iterator-proto-symbol-iterator-overridden.js
JSTests/stress/map-iterator-fast-keys-values-entries.js
JSTests/stress/map-iterator-fast-mid-iteration.js
JSTests/stress/map-iterator-fast-watchpoint-invalidate-next.js
JSTests/stress/map-iterator-fast-watchpoint-invalidate-symbol-iterator.js
JSTests/stress/set-iterator-fast-cross-realm.js
JSTests/stress/set-iterator-fast-ftl.js
JSTests/stress/set-iterator-fast-iterator-proto-symbol-iterator-overridden.js
JSTests/stress/set-iterator-fast-keys-values-entries.js
JSTests/stress/set-iterator-fast-mid-iteration.js
JSTests/stress/set-iterator-fast-watchpoint-invalidate-next.js
JSTests/stress/set-iterator-fast-watchpoint-invalidate-symbol-iterator.js
* JSTests/microbenchmarks/map-iterator-fast-entries.js: Added.
(mapEntriesSum):
* JSTests/microbenchmarks/map-iterator-fast-keys.js: Added.
(mapKeysSum):
* JSTests/microbenchmarks/map-iterator-fast-values.js: Added.
(mapValuesSum):
* JSTests/microbenchmarks/set-iterator-fast-entries.js: Added.
* JSTests/microbenchmarks/set-iterator-fast-keys.js: Added.
* JSTests/microbenchmarks/set-iterator-fast-values.js: Added.
* JSTests/stress/map-iterator-fast-cross-realm.js: Added.
(shouldBe):
(valuesOfMap):
(keysOfMap):
(entriesOfMap):
(plainOfMap):
* JSTests/stress/map-iterator-fast-ftl.js: Added.
(shouldBe):
(values):
(keys):
(entries):
*
JSTests/stress/map-iterator-fast-iterator-proto-symbol-iterator-overridden.js:
Added.
(shouldBe):
(valuesOfIterator):
(iteratorPrototype.Symbol.iterator):
* JSTests/stress/map-iterator-fast-keys-values-entries.js: Added.
(shouldBe):
(values):
(keys):
(entries):
(plain):
(valuesOfIterator):
(keysOfIterator):
(entriesOfIterator):
* JSTests/stress/map-iterator-fast-mid-iteration.js: Added.
(shouldBe):
(consumeOneAndIterateRest):
(consumeKeysRest):
(consumeEntriesRest):
(drainThenIterate):
* JSTests/stress/map-iterator-fast-watchpoint-invalidate-next.js: Added.
(shouldBe):
(values):
(plain):
(mapIteratorPrototype.next):
(catch):
* JSTests/stress/map-iterator-fast-watchpoint-invalidate-symbol-iterator.js:
Added.
(shouldBe):
(values):
(plain):
(Map.prototype.Symbol.iterator):
* JSTests/stress/set-iterator-fast-cross-realm.js: Added.
(shouldBe):
* JSTests/stress/set-iterator-fast-ftl.js: Added.
(shouldBe):
*
JSTests/stress/set-iterator-fast-iterator-proto-symbol-iterator-overridden.js:
Added.
(shouldBe):
(iteratorPrototype.Symbol.iterator):
* JSTests/stress/set-iterator-fast-keys-values-entries.js: Added.
(shouldBe):
* JSTests/stress/set-iterator-fast-mid-iteration.js: Added.
(shouldBe):
(consumeOneAndIterateRest.set var.iter.set values):
* JSTests/stress/set-iterator-fast-watchpoint-invalidate-next.js: Added.
(shouldBe):
(setIteratorPrototype.next):
* JSTests/stress/set-iterator-fast-watchpoint-invalidate-symbol-iterator.js:
Added.
(shouldBe):
(set Set.prototype.Symbol.iterator):
* Source/JavaScriptCore/CMakeLists.txt:
* Source/JavaScriptCore/DerivedSources-input.xcfilelist:
* Source/JavaScriptCore/DerivedSources.make:
* Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj:
*
Source/JavaScriptCore/SaferCPPExpectations/NoUncountedMemberCheckerExpectations:
* Source/JavaScriptCore/builtins/BuiltinNames.h:
* Source/JavaScriptCore/builtins/MapIteratorPrototype.js: Removed.
* Source/JavaScriptCore/builtins/SetIteratorPrototype.js: Removed.
* Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.cpp:
(JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):
* Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.h:
* Source/JavaScriptCore/bytecode/IterationModeMetadata.h:
* Source/JavaScriptCore/bytecode/LinkTimeConstant.h:
* Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h:
(JSC::BytecodeGenerator::emitIsArrayIterator):
(JSC::BytecodeGenerator::emitIsMapIterator): Deleted.
(JSC::BytecodeGenerator::emitIsSetIterator): Deleted.
* Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp:
(JSC::mapIteratorInternalFieldIndex): Deleted.
(JSC::setIteratorInternalFieldIndex): Deleted.
(JSC::BytecodeIntrinsicNode::emit_intrinsic_getMapIteratorInternalField):
Deleted.
(JSC::BytecodeIntrinsicNode::emit_intrinsic_getSetIteratorInternalField):
Deleted.
(JSC::BytecodeIntrinsicNode::emit_intrinsic_putMapIteratorInternalField):
Deleted.
(JSC::BytecodeIntrinsicNode::emit_intrinsic_putSetIteratorInternalField):
Deleted.
* Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp:
(JSC::DFG::ByteCodeParser::handleIntrinsicCall):
(JSC::DFG::ByteCodeParser::handleIteratorOpen):
(JSC::DFG::ByteCodeParser::handleIteratorNext):
* Source/JavaScriptCore/jit/JITOperations.cpp:
(JSC::JSC_DEFINE_JIT_OPERATION):
* Source/JavaScriptCore/runtime/CommonSlowPaths.cpp:
(JSC::iteratorOpenTryFastImpl):
(JSC::iteratorNextTryFastImpl):
* Source/JavaScriptCore/runtime/Intrinsic.h:
* Source/JavaScriptCore/runtime/IteratorOperations.cpp:
(JSC::getIterationMode):
* Source/JavaScriptCore/runtime/JSGlobalObject.cpp:
(JSC::JSGlobalObject::init):
* Source/JavaScriptCore/runtime/JSMapIterator.cpp:
(JSC::JSC_DEFINE_HOST_FUNCTION): Deleted.
* Source/JavaScriptCore/runtime/JSMapIterator.h:
* Source/JavaScriptCore/runtime/JSSetIterator.cpp:
(JSC::JSC_DEFINE_HOST_FUNCTION): Deleted.
* Source/JavaScriptCore/runtime/JSSetIterator.h:
* Source/JavaScriptCore/runtime/MapIteratorPrototype.cpp:
(JSC::MapIteratorPrototype::finishCreation):
(JSC::JSC_DEFINE_HOST_FUNCTION):
* Source/JavaScriptCore/runtime/SetIteratorPrototype.cpp:
(JSC::SetIteratorPrototype::finishCreation):
(JSC::JSC_DEFINE_HOST_FUNCTION):
* Source/JavaScriptCore/runtime/VM.cpp:
(JSC::VM::VM):
(JSC::VM::visitAggregateImpl):
* Source/JavaScriptCore/runtime/VM.h:
(JSC::VM::fastMapKeysSentinel):
(JSC::VM::fastMapValuesSentinel):
(JSC::VM::fastSetEntriesSentinel):
Canonical link: https://commits.webkit.org/314382@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications