diff --git a/deps/v8z/include/v8-version.h b/deps/v8z/include/v8-version.h index 5cd33a0827f..9042d9bc826 100644 --- a/deps/v8z/include/v8-version.h +++ b/deps/v8z/include/v8-version.h @@ -11,7 +11,7 @@ #define V8_MAJOR_VERSION 4 #define V8_MINOR_VERSION 5 #define V8_BUILD_NUMBER 103 -#define V8_PATCH_LEVEL 48 +#define V8_PATCH_LEVEL 49 // Use 1 for candidates and 0 otherwise. // (Boolean macro values are not supported by all preprocessors.) diff --git a/deps/v8z/src/objects.cc b/deps/v8z/src/objects.cc index 29eceb9724f..e9bbad5ae8c 100644 --- a/deps/v8z/src/objects.cc +++ b/deps/v8z/src/objects.cc @@ -13744,6 +13744,16 @@ void HashTable::Rehash(Key key) { } } } + // Wipe deleted entries. + Heap* heap = GetHeap(); + Object* the_hole = heap->the_hole_value(); + Object* undefined = heap->undefined_value(); + for (uint32_t current = 0; current < capacity; current++) { + if (get(EntryToIndex(current)) == the_hole) { + set(EntryToIndex(current), undefined); + } + } + SetNumberOfDeletedElements(0); } @@ -15198,6 +15208,11 @@ Handle ObjectHashTable::Put(Handle table, return table; } + // Rehash if more than 33% of the entries are deleted entries. + // TODO(jochen): Consider to shrink the fixed array in place. + if ((table->NumberOfDeletedElements() << 1) > table->NumberOfElements()) { + table->Rehash(isolate->factory()->undefined_value()); + } // If we're out of luck, we didn't get a GC recently, and so rehashing // isn't enough to avoid a crash. if (!table->HasSufficientCapacityToAdd(1)) {