From: ishell@chromium.org Date: Tue, 29 Apr 2014 14:09:14 +0000 (+0000) Subject: OrderedHashMap::Lookup() and ObjectHashTable::Lookup() handlified. X-Git-Tag: upstream/4.7.83~9352 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c3d349f0287fe9c7450614adc3f38a195d203a73;p=platform%2Fupstream%2Fv8.git OrderedHashMap::Lookup() and ObjectHashTable::Lookup() handlified. R=yangguo@chromium.org Review URL: https://codereview.chromium.org/256743008 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@21055 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/objects.cc b/src/objects.cc index 6a808c4..a0ffcd9 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -5187,7 +5187,7 @@ Object* JSObject::GetHiddenProperty(Handle key) { if (inline_value->IsUndefined()) return GetHeap()->the_hole_value(); ObjectHashTable* hashtable = ObjectHashTable::cast(inline_value); - Object* entry = hashtable->Lookup(*key); + Object* entry = hashtable->Lookup(key); return entry; } @@ -16036,8 +16036,9 @@ Object* Dictionary::SlowReverseLookup(Object* value) { } -Object* ObjectHashTable::Lookup(Object* key) { - ASSERT(IsKey(key)); +Object* ObjectHashTable::Lookup(Handle key) { + DisallowHeapAllocation no_gc; + ASSERT(IsKey(*key)); // If the object does not have an identity hash, it was never used as a key. Object* hash = key->GetHash(); @@ -16411,8 +16412,9 @@ Handle OrderedHashSet::Remove(Handle table, } -Object* OrderedHashMap::Lookup(Object* key) { - int entry = FindEntry(key); +Object* OrderedHashMap::Lookup(Handle key) { + DisallowHeapAllocation no_gc; + int entry = FindEntry(*key); if (entry == kNotFound) return GetHeap()->the_hole_value(); return ValueAt(entry); } diff --git a/src/objects.h b/src/objects.h index b5a0497..6db16fc 100644 --- a/src/objects.h +++ b/src/objects.h @@ -4200,7 +4200,7 @@ class ObjectHashTable: public HashTable key); int FindEntry(Handle key); // TODO(ishell): Remove this when all the callers are handlified. @@ -4388,7 +4388,7 @@ class OrderedHashMap:public OrderedHashTable< return reinterpret_cast(obj); } - Object* Lookup(Object* key); + Object* Lookup(Handle key); static Handle Put( Handle table, Handle key, diff --git a/src/runtime.cc b/src/runtime.cc index 94302df..c463e05 100644 --- a/src/runtime.cc +++ b/src/runtime.cc @@ -1612,7 +1612,7 @@ RUNTIME_FUNCTION(Runtime_MapGet) { CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); Handle table(OrderedHashMap::cast(holder->table())); - Handle lookup(table->Lookup(*key), isolate); + Handle lookup(table->Lookup(key), isolate); return lookup->IsTheHole() ? isolate->heap()->undefined_value() : *lookup; } @@ -1623,7 +1623,7 @@ RUNTIME_FUNCTION(Runtime_MapHas) { CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); Handle table(OrderedHashMap::cast(holder->table())); - Handle lookup(table->Lookup(*key), isolate); + Handle lookup(table->Lookup(key), isolate); return isolate->heap()->ToBoolean(!lookup->IsTheHole()); } @@ -1634,7 +1634,7 @@ RUNTIME_FUNCTION(Runtime_MapDelete) { CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); Handle table(OrderedHashMap::cast(holder->table())); - Handle lookup(table->Lookup(*key), isolate); + Handle lookup(table->Lookup(key), isolate); Handle new_table = OrderedHashMap::Put(table, key, isolate->factory()->the_hole_value()); holder->set_table(*new_table); @@ -1731,7 +1731,7 @@ RUNTIME_FUNCTION(Runtime_WeakCollectionGet) { CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); Handle table( ObjectHashTable::cast(weak_collection->table())); - Handle lookup(table->Lookup(*key), isolate); + Handle lookup(table->Lookup(key), isolate); return lookup->IsTheHole() ? isolate->heap()->undefined_value() : *lookup; } @@ -1743,7 +1743,7 @@ RUNTIME_FUNCTION(Runtime_WeakCollectionHas) { CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); Handle table( ObjectHashTable::cast(weak_collection->table())); - Handle lookup(table->Lookup(*key), isolate); + Handle lookup(table->Lookup(key), isolate); return isolate->heap()->ToBoolean(!lookup->IsTheHole()); } @@ -1755,7 +1755,7 @@ RUNTIME_FUNCTION(Runtime_WeakCollectionDelete) { CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); Handle table(ObjectHashTable::cast( weak_collection->table())); - Handle lookup(table->Lookup(*key), isolate); + Handle lookup(table->Lookup(key), isolate); Handle new_table = ObjectHashTable::Put(table, key, isolate->factory()->the_hole_value()); weak_collection->set_table(*new_table); diff --git a/test/cctest/test-dictionary.cc b/test/cctest/test-dictionary.cc index a40f282..0f77772 100644 --- a/test/cctest/test-dictionary.cc +++ b/test/cctest/test-dictionary.cc @@ -50,24 +50,24 @@ static void TestHashMap(Handle table) { Handle b = factory->NewJSArray(11); table = HashMap::Put(table, a, b); CHECK_EQ(table->NumberOfElements(), 1); - CHECK_EQ(table->Lookup(*a), *b); - CHECK_EQ(table->Lookup(*b), CcTest::heap()->the_hole_value()); + CHECK_EQ(table->Lookup(a), *b); + CHECK_EQ(table->Lookup(b), CcTest::heap()->the_hole_value()); // Keys still have to be valid after objects were moved. CcTest::heap()->CollectGarbage(NEW_SPACE); CHECK_EQ(table->NumberOfElements(), 1); - CHECK_EQ(table->Lookup(*a), *b); - CHECK_EQ(table->Lookup(*b), CcTest::heap()->the_hole_value()); + CHECK_EQ(table->Lookup(a), *b); + CHECK_EQ(table->Lookup(b), CcTest::heap()->the_hole_value()); // Keys that are overwritten should not change number of elements. table = HashMap::Put(table, a, factory->NewJSArray(13)); CHECK_EQ(table->NumberOfElements(), 1); - CHECK_NE(table->Lookup(*a), *b); + CHECK_NE(table->Lookup(a), *b); // Keys mapped to the hole should be removed permanently. table = HashMap::Put(table, a, factory->the_hole_value()); CHECK_EQ(table->NumberOfElements(), 0); - CHECK_EQ(table->Lookup(*a), CcTest::heap()->the_hole_value()); + CHECK_EQ(table->Lookup(a), CcTest::heap()->the_hole_value()); // Keys should map back to their respective values and also should get // an identity hash code generated. @@ -77,7 +77,7 @@ static void TestHashMap(Handle table) { table = HashMap::Put(table, key, value); CHECK_EQ(table->NumberOfElements(), i + 1); CHECK_NE(table->FindEntry(*key), HashMap::kNotFound); - CHECK_EQ(table->Lookup(*key), *value); + CHECK_EQ(table->Lookup(key), *value); CHECK(key->GetIdentityHash()->IsSmi()); } @@ -87,7 +87,7 @@ static void TestHashMap(Handle table) { Handle key = factory->NewJSArray(7); CHECK(JSReceiver::GetOrCreateIdentityHash(key)->IsSmi()); CHECK_EQ(table->FindEntry(*key), HashMap::kNotFound); - CHECK_EQ(table->Lookup(*key), CcTest::heap()->the_hole_value()); + CHECK_EQ(table->Lookup(key), CcTest::heap()->the_hole_value()); CHECK(key->GetIdentityHash()->IsSmi()); } @@ -95,7 +95,7 @@ static void TestHashMap(Handle table) { // should not get an identity hash code generated. for (int i = 0; i < 100; i++) { Handle key = factory->NewJSArray(7); - CHECK_EQ(table->Lookup(*key), CcTest::heap()->the_hole_value()); + CHECK_EQ(table->Lookup(key), CcTest::heap()->the_hole_value()); CHECK_EQ(key->GetIdentityHash(), CcTest::heap()->undefined_value()); } @@ -119,7 +119,8 @@ class ObjectHashTableTest: public ObjectHashTable { } int lookup(int key) { - return Smi::cast(Lookup(Smi::FromInt(key)))->value(); + Handle key_obj(Smi::FromInt(key), GetIsolate()); + return Smi::cast(Lookup(key_obj))->value(); } int capacity() { @@ -225,7 +226,7 @@ static void TestHashMapCausesGC(Handle table) { SimulateFullSpace(CcTest::heap()->old_pointer_space()); // Calling Lookup() should not cause GC ever. - CHECK(table->Lookup(*key)->IsTheHole()); + CHECK(table->Lookup(key)->IsTheHole()); // Calling Put() should request GC by returning a failure. int gc_count = isolate->heap()->gc_count(); diff --git a/test/cctest/test-ordered-hash-table.cc b/test/cctest/test-ordered-hash-table.cc index b7c043d..79523be 100644 --- a/test/cctest/test-ordered-hash-table.cc +++ b/test/cctest/test-ordered-hash-table.cc @@ -162,14 +162,14 @@ TEST(Map) { Handle map = factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); Handle obj = factory->NewJSObjectFromMap(map); Handle val = factory->NewJSObjectFromMap(map); - CHECK(ordered_map->Lookup(*obj)->IsTheHole()); + CHECK(ordered_map->Lookup(obj)->IsTheHole()); ordered_map = OrderedHashMap::Put(ordered_map, obj, val); CHECK_EQ(1, ordered_map->NumberOfElements()); - CHECK(ordered_map->Lookup(*obj)->SameValue(*val)); + CHECK(ordered_map->Lookup(obj)->SameValue(*val)); ordered_map = OrderedHashMap::Put( ordered_map, obj, factory->the_hole_value()); CHECK_EQ(0, ordered_map->NumberOfElements()); - CHECK(ordered_map->Lookup(*obj)->IsTheHole()); + CHECK(ordered_map->Lookup(obj)->IsTheHole()); // Test for collisions/chaining Handle obj1 = factory->NewJSObjectFromMap(map); @@ -182,9 +182,9 @@ TEST(Map) { ordered_map = OrderedHashMap::Put(ordered_map, obj2, val2); ordered_map = OrderedHashMap::Put(ordered_map, obj3, val3); CHECK_EQ(3, ordered_map->NumberOfElements()); - CHECK(ordered_map->Lookup(*obj1)->SameValue(*val1)); - CHECK(ordered_map->Lookup(*obj2)->SameValue(*val2)); - CHECK(ordered_map->Lookup(*obj3)->SameValue(*val3)); + CHECK(ordered_map->Lookup(obj1)->SameValue(*val1)); + CHECK(ordered_map->Lookup(obj2)->SameValue(*val2)); + CHECK(ordered_map->Lookup(obj3)->SameValue(*val3)); // Test iteration CheckIterResultObject( @@ -203,11 +203,11 @@ TEST(Map) { Handle obj4 = factory->NewJSObjectFromMap(map); Handle val4 = factory->NewJSObjectFromMap(map); ordered_map = OrderedHashMap::Put(ordered_map, obj4, val4); - CHECK(ordered_map->Lookup(*obj)->SameValue(*val)); - CHECK(ordered_map->Lookup(*obj1)->SameValue(*val1)); - CHECK(ordered_map->Lookup(*obj2)->SameValue(*val2)); - CHECK(ordered_map->Lookup(*obj3)->SameValue(*val3)); - CHECK(ordered_map->Lookup(*obj4)->SameValue(*val4)); + CHECK(ordered_map->Lookup(obj)->SameValue(*val)); + CHECK(ordered_map->Lookup(obj1)->SameValue(*val1)); + CHECK(ordered_map->Lookup(obj2)->SameValue(*val2)); + CHECK(ordered_map->Lookup(obj3)->SameValue(*val3)); + CHECK(ordered_map->Lookup(obj4)->SameValue(*val4)); CHECK_EQ(5, ordered_map->NumberOfElements()); CHECK_EQ(4, ordered_map->NumberOfBuckets());