@@ -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 ;
@@ -7852,6 +7868,13 @@ void JSSet::Clear(Isolate* isolate, Handle<JSSet> set) {
78527868 set->set_table (*table);
78537869}
78547870
7871+ void JSSet::Rehash (Isolate* isolate) {
7872+ Handle<OrderedHashSet> table_handle (OrderedHashSet::cast (table ()), isolate);
7873+ Handle<OrderedHashSet> new_table =
7874+ OrderedHashSet::Rehash (isolate, table_handle).ToHandleChecked ();
7875+ set_table (*new_table);
7876+ }
7877+
78557878void JSMap::Initialize (Handle<JSMap> map, Isolate* isolate) {
78567879 Handle<OrderedHashMap> table = isolate->factory ()->NewOrderedHashMap ();
78577880 map->set_table (*table);
@@ -7863,6 +7886,13 @@ void JSMap::Clear(Isolate* isolate, Handle<JSMap> map) {
78637886 map->set_table (*table);
78647887}
78657888
7889+ void JSMap::Rehash (Isolate* isolate) {
7890+ Handle<OrderedHashMap> table_handle (OrderedHashMap::cast (table ()), isolate);
7891+ Handle<OrderedHashMap> new_table =
7892+ OrderedHashMap::Rehash (isolate, table_handle).ToHandleChecked ();
7893+ set_table (*new_table);
7894+ }
7895+
78667896void JSWeakCollection::Initialize (Handle<JSWeakCollection> weak_collection,
78677897 Isolate* isolate) {
78687898 Handle<EphemeronHashTable> table = EphemeronHashTable::New (isolate, 0 );
0 commit comments