@@ -2305,9 +2305,8 @@ bool HeapObject::NeedsRehashing() const {
23052305 case TRANSITION_ARRAY_TYPE:
23062306 return TransitionArray::cast (*this ).number_of_entries () > 1 ;
23072307 case ORDERED_HASH_MAP_TYPE:
2308- return OrderedHashMap::cast (*this ).NumberOfElements () > 0 ;
23092308 case ORDERED_HASH_SET_TYPE:
2310- return OrderedHashSet::cast (* this ). NumberOfElements () > 0 ;
2309+ return false ; // We'll rehash from the JSMap or JSSet referencing them.
23112310 case NAME_DICTIONARY_TYPE:
23122311 case GLOBAL_DICTIONARY_TYPE:
23132312 case NUMBER_DICTIONARY_TYPE:
@@ -2317,6 +2316,8 @@ bool HeapObject::NeedsRehashing() const {
23172316 case SMALL_ORDERED_HASH_MAP_TYPE:
23182317 case SMALL_ORDERED_HASH_SET_TYPE:
23192318 case SMALL_ORDERED_NAME_DICTIONARY_TYPE:
2319+ case JS_MAP_TYPE:
2320+ case JS_SET_TYPE:
23202321 return true ;
23212322 default :
23222323 return false ;
@@ -2326,10 +2327,13 @@ bool HeapObject::NeedsRehashing() const {
23262327bool HeapObject::CanBeRehashed () const {
23272328 DCHECK (NeedsRehashing ());
23282329 switch (map ().instance_type ()) {
2330+ case JS_MAP_TYPE:
2331+ case JS_SET_TYPE:
2332+ return true ;
23292333 case ORDERED_HASH_MAP_TYPE:
23302334 case ORDERED_HASH_SET_TYPE:
2335+ UNREACHABLE (); // We'll rehash from the JSMap or JSSet referencing them.
23312336 case ORDERED_NAME_DICTIONARY_TYPE:
2332- // TODO(yangguo): actually support rehashing OrderedHash{Map,Set}.
23332337 return false ;
23342338 case NAME_DICTIONARY_TYPE:
23352339 case GLOBAL_DICTIONARY_TYPE:
@@ -2353,7 +2357,8 @@ bool HeapObject::CanBeRehashed() const {
23532357 return false ;
23542358}
23552359
2356- void HeapObject::RehashBasedOnMap (ReadOnlyRoots roots) {
2360+ void HeapObject::RehashBasedOnMap (Isolate* isolate) {
2361+ ReadOnlyRoots roots = ReadOnlyRoots (isolate);
23572362 switch (map ().instance_type ()) {
23582363 case HASH_TABLE_TYPE:
23592364 UNREACHABLE ();
@@ -2385,6 +2390,17 @@ void HeapObject::RehashBasedOnMap(ReadOnlyRoots roots) {
23852390 case SMALL_ORDERED_HASH_SET_TYPE:
23862391 DCHECK_EQ (0 , SmallOrderedHashSet::cast (*this ).NumberOfElements ());
23872392 break ;
2393+ case ORDERED_HASH_MAP_TYPE:
2394+ case ORDERED_HASH_SET_TYPE:
2395+ UNREACHABLE (); // We'll rehash from the JSMap or JSSet referencing them.
2396+ case JS_MAP_TYPE: {
2397+ JSMap::cast (*this ).Rehash (isolate);
2398+ break ;
2399+ }
2400+ case JS_SET_TYPE: {
2401+ JSSet::cast (*this ).Rehash (isolate);
2402+ break ;
2403+ }
23882404 case SMALL_ORDERED_NAME_DICTIONARY_TYPE:
23892405 DCHECK_EQ (0 , SmallOrderedNameDictionary::cast (*this ).NumberOfElements ());
23902406 break ;
@@ -7864,6 +7880,13 @@ void JSSet::Clear(Isolate* isolate, Handle<JSSet> set) {
78647880 set->set_table (*table);
78657881}
78667882
7883+ void JSSet::Rehash (Isolate* isolate) {
7884+ Handle<OrderedHashSet> table_handle (OrderedHashSet::cast (table ()), isolate);
7885+ Handle<OrderedHashSet> new_table =
7886+ OrderedHashSet::Rehash (isolate, table_handle).ToHandleChecked ();
7887+ set_table (*new_table);
7888+ }
7889+
78677890void JSMap::Initialize (Handle<JSMap> map, Isolate* isolate) {
78687891 Handle<OrderedHashMap> table = isolate->factory ()->NewOrderedHashMap ();
78697892 map->set_table (*table);
@@ -7875,6 +7898,13 @@ void JSMap::Clear(Isolate* isolate, Handle<JSMap> map) {
78757898 map->set_table (*table);
78767899}
78777900
7901+ void JSMap::Rehash (Isolate* isolate) {
7902+ Handle<OrderedHashMap> table_handle (OrderedHashMap::cast (table ()), isolate);
7903+ Handle<OrderedHashMap> new_table =
7904+ OrderedHashMap::Rehash (isolate, table_handle).ToHandleChecked ();
7905+ set_table (*new_table);
7906+ }
7907+
78787908void JSWeakCollection::Initialize (Handle<JSWeakCollection> weak_collection,
78797909 Isolate* isolate) {
78807910 Handle<EphemeronHashTable> table = EphemeronHashTable::New (isolate, 0 );
0 commit comments