Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index f7c89175da75c2fb7916015a34adf9954b565eef..9c0d43b1eb54949bff3e6d1de40d26d1f35acb6f 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -1028,6 +1028,14 @@ Object* Object::GetPrototype(Isolate* isolate) { |
} |
+Handle<Object> Object::GetHash(Handle<Object> object, Isolate* isolate, |
+ CreationFlag flag) { |
+ CALL_HEAP_FUNCTION(isolate, |
+ object->GetHash(flag), |
+ Object); |
+} |
+ |
+ |
MaybeObject* Object::GetHash(CreationFlag flag) { |
// The object is either a number, a name, an odd-ball, |
// a real JS object, or a Harmony proxy. |
@@ -15704,61 +15712,79 @@ MaybeObject* NameDictionary::TransformPropertiesToFastFor( |
} |
-bool ObjectHashSet::Contains(Object* key) { |
- ASSERT(IsKey(key)); |
+Handle<ObjectHashSet> ObjectHashSet::EnsureSetCapacity( |
+ Handle<ObjectHashSet> table, |
+ int n, |
+ Handle<Object> key, |
+ PretenureFlag pretenure) { |
+ CALL_HEAP_FUNCTION(table->GetIsolate(), |
+ table->EnsureCapacity(n, *key, pretenure), |
+ ObjectHashSet); |
+} |
- // If the object does not have an identity hash, it was never used as a key. |
- { MaybeObject* maybe_hash = key->GetHash(OMIT_CREATION); |
- if (maybe_hash->ToObjectUnchecked()->IsUndefined()) return false; |
- } |
- return (FindEntry(key) != kNotFound); |
+ |
+Handle<ObjectHashSet> ObjectHashSet::ShrinkSet(Handle<ObjectHashSet> table, |
+ Handle<Object> key) { |
+ CALL_HEAP_FUNCTION(table->GetIsolate(), |
+ table->Shrink(*key), |
+ ObjectHashSet); |
} |
-MaybeObject* ObjectHashSet::Add(Object* key) { |
- ASSERT(IsKey(key)); |
+bool ObjectHashSet::Contains(Handle<ObjectHashSet> table, Handle<Object> key) { |
+ ASSERT(table->IsKey(*key)); |
+ |
+ if (Object::GetHash(key, table->GetIsolate(), OMIT_CREATION)->IsUndefined()) |
+ return false; |
+ |
+ return (table->FindEntry(*key) != kNotFound); |
+} |
+ |
+ |
+Handle<ObjectHashSet> ObjectHashSet::Add(Handle<ObjectHashSet> table, |
+ Handle<Object> key) { |
+ ASSERT(table->IsKey(*key)); |
+ |
+ Isolate* isolate = table->GetIsolate(); |
// Make sure the key object has an identity hash code. |
- int hash; |
- { MaybeObject* maybe_hash = key->GetHash(ALLOW_CREATION); |
- if (maybe_hash->IsFailure()) return maybe_hash; |
- ASSERT(key->GetHash(OMIT_CREATION) == maybe_hash); |
- hash = Smi::cast(maybe_hash->ToObjectUnchecked())->value(); |
- } |
- int entry = FindEntry(key); |
+ Handle<Object> object_hash = Object::GetHash(key, isolate, ALLOW_CREATION); |
+ ASSERT(*Object::GetHash(key, isolate, OMIT_CREATION) == *object_hash); |
+ |
+ int hash = Smi::cast(*object_hash)->value(); |
+ int entry = table->FindEntry(*key); |
// Check whether key is already present. |
- if (entry != kNotFound) return this; |
+ if (entry != kNotFound) return table; |
// Check whether the hash set should be extended and add entry. |
- Object* obj; |
- { MaybeObject* maybe_obj = EnsureCapacity(1, key); |
- if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
- } |
- ObjectHashSet* table = ObjectHashSet::cast(obj); |
- entry = table->FindInsertionEntry(hash); |
- table->set(EntryToIndex(entry), key); |
- table->ElementAdded(); |
- return table; |
+ Handle<ObjectHashSet> new_table = |
+ ObjectHashSet::EnsureSetCapacity(table, 1, key); |
+ entry = new_table->FindInsertionEntry(hash); |
+ new_table->set(table->EntryToIndex(entry), *key); |
rafaelw
2013/11/04 10:58:06
One question, this probably doesn't matter, but it
Michael Starzinger
2013/11/04 13:46:42
Hmm, HashTable::EntryToIndex() should be a static
rafaelw
2013/11/04 15:12:01
That makes sense. The enclosing methods are now st
|
+ new_table->ElementAdded(); |
+ return new_table; |
} |
-MaybeObject* ObjectHashSet::Remove(Object* key) { |
- ASSERT(IsKey(key)); |
+Handle<ObjectHashSet> ObjectHashSet::Remove(Handle<ObjectHashSet> table, |
+ Handle<Object> key) { |
+ ASSERT(table->IsKey(*key)); |
- // If the object does not have an identity hash, it was never used as a key. |
- { MaybeObject* maybe_hash = key->GetHash(OMIT_CREATION); |
- if (maybe_hash->ToObjectUnchecked()->IsUndefined()) return this; |
- } |
- int entry = FindEntry(key); |
+ Isolate* isolate = table->GetIsolate(); |
+ |
+ // Make sure the key object has an identity hash code. |
+ if (Object::GetHash(key, isolate, OMIT_CREATION)->IsUndefined()) return table; |
+ |
+ int entry = table->FindEntry(*key); |
// Check whether key is actually present. |
- if (entry == kNotFound) return this; |
+ if (entry == kNotFound) return table; |
// Remove entry and try to shrink this hash set. |
- set_the_hole(EntryToIndex(entry)); |
- ElementRemoved(); |
- return Shrink(key); |
+ table->set_the_hole(table->EntryToIndex(entry)); |
+ table->ElementRemoved(); |
+ return ObjectHashSet::ShrinkSet(table, key); |
} |