Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: a45c69df953869aaf54b5f253e4254b90e8bee6e
      
https://github.com/WebKit/WebKit/commit/a45c69df953869aaf54b5f253e4254b90e8bee6e
  Author: Yusuke Suzuki <[email protected]>
  Date:   2026-05-11 (Mon, 11 May 2026)

  Changed paths:
    M Source/JavaScriptCore/runtime/AbstractModuleRecord.h
    M Source/WTF/WTF.xcodeproj/project.pbxproj
    M Source/WTF/wtf/CMakeLists.txt
    M Source/WTF/wtf/Forward.h
    A Source/WTF/wtf/OrderedHashMap.h
    A Source/WTF/wtf/OrderedHashSet.h
    A Source/WTF/wtf/OrderedHashTable.h
    M Tools/TestWebKitAPI/CMakeLists.txt
    M Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
    A Tools/TestWebKitAPI/Tests/WTF/OrderedHashMap.cpp
    A Tools/TestWebKitAPI/Tests/WTF/OrderedHashSet.cpp

  Log Message:
  -----------
  [WTF] Add OrderedHashTable
https://bugs.webkit.org/show_bug.cgi?id=314476
rdar://176650881

Reviewed by Yijia Huang.

Through RapidHash work (which changes the hash code, thus changes the
ordering of HashTable entries), we found many code which is wrongly
relying on HashTable's entries' ordering. This revealed that we have
many use cases,

1. We want to preserve insertion ordering of HashSet by paying some
   memory cost.
2. But we do not want to make it dramatically slower.

Currently, canonical solution for this is using ListHashSet. But this
is dramatically slower compared to the normal HashMap since it is
effectively a linked-list. This is costly in terms of memory and it is
slow. This offers another benefit, "you can remove entries while
iterating", but in many cases, we do not need that characteristics.

This patch adds OrderedHashMap / OrderedHashSet. Basically this is
similar to JSC's PropertyTable implementation. We maintain hashtable for
indice and entries buffer, and entries buffer is maintaining insertion
ordering.

Tests: Tools/TestWebKitAPI/Tests/WTF/OrderedHashMap.cpp
       Tools/TestWebKitAPI/Tests/WTF/OrderedHashSet.cpp

