LCOV - code coverage report
Current view: top level - test/cctest - test-orderedhashtable.cc (source / functions) Hit Total Coverage
Test: app.info Lines: 552 554 99.6 %
Date: 2017-10-20 Functions: 15 16 93.8 %

          Line data    Source code
       1             : // Copyright 2017 the V8 project authors. All rights reserved.
       2             : // Use of this source code is governed by a BSD-style license that can be
       3             : // found in the LICENSE file.
       4             : #include <utility>
       5             : #include "src/v8.h"
       6             : 
       7             : #include "src/objects-inl.h"
       8             : #include "test/cctest/cctest.h"
       9             : 
      10             : namespace v8 {
      11             : namespace internal {
      12             : namespace test_orderedhashtable {
      13             : 
      14             : static Isolate* GetIsolateFrom(LocalContext* context) {
      15          72 :   return reinterpret_cast<Isolate*>((*context)->GetIsolate());
      16             : }
      17             : 
      18          30 : void CopyHashCode(Handle<JSReceiver> from, Handle<JSReceiver> to) {
      19          30 :   int hash = Smi::ToInt(from->GetHash());
      20          30 :   to->SetIdentityHash(hash);
      21          30 : }
      22             : 
      23           0 : void Verify(Handle<HeapObject> obj) {
      24             : #if VERIFY_HEAP
      25             :   obj->ObjectVerify();
      26             : #endif
      27           0 : }
      28             : 
      29       23724 : TEST(SmallOrderedHashSetInsertion) {
      30           6 :   LocalContext context;
      31             :   Isolate* isolate = GetIsolateFrom(&context);
      32             :   Factory* factory = isolate->factory();
      33             :   HandleScope scope(isolate);
      34             : 
      35           6 :   Handle<SmallOrderedHashSet> set = factory->NewSmallOrderedHashSet();
      36             :   Verify(set);
      37           6 :   CHECK_EQ(2, set->NumberOfBuckets());
      38           6 :   CHECK_EQ(0, set->NumberOfElements());
      39             : 
      40             :   // Add a new key.
      41             :   Handle<Smi> key1(Smi::FromInt(1), isolate);
      42           6 :   CHECK(!set->HasKey(isolate, key1));
      43           6 :   set = SmallOrderedHashSet::Add(set, key1);
      44             :   Verify(set);
      45           6 :   CHECK_EQ(2, set->NumberOfBuckets());
      46           6 :   CHECK_EQ(1, set->NumberOfElements());
      47           6 :   CHECK(set->HasKey(isolate, key1));
      48             : 
      49             :   // Add existing key.
      50           6 :   set = SmallOrderedHashSet::Add(set, key1);
      51             :   Verify(set);
      52           6 :   CHECK_EQ(2, set->NumberOfBuckets());
      53           6 :   CHECK_EQ(1, set->NumberOfElements());
      54           6 :   CHECK(set->HasKey(isolate, key1));
      55             : 
      56           6 :   Handle<String> key2 = factory->NewStringFromAsciiChecked("foo");
      57           6 :   CHECK(!set->HasKey(isolate, key2));
      58           6 :   set = SmallOrderedHashSet::Add(set, key2);
      59             :   Verify(set);
      60           6 :   CHECK_EQ(2, set->NumberOfBuckets());
      61           6 :   CHECK_EQ(2, set->NumberOfElements());
      62           6 :   CHECK(set->HasKey(isolate, key1));
      63           6 :   CHECK(set->HasKey(isolate, key2));
      64             : 
      65           6 :   set = SmallOrderedHashSet::Add(set, key2);
      66             :   Verify(set);
      67           6 :   CHECK_EQ(2, set->NumberOfBuckets());
      68           6 :   CHECK_EQ(2, set->NumberOfElements());
      69           6 :   CHECK(set->HasKey(isolate, key1));
      70           6 :   CHECK(set->HasKey(isolate, key2));
      71             : 
      72           6 :   Handle<Symbol> key3 = factory->NewSymbol();
      73           6 :   CHECK(!set->HasKey(isolate, key3));
      74           6 :   set = SmallOrderedHashSet::Add(set, key3);
      75             :   Verify(set);
      76           6 :   CHECK_EQ(2, set->NumberOfBuckets());
      77           6 :   CHECK_EQ(3, set->NumberOfElements());
      78           6 :   CHECK(set->HasKey(isolate, key1));
      79           6 :   CHECK(set->HasKey(isolate, key2));
      80           6 :   CHECK(set->HasKey(isolate, key3));
      81             : 
      82           6 :   set = SmallOrderedHashSet::Add(set, key3);
      83             :   Verify(set);
      84           6 :   CHECK_EQ(2, set->NumberOfBuckets());
      85           6 :   CHECK_EQ(3, set->NumberOfElements());
      86           6 :   CHECK(set->HasKey(isolate, key1));
      87           6 :   CHECK(set->HasKey(isolate, key2));
      88           6 :   CHECK(set->HasKey(isolate, key3));
      89             : 
      90             :   Handle<Object> key4 = factory->NewHeapNumber(42.0);
      91           6 :   CHECK(!set->HasKey(isolate, key4));
      92           6 :   set = SmallOrderedHashSet::Add(set, key4);
      93             :   Verify(set);
      94           6 :   CHECK_EQ(2, set->NumberOfBuckets());
      95           6 :   CHECK_EQ(4, set->NumberOfElements());
      96           6 :   CHECK(set->HasKey(isolate, key1));
      97           6 :   CHECK(set->HasKey(isolate, key2));
      98           6 :   CHECK(set->HasKey(isolate, key3));
      99           6 :   CHECK(set->HasKey(isolate, key4));
     100             : 
     101           6 :   set = SmallOrderedHashSet::Add(set, key4);
     102             :   Verify(set);
     103           6 :   CHECK_EQ(2, set->NumberOfBuckets());
     104           6 :   CHECK_EQ(4, set->NumberOfElements());
     105           6 :   CHECK(set->HasKey(isolate, key1));
     106           6 :   CHECK(set->HasKey(isolate, key2));
     107           6 :   CHECK(set->HasKey(isolate, key3));
     108          12 :   CHECK(set->HasKey(isolate, key4));
     109           6 : }
     110             : 
     111       23724 : TEST(SmallOrderedHashMapInsertion) {
     112           6 :   LocalContext context;
     113             :   Isolate* isolate = GetIsolateFrom(&context);
     114             :   Factory* factory = isolate->factory();
     115             :   HandleScope scope(isolate);
     116             : 
     117           6 :   Handle<SmallOrderedHashMap> map = factory->NewSmallOrderedHashMap();
     118             :   Verify(map);
     119           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     120           6 :   CHECK_EQ(0, map->NumberOfElements());
     121             : 
     122             :   // Add a new key.
     123             :   Handle<Smi> key1(Smi::FromInt(1), isolate);
     124             :   Handle<Smi> value1(Smi::FromInt(1), isolate);
     125           6 :   CHECK(!map->HasKey(isolate, key1));
     126           6 :   map = SmallOrderedHashMap::Add(map, key1, value1);
     127             :   Verify(map);
     128           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     129           6 :   CHECK_EQ(1, map->NumberOfElements());
     130           6 :   CHECK(map->HasKey(isolate, key1));
     131             : 
     132             :   // Add existing key.
     133           6 :   map = SmallOrderedHashMap::Add(map, key1, value1);
     134             :   Verify(map);
     135           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     136           6 :   CHECK_EQ(1, map->NumberOfElements());
     137           6 :   CHECK(map->HasKey(isolate, key1));
     138             : 
     139           6 :   Handle<String> key2 = factory->NewStringFromAsciiChecked("foo");
     140           6 :   Handle<String> value = factory->NewStringFromAsciiChecked("foo");
     141           6 :   CHECK(!map->HasKey(isolate, key2));
     142           6 :   map = SmallOrderedHashMap::Add(map, key2, value);
     143             :   Verify(map);
     144           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     145           6 :   CHECK_EQ(2, map->NumberOfElements());
     146           6 :   CHECK(map->HasKey(isolate, key1));
     147           6 :   CHECK(map->HasKey(isolate, key2));
     148             : 
     149           6 :   map = SmallOrderedHashMap::Add(map, key2, value);
     150             :   Verify(map);
     151           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     152           6 :   CHECK_EQ(2, map->NumberOfElements());
     153           6 :   CHECK(map->HasKey(isolate, key1));
     154           6 :   CHECK(map->HasKey(isolate, key2));
     155             : 
     156           6 :   Handle<Symbol> key3 = factory->NewSymbol();
     157           6 :   CHECK(!map->HasKey(isolate, key3));
     158           6 :   map = SmallOrderedHashMap::Add(map, key3, value);
     159             :   Verify(map);
     160           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     161           6 :   CHECK_EQ(3, map->NumberOfElements());
     162           6 :   CHECK(map->HasKey(isolate, key1));
     163           6 :   CHECK(map->HasKey(isolate, key2));
     164           6 :   CHECK(map->HasKey(isolate, key3));
     165             : 
     166           6 :   map = SmallOrderedHashMap::Add(map, key3, value);
     167             :   Verify(map);
     168           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     169           6 :   CHECK_EQ(3, map->NumberOfElements());
     170           6 :   CHECK(map->HasKey(isolate, key1));
     171           6 :   CHECK(map->HasKey(isolate, key2));
     172           6 :   CHECK(map->HasKey(isolate, key3));
     173             : 
     174             :   Handle<Object> key4 = factory->NewHeapNumber(42.0);
     175           6 :   CHECK(!map->HasKey(isolate, key4));
     176           6 :   map = SmallOrderedHashMap::Add(map, key4, value);
     177             :   Verify(map);
     178           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     179           6 :   CHECK_EQ(4, map->NumberOfElements());
     180           6 :   CHECK(map->HasKey(isolate, key1));
     181           6 :   CHECK(map->HasKey(isolate, key2));
     182           6 :   CHECK(map->HasKey(isolate, key3));
     183           6 :   CHECK(map->HasKey(isolate, key4));
     184             : 
     185           6 :   map = SmallOrderedHashMap::Add(map, key4, value);
     186             :   Verify(map);
     187           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     188           6 :   CHECK_EQ(4, map->NumberOfElements());
     189           6 :   CHECK(map->HasKey(isolate, key1));
     190           6 :   CHECK(map->HasKey(isolate, key2));
     191           6 :   CHECK(map->HasKey(isolate, key3));
     192          12 :   CHECK(map->HasKey(isolate, key4));
     193           6 : }
     194             : 
     195       23724 : TEST(SmallOrderedHashSetDuplicateHashCode) {
     196           6 :   LocalContext context;
     197             :   Isolate* isolate = GetIsolateFrom(&context);
     198             :   Factory* factory = isolate->factory();
     199             :   HandleScope scope(isolate);
     200             : 
     201           6 :   Handle<SmallOrderedHashSet> set = factory->NewSmallOrderedHashSet();
     202           6 :   Handle<JSObject> key1 = factory->NewJSObjectWithNullProto();
     203           6 :   set = SmallOrderedHashSet::Add(set, key1);
     204             :   Verify(set);
     205           6 :   CHECK_EQ(2, set->NumberOfBuckets());
     206           6 :   CHECK_EQ(1, set->NumberOfElements());
     207           6 :   CHECK(set->HasKey(isolate, key1));
     208             : 
     209           6 :   Handle<JSObject> key2 = factory->NewJSObjectWithNullProto();
     210           6 :   CopyHashCode(key1, key2);
     211             : 
     212           6 :   set = SmallOrderedHashSet::Add(set, key2);
     213             :   Verify(set);
     214           6 :   CHECK_EQ(2, set->NumberOfBuckets());
     215           6 :   CHECK_EQ(2, set->NumberOfElements());
     216           6 :   CHECK(set->HasKey(isolate, key1));
     217          12 :   CHECK(set->HasKey(isolate, key2));
     218           6 : }
     219             : 
     220       23724 : TEST(SmallOrderedHashMapDuplicateHashCode) {
     221           6 :   LocalContext context;
     222             :   Isolate* isolate = GetIsolateFrom(&context);
     223             :   Factory* factory = isolate->factory();
     224             :   HandleScope scope(isolate);
     225             : 
     226           6 :   Handle<SmallOrderedHashMap> map = factory->NewSmallOrderedHashMap();
     227           6 :   Handle<JSObject> value = factory->NewJSObjectWithNullProto();
     228           6 :   Handle<JSObject> key1 = factory->NewJSObjectWithNullProto();
     229           6 :   map = SmallOrderedHashMap::Add(map, key1, value);
     230             :   Verify(map);
     231           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     232           6 :   CHECK_EQ(1, map->NumberOfElements());
     233           6 :   CHECK(map->HasKey(isolate, key1));
     234             : 
     235           6 :   Handle<JSObject> key2 = factory->NewJSObjectWithNullProto();
     236           6 :   CopyHashCode(key1, key2);
     237             : 
     238           6 :   CHECK(!key1->SameValue(*key2));
     239           6 :   Object* hash1 = key1->GetHash();
     240           6 :   Object* hash2 = key2->GetHash();
     241           6 :   CHECK_EQ(hash1, hash2);
     242             : 
     243           6 :   map = SmallOrderedHashMap::Add(map, key2, value);
     244             :   Verify(map);
     245           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     246           6 :   CHECK_EQ(2, map->NumberOfElements());
     247           6 :   CHECK(map->HasKey(isolate, key1));
     248          12 :   CHECK(map->HasKey(isolate, key2));
     249           6 : }
     250             : 
     251       23724 : TEST(SmallOrderedHashSetGrow) {
     252           6 :   LocalContext context;
     253             :   Isolate* isolate = GetIsolateFrom(&context);
     254             :   Factory* factory = isolate->factory();
     255             :   HandleScope scope(isolate);
     256             : 
     257           6 :   Handle<SmallOrderedHashSet> set = factory->NewSmallOrderedHashSet();
     258             :   std::vector<Handle<Object>> keys;
     259        1530 :   for (int i = 0; i < 254; i++) {
     260             :     Handle<Smi> key(Smi::FromInt(i), isolate);
     261        1524 :     keys.push_back(key);
     262             :   }
     263             : 
     264          24 :   for (size_t i = 0; i < 4; i++) {
     265          48 :     set = SmallOrderedHashSet::Add(set, keys[i]);
     266             :     Verify(set);
     267             :   }
     268             : 
     269          24 :   for (size_t i = 0; i < 4; i++) {
     270          48 :     CHECK(set->HasKey(isolate, keys[i]));
     271             :     Verify(set);
     272             :   }
     273             : 
     274           6 :   CHECK_EQ(4, set->NumberOfElements());
     275           6 :   CHECK_EQ(2, set->NumberOfBuckets());
     276           6 :   CHECK_EQ(0, set->NumberOfDeletedElements());
     277             :   Verify(set);
     278             : 
     279          24 :   for (size_t i = 4; i < 8; i++) {
     280          48 :     set = SmallOrderedHashSet::Add(set, keys[i]);
     281             :     Verify(set);
     282             :   }
     283             : 
     284          48 :   for (size_t i = 0; i < 8; i++) {
     285          96 :     CHECK(set->HasKey(isolate, keys[i]));
     286             :     Verify(set);
     287             :   }
     288             : 
     289           6 :   CHECK_EQ(8, set->NumberOfElements());
     290           6 :   CHECK_EQ(4, set->NumberOfBuckets());
     291           6 :   CHECK_EQ(0, set->NumberOfDeletedElements());
     292             :   Verify(set);
     293             : 
     294          48 :   for (size_t i = 8; i < 16; i++) {
     295          96 :     set = SmallOrderedHashSet::Add(set, keys[i]);
     296             :     Verify(set);
     297             :   }
     298             : 
     299          96 :   for (size_t i = 0; i < 16; i++) {
     300         192 :     CHECK(set->HasKey(isolate, keys[i]));
     301             :     Verify(set);
     302             :   }
     303             : 
     304           6 :   CHECK_EQ(16, set->NumberOfElements());
     305           6 :   CHECK_EQ(8, set->NumberOfBuckets());
     306           6 :   CHECK_EQ(0, set->NumberOfDeletedElements());
     307             :   Verify(set);
     308             : 
     309          96 :   for (size_t i = 16; i < 32; i++) {
     310         192 :     set = SmallOrderedHashSet::Add(set, keys[i]);
     311             :     Verify(set);
     312             :   }
     313             : 
     314         192 :   for (size_t i = 0; i < 32; i++) {
     315         384 :     CHECK(set->HasKey(isolate, keys[i]));
     316             :     Verify(set);
     317             :   }
     318             : 
     319           6 :   CHECK_EQ(32, set->NumberOfElements());
     320           6 :   CHECK_EQ(16, set->NumberOfBuckets());
     321           6 :   CHECK_EQ(0, set->NumberOfDeletedElements());
     322             :   Verify(set);
     323             : 
     324         192 :   for (size_t i = 32; i < 64; i++) {
     325         384 :     set = SmallOrderedHashSet::Add(set, keys[i]);
     326             :     Verify(set);
     327             :   }
     328             : 
     329         384 :   for (size_t i = 0; i < 64; i++) {
     330         768 :     CHECK(set->HasKey(isolate, keys[i]));
     331             :     Verify(set);
     332             :   }
     333             : 
     334           6 :   CHECK_EQ(64, set->NumberOfElements());
     335           6 :   CHECK_EQ(32, set->NumberOfBuckets());
     336           6 :   CHECK_EQ(0, set->NumberOfDeletedElements());
     337             :   Verify(set);
     338             : 
     339         384 :   for (size_t i = 64; i < 128; i++) {
     340         768 :     set = SmallOrderedHashSet::Add(set, keys[i]);
     341             :     Verify(set);
     342             :   }
     343             : 
     344         768 :   for (size_t i = 0; i < 128; i++) {
     345        1536 :     CHECK(set->HasKey(isolate, keys[i]));
     346             :     Verify(set);
     347             :   }
     348             : 
     349           6 :   CHECK_EQ(128, set->NumberOfElements());
     350           6 :   CHECK_EQ(64, set->NumberOfBuckets());
     351           6 :   CHECK_EQ(0, set->NumberOfDeletedElements());
     352             :   Verify(set);
     353             : 
     354         756 :   for (size_t i = 128; i < 254; i++) {
     355        1512 :     set = SmallOrderedHashSet::Add(set, keys[i]);
     356             :     Verify(set);
     357             :   }
     358             : 
     359        1524 :   for (size_t i = 0; i < 254; i++) {
     360        3048 :     CHECK(set->HasKey(isolate, keys[i]));
     361             :     Verify(set);
     362             :   }
     363             : 
     364           6 :   CHECK_EQ(254, set->NumberOfElements());
     365           6 :   CHECK_EQ(127, set->NumberOfBuckets());
     366           6 :   CHECK_EQ(0, set->NumberOfDeletedElements());
     367           6 :   Verify(set);
     368           6 : }
     369             : 
     370       23724 : TEST(SmallOrderedHashMapGrow) {
     371           6 :   LocalContext context;
     372             :   Isolate* isolate = GetIsolateFrom(&context);
     373             :   Factory* factory = isolate->factory();
     374             :   HandleScope scope(isolate);
     375             : 
     376           6 :   Handle<SmallOrderedHashMap> map = factory->NewSmallOrderedHashMap();
     377             :   std::vector<Handle<Object>> keys;
     378        1530 :   for (int i = 0; i < 254; i++) {
     379             :     Handle<Smi> key(Smi::FromInt(i), isolate);
     380        1524 :     keys.push_back(key);
     381             :   }
     382             : 
     383          24 :   for (size_t i = 0; i < 4; i++) {
     384          48 :     map = SmallOrderedHashMap::Add(map, keys[i], keys[i]);
     385             :     Verify(map);
     386             :   }
     387             : 
     388          24 :   for (size_t i = 0; i < 4; i++) {
     389          48 :     CHECK(map->HasKey(isolate, keys[i]));
     390             :     Verify(map);
     391             :   }
     392             : 
     393           6 :   CHECK_EQ(4, map->NumberOfElements());
     394           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     395           6 :   CHECK_EQ(0, map->NumberOfDeletedElements());
     396             :   Verify(map);
     397             : 
     398          24 :   for (size_t i = 4; i < 8; i++) {
     399          48 :     map = SmallOrderedHashMap::Add(map, keys[i], keys[i]);
     400             :     Verify(map);
     401             :   }
     402             : 
     403          48 :   for (size_t i = 0; i < 8; i++) {
     404          96 :     CHECK(map->HasKey(isolate, keys[i]));
     405             :     Verify(map);
     406             :   }
     407             : 
     408           6 :   CHECK_EQ(8, map->NumberOfElements());
     409           6 :   CHECK_EQ(4, map->NumberOfBuckets());
     410           6 :   CHECK_EQ(0, map->NumberOfDeletedElements());
     411             :   Verify(map);
     412             : 
     413          48 :   for (size_t i = 8; i < 16; i++) {
     414          96 :     map = SmallOrderedHashMap::Add(map, keys[i], keys[i]);
     415             :     Verify(map);
     416             :   }
     417             : 
     418          96 :   for (size_t i = 0; i < 16; i++) {
     419         192 :     CHECK(map->HasKey(isolate, keys[i]));
     420             :     Verify(map);
     421             :   }
     422             : 
     423           6 :   CHECK_EQ(16, map->NumberOfElements());
     424           6 :   CHECK_EQ(8, map->NumberOfBuckets());
     425           6 :   CHECK_EQ(0, map->NumberOfDeletedElements());
     426             :   Verify(map);
     427             : 
     428          96 :   for (size_t i = 16; i < 32; i++) {
     429         192 :     map = SmallOrderedHashMap::Add(map, keys[i], keys[i]);
     430             :     Verify(map);
     431             :   }
     432             : 
     433         192 :   for (size_t i = 0; i < 32; i++) {
     434         384 :     CHECK(map->HasKey(isolate, keys[i]));
     435             :     Verify(map);
     436             :   }
     437             : 
     438           6 :   CHECK_EQ(32, map->NumberOfElements());
     439           6 :   CHECK_EQ(16, map->NumberOfBuckets());
     440           6 :   CHECK_EQ(0, map->NumberOfDeletedElements());
     441             :   Verify(map);
     442             : 
     443         192 :   for (size_t i = 32; i < 64; i++) {
     444         384 :     map = SmallOrderedHashMap::Add(map, keys[i], keys[i]);
     445             :     Verify(map);
     446             :   }
     447             : 
     448         384 :   for (size_t i = 0; i < 64; i++) {
     449         768 :     CHECK(map->HasKey(isolate, keys[i]));
     450             :     Verify(map);
     451             :   }
     452             : 
     453           6 :   CHECK_EQ(64, map->NumberOfElements());
     454           6 :   CHECK_EQ(32, map->NumberOfBuckets());
     455           6 :   CHECK_EQ(0, map->NumberOfDeletedElements());
     456             :   Verify(map);
     457             : 
     458         384 :   for (size_t i = 64; i < 128; i++) {
     459         768 :     map = SmallOrderedHashMap::Add(map, keys[i], keys[i]);
     460             :     Verify(map);
     461             :   }
     462             : 
     463         768 :   for (size_t i = 0; i < 128; i++) {
     464        1536 :     CHECK(map->HasKey(isolate, keys[i]));
     465             :     Verify(map);
     466             :   }
     467             : 
     468           6 :   CHECK_EQ(128, map->NumberOfElements());
     469           6 :   CHECK_EQ(64, map->NumberOfBuckets());
     470           6 :   CHECK_EQ(0, map->NumberOfDeletedElements());
     471             :   Verify(map);
     472             : 
     473         756 :   for (size_t i = 128; i < 254; i++) {
     474        1512 :     map = SmallOrderedHashMap::Add(map, keys[i], keys[i]);
     475             :     Verify(map);
     476             :   }
     477             : 
     478        1524 :   for (size_t i = 0; i < 254; i++) {
     479        3048 :     CHECK(map->HasKey(isolate, keys[i]));
     480             :     Verify(map);
     481             :   }
     482             : 
     483           6 :   CHECK_EQ(254, map->NumberOfElements());
     484           6 :   CHECK_EQ(127, map->NumberOfBuckets());
     485           6 :   CHECK_EQ(0, map->NumberOfDeletedElements());
     486           6 :   Verify(map);
     487           6 : }
     488             : 
     489       23724 : TEST(OrderedHashTableInsertion) {
     490           6 :   LocalContext context;
     491             :   Isolate* isolate = GetIsolateFrom(&context);
     492             :   Factory* factory = isolate->factory();
     493             :   HandleScope scope(isolate);
     494             : 
     495           6 :   Handle<OrderedHashMap> map = factory->NewOrderedHashMap();
     496             :   Verify(map);
     497           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     498           6 :   CHECK_EQ(0, map->NumberOfElements());
     499             : 
     500             :   // Add a new key.
     501             :   Handle<Smi> key1(Smi::FromInt(1), isolate);
     502             :   Handle<Smi> value1(Smi::FromInt(1), isolate);
     503           6 :   CHECK(!OrderedHashMap::HasKey(isolate, *map, *key1));
     504           6 :   map = OrderedHashMap::Add(map, key1, value1);
     505             :   Verify(map);
     506           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     507           6 :   CHECK_EQ(1, map->NumberOfElements());
     508           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key1));
     509             : 
     510             :   // Add existing key.
     511           6 :   map = OrderedHashMap::Add(map, key1, value1);
     512             :   Verify(map);
     513           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     514           6 :   CHECK_EQ(1, map->NumberOfElements());
     515           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key1));
     516             : 
     517           6 :   Handle<String> key2 = factory->NewStringFromAsciiChecked("foo");
     518           6 :   Handle<String> value = factory->NewStringFromAsciiChecked("bar");
     519           6 :   CHECK(!OrderedHashMap::HasKey(isolate, *map, *key2));
     520           6 :   map = OrderedHashMap::Add(map, key2, value);
     521             :   Verify(map);
     522           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     523           6 :   CHECK_EQ(2, map->NumberOfElements());
     524           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key1));
     525           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key2));
     526             : 
     527           6 :   map = OrderedHashMap::Add(map, key2, value);
     528             :   Verify(map);
     529           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     530           6 :   CHECK_EQ(2, map->NumberOfElements());
     531           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key1));
     532           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key2));
     533             : 
     534           6 :   Handle<Symbol> key3 = factory->NewSymbol();
     535           6 :   CHECK(!OrderedHashMap::HasKey(isolate, *map, *key3));
     536           6 :   map = OrderedHashMap::Add(map, key3, value);
     537             :   Verify(map);
     538           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     539           6 :   CHECK_EQ(3, map->NumberOfElements());
     540           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key1));
     541           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key2));
     542           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key3));
     543             : 
     544           6 :   map = OrderedHashMap::Add(map, key3, value);
     545             :   Verify(map);
     546           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     547           6 :   CHECK_EQ(3, map->NumberOfElements());
     548           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key1));
     549           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key2));
     550           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key3));
     551             : 
     552             :   Handle<Object> key4 = factory->NewHeapNumber(42.0);
     553           6 :   CHECK(!OrderedHashMap::HasKey(isolate, *map, *key4));
     554           6 :   map = OrderedHashMap::Add(map, key4, value);
     555             :   Verify(map);
     556           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     557           6 :   CHECK_EQ(4, map->NumberOfElements());
     558           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key1));
     559           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key2));
     560           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key3));
     561           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key4));
     562             : 
     563           6 :   map = OrderedHashMap::Add(map, key4, value);
     564             :   Verify(map);
     565           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     566           6 :   CHECK_EQ(4, map->NumberOfElements());
     567           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key1));
     568           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key2));
     569           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key3));
     570          12 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key4));
     571           6 : }
     572             : 
     573       23724 : TEST(OrderedHashMapDuplicateHashCode) {
     574           6 :   LocalContext context;
     575             :   Isolate* isolate = GetIsolateFrom(&context);
     576             :   Factory* factory = isolate->factory();
     577             :   HandleScope scope(isolate);
     578             : 
     579           6 :   Handle<OrderedHashMap> map = factory->NewOrderedHashMap();
     580           6 :   Handle<JSObject> key1 = factory->NewJSObjectWithNullProto();
     581           6 :   Handle<JSObject> value = factory->NewJSObjectWithNullProto();
     582           6 :   map = OrderedHashMap::Add(map, key1, value);
     583             :   Verify(map);
     584           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     585           6 :   CHECK_EQ(1, map->NumberOfElements());
     586           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key1));
     587             : 
     588           6 :   Handle<JSObject> key2 = factory->NewJSObjectWithNullProto();
     589           6 :   CopyHashCode(key1, key2);
     590             : 
     591           6 :   map = OrderedHashMap::Add(map, key2, value);
     592             :   Verify(map);
     593           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     594           6 :   CHECK_EQ(2, map->NumberOfElements());
     595           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key1));
     596          12 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key2));
     597           6 : }
     598             : 
     599       23724 : TEST(OrderedHashMapDeletion) {
     600           6 :   LocalContext context;
     601             :   Isolate* isolate = GetIsolateFrom(&context);
     602             :   Factory* factory = isolate->factory();
     603             :   HandleScope scope(isolate);
     604             :   Handle<Smi> value1(Smi::FromInt(1), isolate);
     605           6 :   Handle<String> value = factory->NewStringFromAsciiChecked("bar");
     606             : 
     607           6 :   Handle<OrderedHashMap> map = factory->NewOrderedHashMap();
     608             :   Verify(map);
     609           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     610           6 :   CHECK_EQ(0, map->NumberOfElements());
     611           6 :   CHECK_EQ(0, map->NumberOfDeletedElements());
     612             : 
     613             :   // Delete from an empty hash table
     614             :   Handle<Smi> key1(Smi::FromInt(1), isolate);
     615           6 :   CHECK(!OrderedHashMap::Delete(isolate, *map, *key1));
     616             :   Verify(map);
     617           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     618           6 :   CHECK_EQ(0, map->NumberOfElements());
     619           6 :   CHECK_EQ(0, map->NumberOfDeletedElements());
     620           6 :   CHECK(!OrderedHashMap::HasKey(isolate, *map, *key1));
     621             : 
     622           6 :   map = OrderedHashMap::Add(map, key1, value1);
     623             :   Verify(map);
     624           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     625           6 :   CHECK_EQ(1, map->NumberOfElements());
     626           6 :   CHECK_EQ(0, map->NumberOfDeletedElements());
     627           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key1));
     628             : 
     629             :   // Delete single existing key
     630           6 :   CHECK(OrderedHashMap::Delete(isolate, *map, *key1));
     631             :   Verify(map);
     632           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     633           6 :   CHECK_EQ(0, map->NumberOfElements());
     634           6 :   CHECK_EQ(1, map->NumberOfDeletedElements());
     635           6 :   CHECK(!OrderedHashMap::HasKey(isolate, *map, *key1));
     636             : 
     637           6 :   map = OrderedHashMap::Add(map, key1, value1);
     638             :   Verify(map);
     639           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     640           6 :   CHECK_EQ(1, map->NumberOfElements());
     641           6 :   CHECK_EQ(1, map->NumberOfDeletedElements());
     642           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key1));
     643             : 
     644           6 :   Handle<String> key2 = factory->NewStringFromAsciiChecked("foo");
     645           6 :   CHECK(!OrderedHashMap::HasKey(isolate, *map, *key2));
     646           6 :   map = OrderedHashMap::Add(map, key2, value);
     647             :   Verify(map);
     648           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     649           6 :   CHECK_EQ(2, map->NumberOfElements());
     650           6 :   CHECK_EQ(1, map->NumberOfDeletedElements());
     651           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key2));
     652             : 
     653           6 :   Handle<Symbol> key3 = factory->NewSymbol();
     654           6 :   CHECK(!OrderedHashMap::HasKey(isolate, *map, *key3));
     655           6 :   map = OrderedHashMap::Add(map, key3, value);
     656             :   Verify(map);
     657           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     658           6 :   CHECK_EQ(3, map->NumberOfElements());
     659           6 :   CHECK_EQ(1, map->NumberOfDeletedElements());
     660           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key1));
     661           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key2));
     662           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key3));
     663             : 
     664             :   // Delete multiple existing keys
     665           6 :   CHECK(OrderedHashMap::Delete(isolate, *map, *key1));
     666             :   Verify(map);
     667           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     668           6 :   CHECK_EQ(2, map->NumberOfElements());
     669           6 :   CHECK_EQ(2, map->NumberOfDeletedElements());
     670           6 :   CHECK(!OrderedHashMap::HasKey(isolate, *map, *key1));
     671           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key2));
     672           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key3));
     673             : 
     674           6 :   CHECK(OrderedHashMap::Delete(isolate, *map, *key2));
     675             :   Verify(map);
     676           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     677           6 :   CHECK_EQ(1, map->NumberOfElements());
     678           6 :   CHECK_EQ(3, map->NumberOfDeletedElements());
     679           6 :   CHECK(!OrderedHashMap::HasKey(isolate, *map, *key1));
     680           6 :   CHECK(!OrderedHashMap::HasKey(isolate, *map, *key2));
     681           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key3));
     682             : 
     683           6 :   CHECK(OrderedHashMap::Delete(isolate, *map, *key3));
     684             :   Verify(map);
     685           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     686           6 :   CHECK_EQ(0, map->NumberOfElements());
     687           6 :   CHECK_EQ(4, map->NumberOfDeletedElements());
     688           6 :   CHECK(!OrderedHashMap::HasKey(isolate, *map, *key1));
     689           6 :   CHECK(!OrderedHashMap::HasKey(isolate, *map, *key2));
     690           6 :   CHECK(!OrderedHashMap::HasKey(isolate, *map, *key3));
     691             : 
     692             :   // Delete non existent key from non new hash table
     693           6 :   CHECK(!OrderedHashMap::Delete(isolate, *map, *key3));
     694             :   Verify(map);
     695           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     696           6 :   CHECK_EQ(0, map->NumberOfElements());
     697           6 :   CHECK_EQ(4, map->NumberOfDeletedElements());
     698           6 :   CHECK(!OrderedHashMap::HasKey(isolate, *map, *key1));
     699           6 :   CHECK(!OrderedHashMap::HasKey(isolate, *map, *key2));
     700           6 :   CHECK(!OrderedHashMap::HasKey(isolate, *map, *key3));
     701             : 
     702             :   // Delete non existent key from non empty hash table
     703           6 :   map = OrderedHashMap::Shrink(map);
     704           6 :   map = OrderedHashMap::Add(map, key1, value);
     705             :   Verify(map);
     706           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     707           6 :   CHECK_EQ(1, map->NumberOfElements());
     708           6 :   CHECK_EQ(0, map->NumberOfDeletedElements());
     709           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key1));
     710           6 :   CHECK(!OrderedHashMap::HasKey(isolate, *map, *key2));
     711           6 :   CHECK(!OrderedHashMap::HasKey(isolate, *map, *key3));
     712           6 :   CHECK(!OrderedHashMap::Delete(isolate, *map, *key2));
     713             :   Verify(map);
     714           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     715           6 :   CHECK_EQ(1, map->NumberOfElements());
     716           6 :   CHECK_EQ(0, map->NumberOfDeletedElements());
     717           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key1));
     718           6 :   CHECK(!OrderedHashMap::HasKey(isolate, *map, *key2));
     719          12 :   CHECK(!OrderedHashMap::HasKey(isolate, *map, *key3));
     720           6 : }
     721             : 
     722       23724 : TEST(OrderedHashMapDuplicateHashCodeDeletion) {
     723           6 :   LocalContext context;
     724             :   Isolate* isolate = GetIsolateFrom(&context);
     725             :   Factory* factory = isolate->factory();
     726             :   HandleScope scope(isolate);
     727             : 
     728           6 :   Handle<OrderedHashMap> map = factory->NewOrderedHashMap();
     729           6 :   Handle<JSObject> key1 = factory->NewJSObjectWithNullProto();
     730           6 :   Handle<JSObject> value = factory->NewJSObjectWithNullProto();
     731           6 :   map = OrderedHashMap::Add(map, key1, value);
     732             :   Verify(map);
     733           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     734           6 :   CHECK_EQ(1, map->NumberOfElements());
     735           6 :   CHECK_EQ(0, map->NumberOfDeletedElements());
     736           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key1));
     737             : 
     738           6 :   Handle<JSObject> key2 = factory->NewJSObjectWithNullProto();
     739           6 :   CopyHashCode(key1, key2);
     740             : 
     741             :   // We shouldn't be able to delete the key!
     742           6 :   CHECK(!OrderedHashMap::Delete(isolate, *map, *key2));
     743             :   Verify(map);
     744           6 :   CHECK_EQ(2, map->NumberOfBuckets());
     745           6 :   CHECK_EQ(1, map->NumberOfElements());
     746           6 :   CHECK_EQ(0, map->NumberOfDeletedElements());
     747           6 :   CHECK(OrderedHashMap::HasKey(isolate, *map, *key1));
     748          12 :   CHECK(!OrderedHashMap::HasKey(isolate, *map, *key2));
     749           6 : }
     750             : 
     751       23724 : TEST(OrderedHashSetDeletion) {
     752           6 :   LocalContext context;
     753             :   Isolate* isolate = GetIsolateFrom(&context);
     754             :   Factory* factory = isolate->factory();
     755             :   HandleScope scope(isolate);
     756             : 
     757           6 :   Handle<OrderedHashSet> set = factory->NewOrderedHashSet();
     758             :   Verify(set);
     759           6 :   CHECK_EQ(2, set->NumberOfBuckets());
     760           6 :   CHECK_EQ(0, set->NumberOfElements());
     761           6 :   CHECK_EQ(0, set->NumberOfDeletedElements());
     762             : 
     763             :   // Delete from an empty hash table
     764             :   Handle<Smi> key1(Smi::FromInt(1), isolate);
     765           6 :   CHECK(!OrderedHashSet::Delete(isolate, *set, *key1));
     766             :   Verify(set);
     767           6 :   CHECK_EQ(2, set->NumberOfBuckets());
     768           6 :   CHECK_EQ(0, set->NumberOfElements());
     769           6 :   CHECK_EQ(0, set->NumberOfDeletedElements());
     770           6 :   CHECK(!OrderedHashSet::HasKey(isolate, *set, *key1));
     771             : 
     772           6 :   set = OrderedHashSet::Add(set, key1);
     773             :   Verify(set);
     774           6 :   CHECK_EQ(2, set->NumberOfBuckets());
     775           6 :   CHECK_EQ(1, set->NumberOfElements());
     776           6 :   CHECK_EQ(0, set->NumberOfDeletedElements());
     777           6 :   CHECK(OrderedHashSet::HasKey(isolate, *set, *key1));
     778             : 
     779             :   // Delete single existing key
     780           6 :   CHECK(OrderedHashSet::Delete(isolate, *set, *key1));
     781             :   Verify(set);
     782           6 :   CHECK_EQ(2, set->NumberOfBuckets());
     783           6 :   CHECK_EQ(0, set->NumberOfElements());
     784           6 :   CHECK_EQ(1, set->NumberOfDeletedElements());
     785           6 :   CHECK(!OrderedHashSet::HasKey(isolate, *set, *key1));
     786             : 
     787           6 :   set = OrderedHashSet::Add(set, key1);
     788             :   Verify(set);
     789           6 :   CHECK_EQ(2, set->NumberOfBuckets());
     790           6 :   CHECK_EQ(1, set->NumberOfElements());
     791           6 :   CHECK_EQ(1, set->NumberOfDeletedElements());
     792           6 :   CHECK(OrderedHashSet::HasKey(isolate, *set, *key1));
     793             : 
     794           6 :   Handle<String> key2 = factory->NewStringFromAsciiChecked("foo");
     795           6 :   CHECK(!OrderedHashSet::HasKey(isolate, *set, *key2));
     796           6 :   set = OrderedHashSet::Add(set, key2);
     797             :   Verify(set);
     798           6 :   CHECK_EQ(2, set->NumberOfBuckets());
     799           6 :   CHECK_EQ(2, set->NumberOfElements());
     800           6 :   CHECK_EQ(1, set->NumberOfDeletedElements());
     801           6 :   CHECK(OrderedHashSet::HasKey(isolate, *set, *key2));
     802             : 
     803           6 :   Handle<Symbol> key3 = factory->NewSymbol();
     804           6 :   CHECK(!OrderedHashSet::HasKey(isolate, *set, *key3));
     805           6 :   set = OrderedHashSet::Add(set, key3);
     806             :   Verify(set);
     807           6 :   CHECK_EQ(2, set->NumberOfBuckets());
     808           6 :   CHECK_EQ(3, set->NumberOfElements());
     809           6 :   CHECK_EQ(1, set->NumberOfDeletedElements());
     810           6 :   CHECK(OrderedHashSet::HasKey(isolate, *set, *key1));
     811           6 :   CHECK(OrderedHashSet::HasKey(isolate, *set, *key2));
     812           6 :   CHECK(OrderedHashSet::HasKey(isolate, *set, *key3));
     813             : 
     814             :   // Delete multiple existing keys
     815           6 :   CHECK(OrderedHashSet::Delete(isolate, *set, *key1));
     816             :   Verify(set);
     817           6 :   CHECK_EQ(2, set->NumberOfBuckets());
     818           6 :   CHECK_EQ(2, set->NumberOfElements());
     819           6 :   CHECK_EQ(2, set->NumberOfDeletedElements());
     820           6 :   CHECK(!OrderedHashSet::HasKey(isolate, *set, *key1));
     821           6 :   CHECK(OrderedHashSet::HasKey(isolate, *set, *key2));
     822           6 :   CHECK(OrderedHashSet::HasKey(isolate, *set, *key3));
     823             : 
     824           6 :   CHECK(OrderedHashSet::Delete(isolate, *set, *key2));
     825             :   Verify(set);
     826           6 :   CHECK_EQ(2, set->NumberOfBuckets());
     827           6 :   CHECK_EQ(1, set->NumberOfElements());
     828           6 :   CHECK_EQ(3, set->NumberOfDeletedElements());
     829           6 :   CHECK(!OrderedHashSet::HasKey(isolate, *set, *key1));
     830           6 :   CHECK(!OrderedHashSet::HasKey(isolate, *set, *key2));
     831           6 :   CHECK(OrderedHashSet::HasKey(isolate, *set, *key3));
     832             : 
     833           6 :   CHECK(OrderedHashSet::Delete(isolate, *set, *key3));
     834             :   Verify(set);
     835           6 :   CHECK_EQ(2, set->NumberOfBuckets());
     836           6 :   CHECK_EQ(0, set->NumberOfElements());
     837           6 :   CHECK_EQ(4, set->NumberOfDeletedElements());
     838           6 :   CHECK(!OrderedHashSet::HasKey(isolate, *set, *key1));
     839           6 :   CHECK(!OrderedHashSet::HasKey(isolate, *set, *key2));
     840           6 :   CHECK(!OrderedHashSet::HasKey(isolate, *set, *key3));
     841             : 
     842             :   // Delete non existent key from non new hash table
     843           6 :   CHECK(!OrderedHashSet::Delete(isolate, *set, *key3));
     844             :   Verify(set);
     845           6 :   CHECK_EQ(2, set->NumberOfBuckets());
     846           6 :   CHECK_EQ(0, set->NumberOfElements());
     847           6 :   CHECK_EQ(4, set->NumberOfDeletedElements());
     848           6 :   CHECK(!OrderedHashSet::HasKey(isolate, *set, *key1));
     849           6 :   CHECK(!OrderedHashSet::HasKey(isolate, *set, *key2));
     850           6 :   CHECK(!OrderedHashSet::HasKey(isolate, *set, *key3));
     851             : 
     852             :   // Delete non existent key from non empty hash table
     853           6 :   set = OrderedHashSet::Shrink(set);
     854           6 :   set = OrderedHashSet::Add(set, key1);
     855             :   Verify(set);
     856           6 :   CHECK_EQ(2, set->NumberOfBuckets());
     857           6 :   CHECK_EQ(1, set->NumberOfElements());
     858           6 :   CHECK_EQ(0, set->NumberOfDeletedElements());
     859           6 :   CHECK(OrderedHashSet::HasKey(isolate, *set, *key1));
     860           6 :   CHECK(!OrderedHashSet::HasKey(isolate, *set, *key2));
     861           6 :   CHECK(!OrderedHashSet::HasKey(isolate, *set, *key3));
     862           6 :   CHECK(!OrderedHashSet::Delete(isolate, *set, *key2));
     863             :   Verify(set);
     864           6 :   CHECK_EQ(2, set->NumberOfBuckets());
     865           6 :   CHECK_EQ(1, set->NumberOfElements());
     866           6 :   CHECK_EQ(0, set->NumberOfDeletedElements());
     867           6 :   CHECK(OrderedHashSet::HasKey(isolate, *set, *key1));
     868           6 :   CHECK(!OrderedHashSet::HasKey(isolate, *set, *key2));
     869          12 :   CHECK(!OrderedHashSet::HasKey(isolate, *set, *key3));
     870           6 : }
     871             : 
     872       23724 : TEST(OrderedHashSetDuplicateHashCodeDeletion) {
     873           6 :   LocalContext context;
     874             :   Isolate* isolate = GetIsolateFrom(&context);
     875             :   Factory* factory = isolate->factory();
     876             :   HandleScope scope(isolate);
     877             : 
     878           6 :   Handle<OrderedHashSet> set = factory->NewOrderedHashSet();
     879           6 :   Handle<JSObject> key1 = factory->NewJSObjectWithNullProto();
     880           6 :   set = OrderedHashSet::Add(set, key1);
     881             :   Verify(set);
     882           6 :   CHECK_EQ(2, set->NumberOfBuckets());
     883           6 :   CHECK_EQ(1, set->NumberOfElements());
     884           6 :   CHECK_EQ(0, set->NumberOfDeletedElements());
     885           6 :   CHECK(OrderedHashSet::HasKey(isolate, *set, *key1));
     886             : 
     887           6 :   Handle<JSObject> key2 = factory->NewJSObjectWithNullProto();
     888           6 :   CopyHashCode(key1, key2);
     889             : 
     890             :   // We shouldn't be able to delete the key!
     891           6 :   CHECK(!OrderedHashSet::Delete(isolate, *set, *key2));
     892             :   Verify(set);
     893           6 :   CHECK_EQ(2, set->NumberOfBuckets());
     894           6 :   CHECK_EQ(1, set->NumberOfElements());
     895           6 :   CHECK_EQ(0, set->NumberOfDeletedElements());
     896           6 :   CHECK(OrderedHashSet::HasKey(isolate, *set, *key1));
     897          12 :   CHECK(!OrderedHashSet::HasKey(isolate, *set, *key2));
     898           6 : }
     899             : 
     900             : }  // namespace test_orderedhashtable
     901             : }  // namespace internal
     902       71154 : }  // namespace v8

Generated by: LCOV version 1.10