Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(935)

Unified Diff: src/elements.cc

Issue 2031533002: [dictionaries] Use IsKey(Isolate* i, Object* o) everywhere (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: use new IsTheHole Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/builtins.cc ('k') | src/heap/incremental-marking.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/elements.cc
diff --git a/src/elements.cc b/src/elements.cc
index 02f79c60a1d07861c5b3d964d6f390a626893bc4..ed88b01b8bf7baf764dd1d20aa6af0bfc10dceb0 100644
--- a/src/elements.cc
+++ b/src/elements.cc
@@ -1186,12 +1186,10 @@ class DictionaryElementsAccessor
SeededNumberDictionary* dict = SeededNumberDictionary::cast(backing_store);
if (!dict->requires_slow_elements()) return false;
int capacity = dict->Capacity();
- Heap* heap = holder->GetHeap();
- Object* undefined = heap->undefined_value();
- Object* the_hole = heap->the_hole_value();
+ Isolate* isolate = dict->GetIsolate();
for (int i = 0; i < capacity; i++) {
Object* key = dict->KeyAt(i);
- if (key == the_hole || key == undefined) continue;
+ if (!dict->IsKey(isolate, key)) continue;
DCHECK(!dict->IsDeleted(i));
PropertyDetails details = dict->DetailsAt(i);
if (details.type() == ACCESSOR_CONSTANT) return true;
@@ -1301,23 +1299,12 @@ class DictionaryElementsAccessor
return static_cast<uint32_t>(raw_key->Number());
}
- static uint32_t GetKeyForEntryImpl(Handle<SeededNumberDictionary> dictionary,
+ static uint32_t GetKeyForEntryImpl(Isolate* isolate,
+ Handle<SeededNumberDictionary> dictionary,
int entry, PropertyFilter filter) {
DisallowHeapAllocation no_gc;
Object* raw_key = dictionary->KeyAt(entry);
- if (!dictionary->IsKey(raw_key)) return kMaxUInt32;
- return FilterKey(dictionary, entry, raw_key, filter);
- }
-
- static uint32_t GetKeyForEntryImpl(Handle<SeededNumberDictionary> dictionary,
- int entry, PropertyFilter filter,
- Object* undefined, Object* the_hole) {
- DisallowHeapAllocation no_gc;
- Object* raw_key = dictionary->KeyAt(entry);
- // Replace the IsKey check with a direct comparison which is much faster.
- if (raw_key == undefined || raw_key == the_hole) {
- return kMaxUInt32;
- }
+ if (!dictionary->IsKey(isolate, raw_key)) return kMaxUInt32;
return FilterKey(dictionary, entry, raw_key, filter);
}
@@ -1325,21 +1312,18 @@ class DictionaryElementsAccessor
Handle<FixedArrayBase> backing_store,
KeyAccumulator* keys) {
if (keys->filter() & SKIP_STRINGS) return;
- Factory* factory = keys->isolate()->factory();
- Handle<Object> undefined = factory->undefined_value();
- Handle<Object> the_hole = factory->the_hole_value();
+ Isolate* isolate = keys->isolate();
Handle<SeededNumberDictionary> dictionary =
Handle<SeededNumberDictionary>::cast(backing_store);
int capacity = dictionary->Capacity();
- Handle<FixedArray> elements =
- factory->NewFixedArray(GetMaxNumberOfEntries(*object, *backing_store));
+ Handle<FixedArray> elements = isolate->factory()->NewFixedArray(
+ GetMaxNumberOfEntries(*object, *backing_store));
int insertion_index = 0;
PropertyFilter filter = keys->filter();
for (int i = 0; i < capacity; i++) {
- uint32_t key =
- GetKeyForEntryImpl(dictionary, i, filter, *undefined, *the_hole);
+ uint32_t key = GetKeyForEntryImpl(isolate, dictionary, i, filter);
if (key == kMaxUInt32) continue;
- Handle<Object> key_handle = factory->NewNumberFromUint(key);
+ Handle<Object> key_handle = isolate->factory()->NewNumberFromUint(key);
elements->set(insertion_index, *key_handle);
insertion_index++;
}
@@ -1357,14 +1341,11 @@ class DictionaryElementsAccessor
if (filter & SKIP_STRINGS) return list;
if (filter & ONLY_ALL_CAN_READ) return list;
- Handle<Object> undefined = isolate->factory()->undefined_value();
- Handle<Object> the_hole = isolate->factory()->the_hole_value();
Handle<SeededNumberDictionary> dictionary =
Handle<SeededNumberDictionary>::cast(backing_store);
uint32_t capacity = dictionary->Capacity();
for (uint32_t i = 0; i < capacity; i++) {
- uint32_t key =
- GetKeyForEntryImpl(dictionary, i, filter, *undefined, *the_hole);
+ uint32_t key = GetKeyForEntryImpl(isolate, dictionary, i, filter);
if (key == kMaxUInt32) continue;
Handle<Object> index = isolate->factory()->NewNumberFromUint(key);
list->set(insertion_index, *index);
« no previous file with comments | « src/builtins.cc ('k') | src/heap/incremental-marking.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698