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

Reply via email to