* Source/JavaScriptCore/runtime/AbstractModuleRecord.h:
* Source/WTF/WTF.xcodeproj/project.pbxproj:
* Source/WTF/wtf/CMakeLists.txt:
* Source/WTF/wtf/Forward.h:
* Source/WTF/wtf/OrderedHashMap.h: Added.
(WTF::OrderedHashTableConstIteratorAdapter::OrderedHashTableConstIteratorAdapter):
(WTF::OrderedHashTableConstIteratorAdapter::get const):
(WTF::OrderedHashTableConstIteratorAdapter::operator* const):
(WTF::OrderedHashTableConstIteratorAdapter::operator-> const):
(WTF::OrderedHashTableConstIteratorAdapter::operator++):
(WTF::OrderedHashTableConstIteratorAdapter::keys):
(WTF::OrderedHashTableConstIteratorAdapter::values):
(WTF::OrderedHashTableIteratorAdapter::OrderedHashTableIteratorAdapter):
(WTF::OrderedHashTableIteratorAdapter::get const):
(WTF::OrderedHashTableIteratorAdapter::operator* const):
(WTF::OrderedHashTableIteratorAdapter::operator-> const):
(WTF::OrderedHashTableIteratorAdapter::operator++):
(WTF::OrderedHashTableIteratorAdapter::operator 
OrderedHashTableConstIteratorAdapter<HashTableType, KeyType, MappedType> const):
(WTF::OrderedHashTableIteratorAdapter::keys):
(WTF::OrderedHashTableIteratorAdapter::values):
(WTF::operator==):
(WTF::OrderedHashTableConstKeysIterator::OrderedHashTableConstKeysIterator):
(WTF::OrderedHashTableConstKeysIterator::get const):
(WTF::OrderedHashTableConstKeysIterator::operator* const):
(WTF::OrderedHashTableConstKeysIterator::operator-> const):
(WTF::OrderedHashTableConstKeysIterator::operator++):
(WTF::OrderedHashTableKeysIterator::OrderedHashTableKeysIterator):
(WTF::OrderedHashTableKeysIterator::get const):
(WTF::OrderedHashTableKeysIterator::operator* const):
(WTF::OrderedHashTableKeysIterator::operator-> const):
(WTF::OrderedHashTableKeysIterator::operator++):
(WTF::OrderedHashTableKeysIterator::operator 
OrderedHashTableConstKeysIterator<HashTableType, KeyType, MappedType> const):
(WTF::OrderedHashTableConstValuesIterator::OrderedHashTableConstValuesIterator):
(WTF::OrderedHashTableConstValuesIterator::get const):
(WTF::OrderedHashTableConstValuesIterator::operator* const):
(WTF::OrderedHashTableConstValuesIterator::operator-> const):
(WTF::OrderedHashTableConstValuesIterator::operator++):
(WTF::OrderedHashTableValuesIterator::OrderedHashTableValuesIterator):
(WTF::OrderedHashTableValuesIterator::get const):
(WTF::OrderedHashTableValuesIterator::operator* const):
(WTF::OrderedHashTableValuesIterator::operator-> const):
(WTF::OrderedHashTableValuesIterator::operator++):
(WTF::OrderedHashTableValuesIterator::operator 
OrderedHashTableConstValuesIterator<HashTableType, KeyType, MappedType> const):
* Source/WTF/wtf/OrderedHashSet.h: Added.
* Source/WTF/wtf/OrderedHashTable.h: Added.
(WTF::OrderedHashTableIterator::get const):
(WTF::OrderedHashTableIterator::operator* const):
(WTF::OrderedHashTableIterator::operator-> const):
(WTF::OrderedHashTableIterator::operator++):
(WTF::OrderedHashTableIterator::operator==):
(WTF::OrderedHashTableIterator::OrderedHashTableIterator):
(WTF::OrderedHashTableIterator::skipDeleted):
(WTF::OrderedHashTableConstIterator::OrderedHashTableConstIterator):
(WTF::OrderedHashTableConstIterator::get const):
(WTF::OrderedHashTableConstIterator::operator* const):
(WTF::OrderedHashTableConstIterator::operator-> const):
(WTF::OrderedHashTableConstIterator::operator++):
(WTF::OrderedHashTableConstIterator::operator==):
(WTF::OrderedHashTableConstIterator::skipDeleted):
(WTF::OrderedHashTableReverseIterator::get const):
(WTF::OrderedHashTableReverseIterator::operator* const):
(WTF::OrderedHashTableReverseIterator::operator-> const):
(WTF::OrderedHashTableReverseIterator::operator++):
(WTF::OrderedHashTableReverseIterator::operator==):
(WTF::OrderedHashTableReverseIterator::OrderedHashTableReverseIterator):
(WTF::OrderedHashTableReverseIterator::skipDeleted):
(WTF::OrderedHashTableConstReverseIterator::OrderedHashTableConstReverseIterator):
(WTF::OrderedHashTableConstReverseIterator::get const):
(WTF::OrderedHashTableConstReverseIterator::operator* const):
(WTF::OrderedHashTableConstReverseIterator::operator-> const):
(WTF::OrderedHashTableConstReverseIterator::operator++):
(WTF::OrderedHashTableConstReverseIterator::operator==):
(WTF::OrderedHashTableConstReverseIterator::skipDeleted):
* Tools/TestWebKitAPI/CMakeLists.txt:
* Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* Tools/TestWebKitAPI/Tests/WTF/OrderedHashMap.cpp: Added.
(TestWebKitAPI::TEST(WTF_OrderedHashMap, EmptyMap)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, BasicAddAndFind)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, Set)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, Ensure)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, Contains)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, Get)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, GetOptional)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, InsertionOrderPreserved)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, InsertionOrderPreservedAfterDeletion)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, SetDoesNotChangeOrder)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, RemoveByKey)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, RemoveByIterator)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, Take)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, TakeOptional)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, TakeFirst)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, Clear)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, Swap)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, CopyConstruction)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, MoveConstruction)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, CopyAssignment)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, MoveAssignment)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, KeysIteration)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, ValuesIteration)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, RehashPreservesOrder)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, DeleteAndReinsert)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, ManyDeletesAndInserts)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, StringKeys)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, InitializerList)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, ReserveCapacity)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, ConstIteration)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, FindReturnsCorrectIterator)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, IteratorComparison)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, 
CompactInPlacePreservesOrderAndCapacity)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, CompactInPlaceOnLargerTable)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, CompactInPlaceWithStringValues)):
(TestWebKitAPI::TEST(WTF_OrderedHashMap, RemoveIfAcrossShrinkThreshold)):
* Tools/TestWebKitAPI/Tests/WTF/OrderedHashSet.cpp: Added.
(TestWebKitAPI::TEST(WTF_OrderedHashSet, EmptySet)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, BasicAddAndContains)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, InsertionOrderPreserved)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, InsertionOrderPreservedAfterDeletion)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, Remove)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, RemoveByIterator)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, Take)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, TakeAny)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, Clear)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, Swap)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, CopyConstruction)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, MoveConstruction)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, CopyAssignment)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, MoveAssignment)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, RehashPreservesOrder)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, DeleteAndReinsert)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, ManyDeletesAndInserts)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, StringValues)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, InitializerList)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, AddAll)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, Find)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, ReserveCapacity)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, StressTest)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, 
CompactInPlacePreservesOrderAndCapacity)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, CompactInPlaceOnLargerTable)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, CompactInPlaceWithStrings)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, CompactInPlaceRepeatedCycles)):
(TestWebKitAPI::TEST(WTF_OrderedHashSet, RemoveIfAcrossShrinkThreshold)):

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



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications

Reply via email to