@@ -2303,9 +2303,8 @@ bool HeapObject::NeedsRehashing() const {
23032303 case TRANSITION_ARRAY_TYPE:
23042304 return TransitionArray::cast (*this ).number_of_entries () > 1 ;
23052305 case ORDERED_HASH_MAP_TYPE:
2306- return OrderedHashMap::cast (*this ).NumberOfElements () > 0 ;
23072306 case ORDERED_HASH_SET_TYPE:
2308- return OrderedHashSet::cast (* this ). NumberOfElements () > 0 ;
2307+ return false ; // We'll rehash from the JSMap or JSSet referencing them.
23092308 case NAME_DICTIONARY_TYPE:
23102309 case GLOBAL_DICTIONARY_TYPE:
23112310 case NUMBER_DICTIONARY_TYPE:
@@ -2315,6 +2314,8 @@ bool HeapObject::NeedsRehashing() const {
23152314 case SMALL_ORDERED_HASH_MAP_TYPE:
23162315 case SMALL_ORDERED_HASH_SET_TYPE:
23172316 case SMALL_ORDERED_NAME_DICTIONARY_TYPE:
2317+ case JS_MAP_TYPE:
2318+ case JS_SET_TYPE:
23182319 return true ;
23192320 default :
23202321 return false ;
@@ -2324,10 +2325,13 @@ bool HeapObject::NeedsRehashing() const {
23242325bool HeapObject::CanBeRehashed () const {
23252326 DCHECK (NeedsRehashing ());
23262327 switch (map ().instance_type ()) {
2328+ case JS_MAP_TYPE:
2329+ case JS_SET_TYPE:
2330+ return true ;
23272331 case ORDERED_HASH_MAP_TYPE:
23282332 case ORDERED_HASH_SET_TYPE:
2333+ UNREACHABLE (); // We'll rehash from the JSMap or JSSet referencing them.
23292334 case ORDERED_NAME_DICTIONARY_TYPE:
2330- // TODO(yangguo): actually support rehashing OrderedHash{Map,Set}.
23312335 return false ;
23322336 case NAME_DICTIONARY_TYPE:
23332337 case GLOBAL_DICTIONARY_TYPE:
@@ -2351,7 +2355,8 @@ bool HeapObject::CanBeRehashed() const {
23512355 return false ;
23522356}
23532357
2354- void HeapObject::RehashBasedOnMap (ReadOnlyRoots roots) {
2358+ void HeapObject::RehashBasedOnMap (Isolate* isolate) {
2359+ ReadOnlyRoots roots = ReadOnlyRoots (isolate);
23552360 switch (map ().instance_type ()) {
23562361 case HASH_TABLE_TYPE:
23572362 UNREACHABLE ();
@@ -2383,6 +2388,17 @@ void HeapObject::RehashBasedOnMap(ReadOnlyRoots roots) {
23832388 case SMALL_ORDERED_HASH_SET_TYPE:
23842389 DCHECK_EQ (0 , SmallOrderedHashSet::cast (*this ).NumberOfElements ());
23852390 break ;
2391+ case ORDERED_HASH_MAP_TYPE:
2392+ case ORDERED_HASH_SET_TYPE:
2393+ UNREACHABLE (); // We'll rehash from the JSMap or JSSet referencing them.
2394+ case JS_MAP_TYPE: {
2395+ JSMap::cast (*this ).Rehash (isolate);
2396+ break ;
2397+ }
2398+ case JS_SET_TYPE: {
2399+ JSSet::cast (*this ).Rehash (isolate);
2400+ break ;
2401+ }
23862402 case SMALL_ORDERED_NAME_DICTIONARY_TYPE:
23872403 DCHECK_EQ (0 , SmallOrderedNameDictionary::cast (*this ).NumberOfElements ());
23882404 break ;
@@ -7849,6 +7865,13 @@ void JSSet::Clear(Isolate* isolate, Handle<JSSet> set) {
78497865 set->set_table (*table);
78507866}
78517867
7868+ void JSSet::Rehash (Isolate* isolate) {
7869+ Handle<OrderedHashSet> table_handle (OrderedHashSet::cast (table ()), isolate);
7870+ Handle<OrderedHashSet> new_table =
7871+ OrderedHashSet::Rehash (isolate, table_handle).ToHandleChecked ();
7872+ set_table (*new_table);
7873+ }
7874+
78527875void JSMap::Initialize (Handle<JSMap> map, Isolate* isolate) {
78537876 Handle<OrderedHashMap> table = isolate->factory ()->NewOrderedHashMap ();
78547877 map->set_table (*table);
@@ -7860,6 +7883,13 @@ void JSMap::Clear(Isolate* isolate, Handle<JSMap> map) {
78607883 map->set_table (*table);
78617884}
78627885
7886+ void JSMap::Rehash (Isolate* isolate) {
7887+ Handle<OrderedHashMap> table_handle (OrderedHashMap::cast (table ()), isolate);
7888+ Handle<OrderedHashMap> new_table =
7889+ OrderedHashMap::Rehash (isolate, table_handle).ToHandleChecked ();
7890+ set_table (*new_table);
7891+ }
7892+
78637893void JSWeakCollection::Initialize (Handle<JSWeakCollection> weak_collection,
78647894 Isolate* isolate) {
78657895 Handle<EphemeronHashTable> table = EphemeronHashTable::New (isolate, 0 );
0 commit comments