| 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
|
| +
|
| +
|
| +}
|
|
|