| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 1fee95b6b9a897615b25bcc36309a0a1206fdf6a..56f3491b8c24a9b09410f2cfe7323adf6916343e 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -5302,7 +5302,8 @@ void JSObject::DeleteHiddenProperty(Handle<JSObject> object, Handle<Name> key) {
|
| if (inline_value->IsUndefined() || inline_value->IsSmi()) return;
|
|
|
| Handle<ObjectHashTable> hashtable(ObjectHashTable::cast(inline_value));
|
| - ObjectHashTable::Put(hashtable, key, isolate->factory()->the_hole_value());
|
| + bool was_present = false;
|
| + ObjectHashTable::Remove(hashtable, key, &was_present);
|
| }
|
|
|
|
|
| @@ -16173,6 +16174,7 @@ Handle<ObjectHashTable> ObjectHashTable::Put(Handle<ObjectHashTable> table,
|
| Handle<Object> key,
|
| Handle<Object> value) {
|
| ASSERT(table->IsKey(*key));
|
| + ASSERT(!value->IsTheHole());
|
|
|
| Isolate* isolate = table->GetIsolate();
|
|
|
| @@ -16181,13 +16183,6 @@ Handle<ObjectHashTable> ObjectHashTable::Put(Handle<ObjectHashTable> table,
|
|
|
| int entry = table->FindEntry(key);
|
|
|
| - // Check whether to perform removal operation.
|
| - if (value->IsTheHole()) {
|
| - if (entry == kNotFound) return table;
|
| - table->RemoveEntry(entry);
|
| - return Shrink(table, key);
|
| - }
|
| -
|
| // Key is already in table, just overwrite value.
|
| if (entry != kNotFound) {
|
| table->set(EntryToIndex(entry) + 1, *value);
|
| @@ -16203,6 +16198,29 @@ Handle<ObjectHashTable> ObjectHashTable::Put(Handle<ObjectHashTable> table,
|
| }
|
|
|
|
|
| +Handle<ObjectHashTable> ObjectHashTable::Remove(Handle<ObjectHashTable> table,
|
| + Handle<Object> key,
|
| + bool* was_present) {
|
| + ASSERT(table->IsKey(*key));
|
| +
|
| + Object* hash = key->GetHash();
|
| + if (hash->IsUndefined()) {
|
| + *was_present = false;
|
| + return table;
|
| + }
|
| +
|
| + int entry = table->FindEntry(key);
|
| + if (entry == kNotFound) {
|
| + *was_present = false;
|
| + return table;
|
| + }
|
| +
|
| + *was_present = true;
|
| + table->RemoveEntry(entry);
|
| + return Shrink(table, key);
|
| +}
|
| +
|
| +
|
| void ObjectHashTable::AddEntry(int entry, Object* key, Object* value) {
|
| set(EntryToIndex(entry), key);
|
| set(EntryToIndex(entry) + 1, value);
|
| @@ -16335,6 +16353,20 @@ Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Clear(
|
|
|
|
|
| template<class Derived, class Iterator, int entrysize>
|
| +Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Remove(
|
| + Handle<Derived> table, Handle<Object> key, bool* was_present) {
|
| + int entry = table->FindEntry(key);
|
| + if (entry == kNotFound) {
|
| + *was_present = false;
|
| + return table;
|
| + }
|
| + *was_present = true;
|
| + table->RemoveEntry(entry);
|
| + return Shrink(table);
|
| +}
|
| +
|
| +
|
| +template<class Derived, class Iterator, int entrysize>
|
| Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Rehash(
|
| Handle<Derived> table, int new_capacity) {
|
| ASSERT(!table->IsObsolete());
|
| @@ -16443,6 +16475,10 @@ template Handle<OrderedHashSet>
|
| OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Clear(
|
| Handle<OrderedHashSet> table);
|
|
|
| +template Handle<OrderedHashSet>
|
| +OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Remove(
|
| + Handle<OrderedHashSet> table, Handle<Object> key, bool* was_present);
|
| +
|
| template int
|
| OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::FindEntry(
|
| Handle<Object> key);
|
| @@ -16470,6 +16506,10 @@ template Handle<OrderedHashMap>
|
| OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Clear(
|
| Handle<OrderedHashMap> table);
|
|
|
| +template Handle<OrderedHashMap>
|
| +OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Remove(
|
| + Handle<OrderedHashMap> table, Handle<Object> key, bool* was_present);
|
| +
|
| template int
|
| OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::FindEntry(
|
| Handle<Object> key);
|
| @@ -16499,20 +16539,6 @@ Handle<OrderedHashSet> OrderedHashSet::Add(Handle<OrderedHashSet> table,
|
| }
|
|
|
|
|
| -Handle<OrderedHashSet> OrderedHashSet::Remove(Handle<OrderedHashSet> table,
|
| - Handle<Object> key,
|
| - bool* was_present) {
|
| - int entry = table->FindEntry(key);
|
| - if (entry == kNotFound) {
|
| - *was_present = false;
|
| - return table;
|
| - }
|
| - *was_present = true;
|
| - table->RemoveEntry(entry);
|
| - return Shrink(table);
|
| -}
|
| -
|
| -
|
| Object* OrderedHashMap::Lookup(Handle<Object> key) {
|
| DisallowHeapAllocation no_gc;
|
| int entry = FindEntry(key);
|
| @@ -16524,13 +16550,9 @@ Object* OrderedHashMap::Lookup(Handle<Object> key) {
|
| Handle<OrderedHashMap> OrderedHashMap::Put(Handle<OrderedHashMap> table,
|
| Handle<Object> key,
|
| Handle<Object> value) {
|
| - int entry = table->FindEntry(key);
|
| + ASSERT(!key->IsTheHole());
|
|
|
| - if (value->IsTheHole()) {
|
| - if (entry == kNotFound) return table;
|
| - table->RemoveEntry(entry);
|
| - return Shrink(table);
|
| - }
|
| + int entry = table->FindEntry(key);
|
|
|
| if (entry != kNotFound) {
|
| table->set(table->EntryToIndex(entry) + kValueOffset, *value);
|
|
|