Index: test/cctest/test-dictionary.cc |
diff --git a/test/cctest/test-dictionary.cc b/test/cctest/test-dictionary.cc |
index 6e62a2243c26eed0e00222abc2e44930be05a145..1de1cdb122321896f356c2abbd94e81dbd704817 100644 |
--- a/test/cctest/test-dictionary.cc |
+++ b/test/cctest/test-dictionary.cc |
@@ -38,16 +38,17 @@ |
using namespace v8::internal; |
+namespace { |
-TEST(ObjectHashTable) { |
- LocalContext context; |
+ |
+template<typename HashMap> |
+static void TestHashMap(Handle<HashMap> table) { |
Isolate* isolate = CcTest::i_isolate(); |
Factory* factory = isolate->factory(); |
- v8::HandleScope scope(context->GetIsolate()); |
- Handle<ObjectHashTable> table = factory->NewObjectHashTable(23); |
+ |
Handle<JSObject> a = factory->NewJSArray(7); |
Handle<JSObject> b = factory->NewJSArray(11); |
- table = ObjectHashTable::Put(table, a, b); |
+ 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()); |
@@ -59,14 +60,13 @@ TEST(ObjectHashTable) { |
CHECK_EQ(table->Lookup(*b), CcTest::heap()->the_hole_value()); |
// Keys that are overwritten should not change number of elements. |
- table = ObjectHashTable::Put(table, a, factory->NewJSArray(13)); |
+ table = HashMap::Put(table, a, factory->NewJSArray(13)); |
CHECK_EQ(table->NumberOfElements(), 1); |
CHECK_NE(table->Lookup(*a), *b); |
// Keys mapped to the hole should be removed permanently. |
- table = ObjectHashTable::Put(table, a, factory->the_hole_value()); |
+ table = HashMap::Put(table, a, factory->the_hole_value()); |
CHECK_EQ(table->NumberOfElements(), 0); |
- CHECK_EQ(table->NumberOfDeletedElements(), 1); |
CHECK_EQ(table->Lookup(*a), CcTest::heap()->the_hole_value()); |
// Keys should map back to their respective values and also should get |
@@ -74,9 +74,9 @@ TEST(ObjectHashTable) { |
for (int i = 0; i < 100; i++) { |
Handle<JSReceiver> key = factory->NewJSArray(7); |
Handle<JSObject> value = factory->NewJSArray(11); |
- table = ObjectHashTable::Put(table, key, value); |
+ table = HashMap::Put(table, key, value); |
CHECK_EQ(table->NumberOfElements(), i + 1); |
- CHECK_NE(table->FindEntry(*key), ObjectHashTable::kNotFound); |
+ CHECK_NE(table->FindEntry(*key), HashMap::kNotFound); |
CHECK_EQ(table->Lookup(*key), *value); |
CHECK(key->GetIdentityHash()->IsSmi()); |
} |
@@ -86,7 +86,7 @@ TEST(ObjectHashTable) { |
for (int i = 0; i < 100; i++) { |
Handle<JSReceiver> key = factory->NewJSArray(7); |
CHECK(JSReceiver::GetOrCreateIdentityHash(key)->IsSmi()); |
- CHECK_EQ(table->FindEntry(*key), ObjectHashTable::kNotFound); |
+ CHECK_EQ(table->FindEntry(*key), HashMap::kNotFound); |
CHECK_EQ(table->Lookup(*key), CcTest::heap()->the_hole_value()); |
CHECK(key->GetIdentityHash()->IsSmi()); |
} |
@@ -102,6 +102,15 @@ TEST(ObjectHashTable) { |
} |
+TEST(HashMap) { |
+ LocalContext context; |
+ v8::HandleScope scope(context->GetIsolate()); |
+ Isolate* isolate = CcTest::i_isolate(); |
+ TestHashMap(isolate->factory()->NewObjectHashTable(23)); |
+ TestHashMap(isolate->factory()->NewOrderedHashMap()); |
+} |
+ |
+ |
class ObjectHashTableTest: public ObjectHashTable { |
public: |
void insert(int entry, int key, int value) { |
@@ -154,13 +163,11 @@ TEST(HashTableRehash) { |
#ifdef DEBUG |
-TEST(ObjectHashSetCausesGC) { |
- i::FLAG_stress_compaction = false; |
- LocalContext context; |
+template<class HashSet> |
+static void TestHashSetCausesGC(Handle<HashSet> table) { |
Isolate* isolate = CcTest::i_isolate(); |
Factory* factory = isolate->factory(); |
- v8::HandleScope scope(context->GetIsolate()); |
- Handle<ObjectHashSet> table = factory->NewObjectHashSet(1); |
+ |
Handle<JSObject> key = factory->NewJSArray(0); |
v8::Handle<v8::Object> key_obj = v8::Utils::ToLocal(key); |
@@ -180,24 +187,32 @@ TEST(ObjectHashSetCausesGC) { |
CHECK(gc_count == isolate->heap()->gc_count()); |
// Calling Remove() will not cause GC in this case. |
- table = ObjectHashSet::Remove(table, key); |
+ table = HashSet::Remove(table, key); |
CHECK(gc_count == isolate->heap()->gc_count()); |
// Calling Add() should cause GC. |
- table = ObjectHashSet::Add(table, key); |
+ table = HashSet::Add(table, key); |
CHECK(gc_count < isolate->heap()->gc_count()); |
} |
-#endif |
-#ifdef DEBUG |
-TEST(ObjectHashTableCausesGC) { |
+TEST(ObjectHashSetCausesGC) { |
i::FLAG_stress_compaction = false; |
LocalContext context; |
+ v8::HandleScope scope(context->GetIsolate()); |
+ Isolate* isolate = CcTest::i_isolate(); |
+ TestHashSetCausesGC(isolate->factory()->NewObjectHashSet(1)); |
+ TestHashSetCausesGC(isolate->factory()->NewOrderedHashSet()); |
+} |
+#endif |
+ |
+ |
+#ifdef DEBUG |
+template<class HashMap> |
+static void TestHashMapCausesGC(Handle<HashMap> table) { |
Isolate* isolate = CcTest::i_isolate(); |
Factory* factory = isolate->factory(); |
- v8::HandleScope scope(context->GetIsolate()); |
- Handle<ObjectHashTable> table = factory->NewObjectHashTable(1); |
+ |
Handle<JSObject> key = factory->NewJSArray(0); |
v8::Handle<v8::Object> key_obj = v8::Utils::ToLocal(key); |
@@ -216,7 +231,20 @@ TEST(ObjectHashTableCausesGC) { |
// Calling Put() should request GC by returning a failure. |
int gc_count = isolate->heap()->gc_count(); |
- ObjectHashTable::Put(table, key, key); |
+ HashMap::Put(table, key, key); |
CHECK(gc_count < isolate->heap()->gc_count()); |
} |
+ |
+ |
+TEST(ObjectHashTableCausesGC) { |
+ i::FLAG_stress_compaction = false; |
+ LocalContext context; |
+ v8::HandleScope scope(context->GetIsolate()); |
+ Isolate* isolate = CcTest::i_isolate(); |
+ TestHashMapCausesGC(isolate->factory()->NewObjectHashTable(1)); |
+ TestHashMapCausesGC(isolate->factory()->NewOrderedHashMap()); |
+} |
#endif |
+ |
+ |
+} |