@@ -2285,9 +2285,8 @@ bool HeapObject::NeedsRehashing() const {
22852285 case TRANSITION_ARRAY_TYPE:
22862286 return TransitionArray::cast (*this ).number_of_entries () > 1 ;
22872287 case ORDERED_HASH_MAP_TYPE:
2288- return OrderedHashMap::cast (*this ).NumberOfElements () > 0 ;
22892288 case ORDERED_HASH_SET_TYPE:
2290- return OrderedHashSet::cast (* this ). NumberOfElements () > 0 ;
2289+ return false ; // We'll rehash from the JSMap or JSSet referencing them.
22912290 case NAME_DICTIONARY_TYPE:
22922291 case GLOBAL_DICTIONARY_TYPE:
22932292 case NUMBER_DICTIONARY_TYPE:
@@ -2297,6 +2296,8 @@ bool HeapObject::NeedsRehashing() const {
22972296 case SMALL_ORDERED_HASH_MAP_TYPE:
22982297 case SMALL_ORDERED_HASH_SET_TYPE:
22992298 case SMALL_ORDERED_NAME_DICTIONARY_TYPE:
2299+ case JS_MAP_TYPE:
2300+ case JS_SET_TYPE:
23002301 return true ;
23012302 default :
23022303 return false ;
@@ -2306,10 +2307,13 @@ bool HeapObject::NeedsRehashing() const {
23062307bool HeapObject::CanBeRehashed () const {
23072308 DCHECK (NeedsRehashing ());
23082309 switch (map ().instance_type ()) {
2310+ case JS_MAP_TYPE:
2311+ case JS_SET_TYPE:
2312+ return true ;
23092313 case ORDERED_HASH_MAP_TYPE:
23102314 case ORDERED_HASH_SET_TYPE:
2315+ UNREACHABLE (); // We'll rehash from the JSMap or JSSet referencing them.
23112316 case ORDERED_NAME_DICTIONARY_TYPE:
2312- // TODO(yangguo): actually support rehashing OrderedHash{Map,Set}.
23132317 return false ;
23142318 case NAME_DICTIONARY_TYPE:
23152319 case GLOBAL_DICTIONARY_TYPE:
@@ -2333,7 +2337,8 @@ bool HeapObject::CanBeRehashed() const {
23332337 return false ;
23342338}
23352339
2336- void HeapObject::RehashBasedOnMap (ReadOnlyRoots roots) {
2340+ void HeapObject::RehashBasedOnMap (Isolate* isolate) {
2341+ ReadOnlyRoots roots = ReadOnlyRoots (isolate);
23372342 switch (map ().instance_type ()) {
23382343 case HASH_TABLE_TYPE:
23392344 UNREACHABLE ();
@@ -2365,6 +2370,17 @@ void HeapObject::RehashBasedOnMap(ReadOnlyRoots roots) {
23652370 case SMALL_ORDERED_HASH_SET_TYPE:
23662371 DCHECK_EQ (0 , SmallOrderedHashSet::cast (*this ).NumberOfElements ());
23672372 break ;
2373+ case ORDERED_HASH_MAP_TYPE:
2374+ case ORDERED_HASH_SET_TYPE:
2375+ UNREACHABLE (); // We'll rehash from the JSMap or JSSet referencing them.
2376+ case JS_MAP_TYPE: {
2377+ JSMap::cast (*this ).Rehash (isolate);
2378+ break ;
2379+ }
2380+ case JS_SET_TYPE: {
2381+ JSSet::cast (*this ).Rehash (isolate);
2382+ break ;
2383+ }
23682384 case SMALL_ORDERED_NAME_DICTIONARY_TYPE:
23692385 DCHECK_EQ (0 , SmallOrderedNameDictionary::cast (*this ).NumberOfElements ());
23702386 break ;
@@ -7740,6 +7756,13 @@ void JSSet::Clear(Isolate* isolate, Handle<JSSet> set) {
77407756 set->set_table (*table);
77417757}
77427758
7759+ void JSSet::Rehash (Isolate* isolate) {
7760+ Handle<OrderedHashSet> table_handle (OrderedHashSet::cast (table ()), isolate);
7761+ Handle<OrderedHashSet> new_table =
7762+ OrderedHashSet::Rehash (isolate, table_handle).ToHandleChecked ();
7763+ set_table (*new_table);
7764+ }
7765+
77437766void JSMap::Initialize (Handle<JSMap> map, Isolate* isolate) {
77447767 Handle<OrderedHashMap> table = isolate->factory ()->NewOrderedHashMap ();
77457768 map->set_table (*table);
@@ -7751,6 +7774,13 @@ void JSMap::Clear(Isolate* isolate, Handle<JSMap> map) {
77517774 map->set_table (*table);
77527775}
77537776
7777+ void JSMap::Rehash (Isolate* isolate) {
7778+ Handle<OrderedHashMap> table_handle (OrderedHashMap::cast (table ()), isolate);
7779+ Handle<OrderedHashMap> new_table =
7780+ OrderedHashMap::Rehash (isolate, table_handle).ToHandleChecked ();
7781+ set_table (*new_table);
7782+ }
7783+
77547784void JSWeakCollection::Initialize (Handle<JSWeakCollection> weak_collection,
77557785 Isolate* isolate) {
77567786 Handle<EphemeronHashTable> table = EphemeronHashTable::New (isolate, 0 );
0 commit comments