1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved. 2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file. 4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/v8.h" 6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/identity-map.h" 8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/zone.h" 9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "test/cctest/cctest.h" 11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 { 13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal { 14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Helper for testing. A "friend" of the IdentityMapBase class, it is able to 16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// "move" objects to simulate GC for testing the internals of the map. 17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass IdentityMapTester : public HandleAndZoneScope { 18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IdentityMap<void*> map; 20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IdentityMapTester() : map(heap(), main_zone()) {} 22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Heap* heap() { return isolate()->heap(); } 24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate() { return main_isolate(); } 25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void TestGetFind(Handle<Object> key1, void* val1, Handle<Object> key2, 27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void* val2) { 28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NULL(map.Find(key1)); 29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NULL(map.Find(key2)); 30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Set {key1} the first time. 32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void** entry = map.Get(key1); 33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NOT_NULL(entry); 34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch *entry = val1; 35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < 3; i++) { // Get and find {key1} K times. 37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void** nentry = map.Get(key1); 39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(entry, nentry); 40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(val1, *nentry); 41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NULL(map.Find(key2)); 42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void** nentry = map.Find(key1); 45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(entry, nentry); 46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(val1, *nentry); 47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NULL(map.Find(key2)); 48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Set {key2} the first time. 52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void** entry2 = map.Get(key2); 53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NOT_NULL(entry2); 54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch *entry2 = val2; 55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < 3; i++) { // Get and find {key1} and {key2} K times. 57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void** nentry = map.Get(key2); 59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(entry2, nentry); 60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(val2, *nentry); 61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void** nentry = map.Find(key2); 64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(entry2, nentry); 65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(val2, *nentry); 66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void** nentry = map.Find(key1); 69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(val1, *nentry); 70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Smi> smi(int value) { 75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Handle<Smi>(Smi::FromInt(value), isolate()); 76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> num(double value) { 79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return isolate()->factory()->NewNumber(value); 80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SimulateGCByIncrementingSmisBy(int shift) { 83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < map.size_; i++) { 84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (map.keys_[i]->IsSmi()) { 85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch map.keys_[i] = Smi::FromInt(Smi::cast(map.keys_[i])->value() + shift); 86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch map.gc_counter_ = -1; 89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void CheckFind(Handle<Object> key, void* value) { 92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void** entry = map.Find(key); 93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NOT_NULL(entry); 94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(value, *entry); 95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void CheckGet(Handle<Object> key, void* value) { 98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void** entry = map.Get(key); 99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NOT_NULL(entry); 100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(value, *entry); 101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintMap() { 104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PrintF("{\n"); 105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < map.size_; i++) { 106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PrintF(" %3d: %p => %p\n", i, reinterpret_cast<void*>(map.keys_[i]), 107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch reinterpret_cast<void*>(map.values_[i])); 108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PrintF("}\n"); 110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void Resize() { map.Resize(); } 113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void Rehash() { map.Rehash(); } 115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(Find_smi_not_found) { 119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IdentityMapTester t; 120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < 100; i++) { 121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NULL(t.map.Find(t.smi(i))); 122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(Find_num_not_found) { 127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IdentityMapTester t; 128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < 100; i++) { 129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NULL(t.map.Find(t.num(i + 0.2))); 130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(GetFind_smi_13) { 135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IdentityMapTester t; 136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.TestGetFind(t.smi(13), t.isolate(), t.smi(17), t.heap()); 137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(GetFind_num_13) { 141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IdentityMapTester t; 142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.TestGetFind(t.num(13.1), t.isolate(), t.num(17.1), t.heap()); 143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(GetFind_smi_17m) { 147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const int kInterval = 17; 148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const int kShift = 1099; 149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IdentityMapTester t; 150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 1; i < 100; i += kInterval) { 152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.map.Set(t.smi(i), reinterpret_cast<void*>(i + kShift)); 153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 1; i < 100; i += kInterval) { 156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.CheckFind(t.smi(i), reinterpret_cast<void*>(i + kShift)); 157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 1; i < 100; i += kInterval) { 160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.CheckGet(t.smi(i), reinterpret_cast<void*>(i + kShift)); 161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 1; i < 100; i++) { 164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void** entry = t.map.Find(t.smi(i)); 165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if ((i % kInterval) != 1) { 166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NULL(entry); 167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NOT_NULL(entry); 169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(reinterpret_cast<void*>(i + kShift), *entry); 170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(GetFind_num_1000) { 176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const int kPrime = 137; 177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IdentityMapTester t; 178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int val1; 179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int val2; 180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < 1000; i++) { 182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.TestGetFind(t.smi(i * kPrime), &val1, t.smi(i * kPrime + 1), &val2); 183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(GetFind_smi_gc) { 188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const int kKey = 33; 189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const int kShift = 1211; 190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IdentityMapTester t; 191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.map.Set(t.smi(kKey), &t); 193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.SimulateGCByIncrementingSmisBy(kShift); 194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.CheckFind(t.smi(kKey + kShift), &t); 195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.CheckGet(t.smi(kKey + kShift), &t); 196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(GetFind_smi_gc2) { 200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int kKey1 = 1; 201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int kKey2 = 33; 202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const int kShift = 1211; 203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IdentityMapTester t; 204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.map.Set(t.smi(kKey1), &kKey1); 206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.map.Set(t.smi(kKey2), &kKey2); 207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.SimulateGCByIncrementingSmisBy(kShift); 208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.CheckFind(t.smi(kKey1 + kShift), &kKey1); 209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.CheckGet(t.smi(kKey1 + kShift), &kKey1); 210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.CheckFind(t.smi(kKey2 + kShift), &kKey2); 211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.CheckGet(t.smi(kKey2 + kShift), &kKey2); 212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(GetFind_smi_gc_n) { 216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const int kShift = 12011; 217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IdentityMapTester t; 218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int keys[12] = {1, 2, 7, 8, 15, 23, 219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1 + 32, 2 + 32, 7 + 32, 8 + 32, 15 + 32, 23 + 32}; 220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Initialize the map first. 221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (size_t i = 0; i < arraysize(keys); i += 2) { 222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.TestGetFind(t.smi(keys[i]), &keys[i], t.smi(keys[i + 1]), &keys[i + 1]); 223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Check the above initialization. 225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (size_t i = 0; i < arraysize(keys); i++) { 226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.CheckFind(t.smi(keys[i]), &keys[i]); 227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Simulate a GC by "moving" the smis in the internal keys array. 229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.SimulateGCByIncrementingSmisBy(kShift); 230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Check that searching for the incremented smis finds the same values. 231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (size_t i = 0; i < arraysize(keys); i++) { 232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.CheckFind(t.smi(keys[i] + kShift), &keys[i]); 233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Check that searching for the incremented smis gets the same values. 235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (size_t i = 0; i < arraysize(keys); i++) { 236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.CheckGet(t.smi(keys[i] + kShift), &keys[i]); 237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(GetFind_smi_num_gc_n) { 242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const int kShift = 12019; 243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IdentityMapTester t; 244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int smi_keys[] = {1, 2, 7, 15, 23}; 245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> num_keys[] = {t.num(1.1), t.num(2.2), t.num(3.3), t.num(4.4), 246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.num(5.5), t.num(6.6), t.num(7.7), t.num(8.8), 247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.num(9.9), t.num(10.1)}; 248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Initialize the map first. 249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (size_t i = 0; i < arraysize(smi_keys); i++) { 250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.map.Set(t.smi(smi_keys[i]), &smi_keys[i]); 251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (size_t i = 0; i < arraysize(num_keys); i++) { 253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.map.Set(num_keys[i], &num_keys[i]); 254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Check the above initialization. 256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (size_t i = 0; i < arraysize(smi_keys); i++) { 257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.CheckFind(t.smi(smi_keys[i]), &smi_keys[i]); 258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (size_t i = 0; i < arraysize(num_keys); i++) { 260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.CheckFind(num_keys[i], &num_keys[i]); 261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Simulate a GC by moving SMIs. 264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Ironically the SMIs "move", but the heap numbers don't! 265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.SimulateGCByIncrementingSmisBy(kShift); 266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Check that searching for the incremented smis finds the same values. 268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (size_t i = 0; i < arraysize(smi_keys); i++) { 269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.CheckFind(t.smi(smi_keys[i] + kShift), &smi_keys[i]); 270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.CheckGet(t.smi(smi_keys[i] + kShift), &smi_keys[i]); 271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Check that searching for the numbers finds the same values. 274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (size_t i = 0; i < arraysize(num_keys); i++) { 275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.CheckFind(num_keys[i], &num_keys[i]); 276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.CheckGet(num_keys[i], &num_keys[i]); 277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid CollisionTest(int stride, bool rehash = false, bool resize = false) { 282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int load = 15; load <= 120; load = load * 2) { 283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IdentityMapTester t; 284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { // Add entries to the map. 286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HandleScope scope(t.isolate()); 287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int next = 1; 288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < load; i++) { 289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.map.Set(t.smi(next), reinterpret_cast<void*>(next)); 290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.CheckFind(t.smi(next), reinterpret_cast<void*>(next)); 291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch next = next + stride; 292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (resize) t.Resize(); // Explicit resize (internal method). 295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (rehash) t.Rehash(); // Explicit rehash (internal method). 296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { // Check find and get. 297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HandleScope scope(t.isolate()); 298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int next = 1; 299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < load; i++) { 300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.CheckFind(t.smi(next), reinterpret_cast<void*>(next)); 301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.CheckGet(t.smi(next), reinterpret_cast<void*>(next)); 302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch next = next + stride; 303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(Collisions_1) { CollisionTest(1); } 310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(Collisions_2) { CollisionTest(2); } 311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(Collisions_3) { CollisionTest(3); } 312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(Collisions_5) { CollisionTest(5); } 313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(Collisions_7) { CollisionTest(7); } 314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(Resize) { CollisionTest(9, false, true); } 315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(Rehash) { CollisionTest(11, true, false); } 316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(ExplicitGC) { 319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch IdentityMapTester t; 320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> num_keys[] = {t.num(2.1), t.num(2.4), t.num(3.3), t.num(4.3), 321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.num(7.5), t.num(6.4), t.num(7.3), t.num(8.3), 322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.num(8.9), t.num(10.4)}; 323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Insert some objects that should be in new space. 325014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (size_t i = 0; i < arraysize(num_keys); i++) { 326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.map.Set(num_keys[i], &num_keys[i]); 327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Do an explicit, real GC. 330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.heap()->CollectGarbage(i::NEW_SPACE); 331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Check that searching for the numbers finds the same values. 333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (size_t i = 0; i < arraysize(num_keys); i++) { 334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.CheckFind(num_keys[i], &num_keys[i]); 335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch t.CheckGet(num_keys[i], &num_keys[i]); 336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST(CanonicalHandleScope) { 341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate = CcTest::i_isolate(); 342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Heap* heap = CcTest::heap(); 343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HandleScope outer(isolate); 344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CanonicalHandleScope outer_canonical(isolate); 345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Deduplicate smi handles. 347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch List<Handle<Object> > smi_handles; 348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < 100; i++) { 349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch smi_handles.Add(Handle<Object>(Smi::FromInt(i), isolate)); 350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object** next_handle = isolate->handle_scope_data()->next; 352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < 100; i++) { 353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> new_smi = Handle<Object>(Smi::FromInt(i), isolate); 354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> old_smi = smi_handles[i]; 355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(new_smi.location(), old_smi.location()); 356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Check that no new handles have been allocated. 358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(next_handle, isolate->handle_scope_data()->next); 359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Deduplicate root list items. 361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<String> empty_string(heap->empty_string()); 362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> free_space_map(heap->free_space_map()); 363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Symbol> uninitialized_symbol(heap->uninitialized_symbol()); 364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(isolate->factory()->empty_string().location(), 365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch empty_string.location()); 366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(isolate->factory()->free_space_map().location(), 367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch free_space_map.location()); 368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(isolate->factory()->uninitialized_symbol().location(), 369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uninitialized_symbol.location()); 370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Check that no new handles have been allocated. 371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(next_handle, isolate->handle_scope_data()->next); 372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Test ordinary heap objects. 374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<HeapNumber> number1 = isolate->factory()->NewHeapNumber(3.3); 375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<String> string1 = 376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch isolate->factory()->NewStringFromAsciiChecked("test"); 377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch next_handle = isolate->handle_scope_data()->next; 378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<HeapNumber> number2(*number1); 379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<String> string2(*string1); 380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(number1.location(), number2.location()); 381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(string1.location(), string2.location()); 382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch heap->CollectAllGarbage(); 383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<HeapNumber> number3(*number2); 384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<String> string3(*string2); 385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(number1.location(), number3.location()); 386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(string1.location(), string3.location()); 387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Check that no new handles have been allocated. 388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(next_handle, isolate->handle_scope_data()->next); 389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Inner handle scope do not create canonical handles. 391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HandleScope inner(isolate); 393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<HeapNumber> number4(*number1); 394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<String> string4(*string1); 395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NE(number1.location(), number4.location()); 396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NE(string1.location(), string4.location()); 397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Nested canonical scope does not conflict with outer canonical scope, 399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // but does not canonicalize across scopes. 400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CanonicalHandleScope inner_canonical(isolate); 401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<HeapNumber> number5(*number4); 402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<String> string5(*string4); 403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NE(number4.location(), number5.location()); 404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NE(string4.location(), string5.location()); 405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NE(number1.location(), number5.location()); 406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NE(string1.location(), string5.location()); 407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<HeapNumber> number6(*number1); 409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<String> string6(*string1); 410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NE(number4.location(), number6.location()); 411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NE(string4.location(), string6.location()); 412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NE(number1.location(), number6.location()); 413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_NE(string1.location(), string6.location()); 414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(number5.location(), number6.location()); 415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK_EQ(string5.location(), string6.location()); 416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 421