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