Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(113)

Side by Side Diff: test/cctest/test-heap.cc

Issue 6880010: Merge (7265, 7271] from bleeding_edge to experimental/gc branch.... (Closed) Base URL: http://v8.googlecode.com/svn/branches/experimental/gc/
Patch Set: '' Created 9 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 the V8 project authors. All rights reserved.
2 2
3 #include <stdlib.h> 3 #include <stdlib.h>
4 4
5 #include "v8.h" 5 #include "v8.h"
6 6
7 #include "execution.h" 7 #include "execution.h"
8 #include "factory.h" 8 #include "factory.h"
9 #include "macro-assembler.h" 9 #include "macro-assembler.h"
10 #include "global-handles.h" 10 #include "global-handles.h"
11 #include "cctest.h" 11 #include "cctest.h"
12 12
13 using namespace v8::internal; 13 using namespace v8::internal;
14 14
15 static v8::Persistent<v8::Context> env; 15 static v8::Persistent<v8::Context> env;
16 16
17 static void InitializeVM() { 17 static void InitializeVM() {
18 if (env.IsEmpty()) env = v8::Context::New(); 18 if (env.IsEmpty()) env = v8::Context::New();
19 v8::HandleScope scope; 19 v8::HandleScope scope;
20 env->Enter(); 20 env->Enter();
21 } 21 }
22 22
23 23
24 static void CheckMap(Map* map, int type, int instance_size) { 24 static void CheckMap(Map* map, int type, int instance_size) {
25 CHECK(map->IsHeapObject()); 25 CHECK(map->IsHeapObject());
26 #ifdef DEBUG 26 #ifdef DEBUG
27 CHECK(Heap::Contains(map)); 27 CHECK(HEAP->Contains(map));
28 #endif 28 #endif
29 CHECK_EQ(Heap::meta_map(), map->map()); 29 CHECK_EQ(HEAP->meta_map(), map->map());
30 CHECK_EQ(type, map->instance_type()); 30 CHECK_EQ(type, map->instance_type());
31 CHECK_EQ(instance_size, map->instance_size()); 31 CHECK_EQ(instance_size, map->instance_size());
32 } 32 }
33 33
34 34
35 TEST(HeapMaps) { 35 TEST(HeapMaps) {
36 InitializeVM(); 36 InitializeVM();
37 CheckMap(Heap::meta_map(), MAP_TYPE, Map::kSize); 37 CheckMap(HEAP->meta_map(), MAP_TYPE, Map::kSize);
38 CheckMap(Heap::heap_number_map(), HEAP_NUMBER_TYPE, HeapNumber::kSize); 38 CheckMap(HEAP->heap_number_map(), HEAP_NUMBER_TYPE, HeapNumber::kSize);
39 CheckMap(Heap::fixed_array_map(), FIXED_ARRAY_TYPE, kVariableSizeSentinel); 39 CheckMap(HEAP->fixed_array_map(), FIXED_ARRAY_TYPE, kVariableSizeSentinel);
40 CheckMap(Heap::string_map(), STRING_TYPE, kVariableSizeSentinel); 40 CheckMap(HEAP->string_map(), STRING_TYPE, kVariableSizeSentinel);
41 } 41 }
42 42
43 43
44 static void CheckOddball(Object* obj, const char* string) { 44 static void CheckOddball(Object* obj, const char* string) {
45 CHECK(obj->IsOddball()); 45 CHECK(obj->IsOddball());
46 bool exc; 46 bool exc;
47 Object* print_string = *Execution::ToString(Handle<Object>(obj), &exc); 47 Object* print_string = *Execution::ToString(Handle<Object>(obj), &exc);
48 CHECK(String::cast(print_string)->IsEqualTo(CStrVector(string))); 48 CHECK(String::cast(print_string)->IsEqualTo(CStrVector(string)));
49 } 49 }
50 50
51 51
52 static void CheckSmi(int value, const char* string) { 52 static void CheckSmi(int value, const char* string) {
53 bool exc; 53 bool exc;
54 Object* print_string = 54 Object* print_string =
55 *Execution::ToString(Handle<Object>(Smi::FromInt(value)), &exc); 55 *Execution::ToString(Handle<Object>(Smi::FromInt(value)), &exc);
56 CHECK(String::cast(print_string)->IsEqualTo(CStrVector(string))); 56 CHECK(String::cast(print_string)->IsEqualTo(CStrVector(string)));
57 } 57 }
58 58
59 59
60 static void CheckNumber(double value, const char* string) { 60 static void CheckNumber(double value, const char* string) {
61 Object* obj = Heap::NumberFromDouble(value)->ToObjectChecked(); 61 Object* obj = HEAP->NumberFromDouble(value)->ToObjectChecked();
62 CHECK(obj->IsNumber()); 62 CHECK(obj->IsNumber());
63 bool exc; 63 bool exc;
64 Object* print_string = *Execution::ToString(Handle<Object>(obj), &exc); 64 Object* print_string = *Execution::ToString(Handle<Object>(obj), &exc);
65 CHECK(String::cast(print_string)->IsEqualTo(CStrVector(string))); 65 CHECK(String::cast(print_string)->IsEqualTo(CStrVector(string)));
66 } 66 }
67 67
68 68
69 static void CheckFindCodeObject() { 69 static void CheckFindCodeObject() {
70 // Test FindCodeObject 70 // Test FindCodeObject
71 #define __ assm. 71 #define __ assm.
72 72
73 Assembler assm(NULL, 0); 73 Assembler assm(NULL, 0);
74 74
75 __ nop(); // supported on all architectures 75 __ nop(); // supported on all architectures
76 76
77 CodeDesc desc; 77 CodeDesc desc;
78 assm.GetCode(&desc); 78 assm.GetCode(&desc);
79 Object* code = Heap::CreateCode( 79 Object* code = HEAP->CreateCode(
80 desc, 80 desc,
81 Code::ComputeFlags(Code::STUB), 81 Code::ComputeFlags(Code::STUB),
82 Handle<Object>(Heap::undefined_value()))->ToObjectChecked(); 82 Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
83 CHECK(code->IsCode()); 83 CHECK(code->IsCode());
84 84
85 HeapObject* obj = HeapObject::cast(code); 85 HeapObject* obj = HeapObject::cast(code);
86 Address obj_addr = obj->address(); 86 Address obj_addr = obj->address();
87 87
88 for (int i = 0; i < obj->Size(); i += kPointerSize) { 88 for (int i = 0; i < obj->Size(); i += kPointerSize) {
89 Object* found = Heap::FindCodeObject(obj_addr + i); 89 Object* found = HEAP->FindCodeObject(obj_addr + i);
90 CHECK_EQ(code, found); 90 CHECK_EQ(code, found);
91 } 91 }
92 92
93 Object* copy = Heap::CreateCode( 93 Object* copy = HEAP->CreateCode(
94 desc, 94 desc,
95 Code::ComputeFlags(Code::STUB), 95 Code::ComputeFlags(Code::STUB),
96 Handle<Object>(Heap::undefined_value()))->ToObjectChecked(); 96 Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
97 CHECK(copy->IsCode()); 97 CHECK(copy->IsCode());
98 HeapObject* obj_copy = HeapObject::cast(copy); 98 HeapObject* obj_copy = HeapObject::cast(copy);
99 Object* not_right = Heap::FindCodeObject(obj_copy->address() + 99 Object* not_right = HEAP->FindCodeObject(obj_copy->address() +
100 obj_copy->Size() / 2); 100 obj_copy->Size() / 2);
101 CHECK(not_right != code); 101 CHECK(not_right != code);
102 } 102 }
103 103
104 104
105 TEST(HeapObjects) { 105 TEST(HeapObjects) {
106 InitializeVM(); 106 InitializeVM();
107 107
108 v8::HandleScope sc; 108 v8::HandleScope sc;
109 Object* value = Heap::NumberFromDouble(1.000123)->ToObjectChecked(); 109 Object* value = HEAP->NumberFromDouble(1.000123)->ToObjectChecked();
110 CHECK(value->IsHeapNumber()); 110 CHECK(value->IsHeapNumber());
111 CHECK(value->IsNumber()); 111 CHECK(value->IsNumber());
112 CHECK_EQ(1.000123, value->Number()); 112 CHECK_EQ(1.000123, value->Number());
113 113
114 value = Heap::NumberFromDouble(1.0)->ToObjectChecked(); 114 value = HEAP->NumberFromDouble(1.0)->ToObjectChecked();
115 CHECK(value->IsSmi()); 115 CHECK(value->IsSmi());
116 CHECK(value->IsNumber()); 116 CHECK(value->IsNumber());
117 CHECK_EQ(1.0, value->Number()); 117 CHECK_EQ(1.0, value->Number());
118 118
119 value = Heap::NumberFromInt32(1024)->ToObjectChecked(); 119 value = HEAP->NumberFromInt32(1024)->ToObjectChecked();
120 CHECK(value->IsSmi()); 120 CHECK(value->IsSmi());
121 CHECK(value->IsNumber()); 121 CHECK(value->IsNumber());
122 CHECK_EQ(1024.0, value->Number()); 122 CHECK_EQ(1024.0, value->Number());
123 123
124 value = Heap::NumberFromInt32(Smi::kMinValue)->ToObjectChecked(); 124 value = HEAP->NumberFromInt32(Smi::kMinValue)->ToObjectChecked();
125 CHECK(value->IsSmi()); 125 CHECK(value->IsSmi());
126 CHECK(value->IsNumber()); 126 CHECK(value->IsNumber());
127 CHECK_EQ(Smi::kMinValue, Smi::cast(value)->value()); 127 CHECK_EQ(Smi::kMinValue, Smi::cast(value)->value());
128 128
129 value = Heap::NumberFromInt32(Smi::kMaxValue)->ToObjectChecked(); 129 value = HEAP->NumberFromInt32(Smi::kMaxValue)->ToObjectChecked();
130 CHECK(value->IsSmi()); 130 CHECK(value->IsSmi());
131 CHECK(value->IsNumber()); 131 CHECK(value->IsNumber());
132 CHECK_EQ(Smi::kMaxValue, Smi::cast(value)->value()); 132 CHECK_EQ(Smi::kMaxValue, Smi::cast(value)->value());
133 133
134 #ifndef V8_TARGET_ARCH_X64 134 #ifndef V8_TARGET_ARCH_X64
135 // TODO(lrn): We need a NumberFromIntptr function in order to test this. 135 // TODO(lrn): We need a NumberFromIntptr function in order to test this.
136 value = Heap::NumberFromInt32(Smi::kMinValue - 1)->ToObjectChecked(); 136 value = HEAP->NumberFromInt32(Smi::kMinValue - 1)->ToObjectChecked();
137 CHECK(value->IsHeapNumber()); 137 CHECK(value->IsHeapNumber());
138 CHECK(value->IsNumber()); 138 CHECK(value->IsNumber());
139 CHECK_EQ(static_cast<double>(Smi::kMinValue - 1), value->Number()); 139 CHECK_EQ(static_cast<double>(Smi::kMinValue - 1), value->Number());
140 #endif 140 #endif
141 141
142 MaybeObject* maybe_value = 142 MaybeObject* maybe_value =
143 Heap::NumberFromUint32(static_cast<uint32_t>(Smi::kMaxValue) + 1); 143 HEAP->NumberFromUint32(static_cast<uint32_t>(Smi::kMaxValue) + 1);
144 value = maybe_value->ToObjectChecked(); 144 value = maybe_value->ToObjectChecked();
145 CHECK(value->IsHeapNumber()); 145 CHECK(value->IsHeapNumber());
146 CHECK(value->IsNumber()); 146 CHECK(value->IsNumber());
147 CHECK_EQ(static_cast<double>(static_cast<uint32_t>(Smi::kMaxValue) + 1), 147 CHECK_EQ(static_cast<double>(static_cast<uint32_t>(Smi::kMaxValue) + 1),
148 value->Number()); 148 value->Number());
149 149
150 // nan oddball checks 150 // nan oddball checks
151 CHECK(Heap::nan_value()->IsNumber()); 151 CHECK(HEAP->nan_value()->IsNumber());
152 CHECK(isnan(Heap::nan_value()->Number())); 152 CHECK(isnan(HEAP->nan_value()->Number()));
153 153
154 Handle<String> s = Factory::NewStringFromAscii(CStrVector("fisk hest ")); 154 Handle<String> s = FACTORY->NewStringFromAscii(CStrVector("fisk hest "));
155 CHECK(s->IsString()); 155 CHECK(s->IsString());
156 CHECK_EQ(10, s->length()); 156 CHECK_EQ(10, s->length());
157 157
158 String* object_symbol = String::cast(Heap::Object_symbol()); 158 String* object_symbol = String::cast(HEAP->Object_symbol());
159 CHECK(Top::context()->global()->HasLocalProperty(object_symbol)); 159 CHECK(
160 Isolate::Current()->context()->global()->HasLocalProperty(object_symbol));
160 161
161 // Check ToString for oddballs 162 // Check ToString for oddballs
162 CheckOddball(Heap::true_value(), "true"); 163 CheckOddball(HEAP->true_value(), "true");
163 CheckOddball(Heap::false_value(), "false"); 164 CheckOddball(HEAP->false_value(), "false");
164 CheckOddball(Heap::null_value(), "null"); 165 CheckOddball(HEAP->null_value(), "null");
165 CheckOddball(Heap::undefined_value(), "undefined"); 166 CheckOddball(HEAP->undefined_value(), "undefined");
166 167
167 // Check ToString for Smis 168 // Check ToString for Smis
168 CheckSmi(0, "0"); 169 CheckSmi(0, "0");
169 CheckSmi(42, "42"); 170 CheckSmi(42, "42");
170 CheckSmi(-42, "-42"); 171 CheckSmi(-42, "-42");
171 172
172 // Check ToString for Numbers 173 // Check ToString for Numbers
173 CheckNumber(1.1, "1.1"); 174 CheckNumber(1.1, "1.1");
174 175
175 CheckFindCodeObject(); 176 CheckFindCodeObject();
(...skipping 14 matching lines...) Expand all
190 CHECK(Smi::FromInt(Smi::kMinValue)->IsSmi()); 191 CHECK(Smi::FromInt(Smi::kMinValue)->IsSmi());
191 CHECK(Smi::FromInt(Smi::kMaxValue)->IsSmi()); 192 CHECK(Smi::FromInt(Smi::kMaxValue)->IsSmi());
192 } 193 }
193 194
194 195
195 TEST(GarbageCollection) { 196 TEST(GarbageCollection) {
196 InitializeVM(); 197 InitializeVM();
197 198
198 v8::HandleScope sc; 199 v8::HandleScope sc;
199 // Check GC. 200 // Check GC.
200 Heap::CollectGarbage(NEW_SPACE); 201 HEAP->CollectGarbage(NEW_SPACE);
201 202
202 Handle<String> name = Factory::LookupAsciiSymbol("theFunction"); 203 Handle<String> name = FACTORY->LookupAsciiSymbol("theFunction");
203 Handle<String> prop_name = Factory::LookupAsciiSymbol("theSlot"); 204 Handle<String> prop_name = FACTORY->LookupAsciiSymbol("theSlot");
204 Handle<String> prop_namex = Factory::LookupAsciiSymbol("theSlotx"); 205 Handle<String> prop_namex = FACTORY->LookupAsciiSymbol("theSlotx");
205 Handle<String> obj_name = Factory::LookupAsciiSymbol("theObject"); 206 Handle<String> obj_name = FACTORY->LookupAsciiSymbol("theObject");
206 207
207 { 208 {
208 v8::HandleScope inner_scope; 209 v8::HandleScope inner_scope;
209 // Allocate a function and keep it in global object's property. 210 // Allocate a function and keep it in global object's property.
210 Handle<JSFunction> function = 211 Handle<JSFunction> function =
211 Factory::NewFunction(name, Factory::undefined_value()); 212 FACTORY->NewFunction(name, FACTORY->undefined_value());
212 Handle<Map> initial_map = 213 Handle<Map> initial_map =
213 Factory::NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); 214 FACTORY->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize);
214 function->set_initial_map(*initial_map); 215 function->set_initial_map(*initial_map);
215 Top::context()->global()->SetProperty( 216 Isolate::Current()->context()->global()->SetProperty(
216 *name, *function, NONE, kNonStrictMode)->ToObjectChecked(); 217 *name, *function, NONE, kNonStrictMode)->ToObjectChecked();
217 // Allocate an object. Unrooted after leaving the scope. 218 // Allocate an object. Unrooted after leaving the scope.
218 Handle<JSObject> obj = Factory::NewJSObject(function); 219 Handle<JSObject> obj = FACTORY->NewJSObject(function);
219 obj->SetProperty( 220 obj->SetProperty(
220 *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked(); 221 *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked();
221 obj->SetProperty( 222 obj->SetProperty(
222 *prop_namex, Smi::FromInt(24), NONE, kNonStrictMode)->ToObjectChecked(); 223 *prop_namex, Smi::FromInt(24), NONE, kNonStrictMode)->ToObjectChecked();
223 224
224 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); 225 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name));
225 CHECK_EQ(Smi::FromInt(24), obj->GetProperty(*prop_namex)); 226 CHECK_EQ(Smi::FromInt(24), obj->GetProperty(*prop_namex));
226 } 227 }
227 228
228 Heap::CollectGarbage(NEW_SPACE); 229 HEAP->CollectGarbage(NEW_SPACE);
229 230
230 // Function should be alive. 231 // Function should be alive.
231 CHECK(Top::context()->global()->HasLocalProperty(*name)); 232 CHECK(Isolate::Current()->context()->global()->HasLocalProperty(*name));
232 // Check function is retained. 233 // Check function is retained.
233 Object* func_value = 234 Object* func_value = Isolate::Current()->context()->global()->
234 Top::context()->global()->GetProperty(*name)->ToObjectChecked(); 235 GetProperty(*name)->ToObjectChecked();
235 CHECK(func_value->IsJSFunction()); 236 CHECK(func_value->IsJSFunction());
236 Handle<JSFunction> function(JSFunction::cast(func_value)); 237 Handle<JSFunction> function(JSFunction::cast(func_value));
237 238
238 { 239 {
239 HandleScope inner_scope; 240 HandleScope inner_scope;
240 // Allocate another object, make it reachable from global. 241 // Allocate another object, make it reachable from global.
241 Handle<JSObject> obj = Factory::NewJSObject(function); 242 Handle<JSObject> obj = FACTORY->NewJSObject(function);
242 Top::context()->global()->SetProperty( 243 Isolate::Current()->context()->global()->SetProperty(
243 *obj_name, *obj, NONE, kNonStrictMode)->ToObjectChecked(); 244 *obj_name, *obj, NONE, kNonStrictMode)->ToObjectChecked();
244 obj->SetProperty( 245 obj->SetProperty(
245 *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked(); 246 *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked();
246 } 247 }
247 248
248 // After gc, it should survive. 249 // After gc, it should survive.
249 Heap::CollectGarbage(NEW_SPACE); 250 HEAP->CollectGarbage(NEW_SPACE);
250 251
251 CHECK(Top::context()->global()->HasLocalProperty(*obj_name)); 252 CHECK(Isolate::Current()->context()->global()->HasLocalProperty(*obj_name));
252 CHECK(Top::context()->global()->GetProperty(*obj_name)->ToObjectChecked()-> 253 CHECK(Isolate::Current()->context()->global()->
253 IsJSObject()); 254 GetProperty(*obj_name)->ToObjectChecked()->IsJSObject());
254 Object* obj = 255 Object* obj = Isolate::Current()->context()->global()->
255 Top::context()->global()->GetProperty(*obj_name)->ToObjectChecked(); 256 GetProperty(*obj_name)->ToObjectChecked();
256 JSObject* js_obj = JSObject::cast(obj); 257 JSObject* js_obj = JSObject::cast(obj);
257 CHECK_EQ(Smi::FromInt(23), js_obj->GetProperty(*prop_name)); 258 CHECK_EQ(Smi::FromInt(23), js_obj->GetProperty(*prop_name));
258 } 259 }
259 260
260 261
261 static void VerifyStringAllocation(const char* string) { 262 static void VerifyStringAllocation(const char* string) {
262 v8::HandleScope scope; 263 v8::HandleScope scope;
263 Handle<String> s = Factory::NewStringFromUtf8(CStrVector(string)); 264 Handle<String> s = FACTORY->NewStringFromUtf8(CStrVector(string));
264 CHECK_EQ(StrLength(string), s->length()); 265 CHECK_EQ(StrLength(string), s->length());
265 for (int index = 0; index < s->length(); index++) { 266 for (int index = 0; index < s->length(); index++) {
266 CHECK_EQ(static_cast<uint16_t>(string[index]), s->Get(index)); 267 CHECK_EQ(static_cast<uint16_t>(string[index]), s->Get(index));
267 } 268 }
268 } 269 }
269 270
270 271
271 TEST(String) { 272 TEST(String) {
272 InitializeVM(); 273 InitializeVM();
273 274
274 VerifyStringAllocation("a"); 275 VerifyStringAllocation("a");
275 VerifyStringAllocation("ab"); 276 VerifyStringAllocation("ab");
276 VerifyStringAllocation("abc"); 277 VerifyStringAllocation("abc");
277 VerifyStringAllocation("abcd"); 278 VerifyStringAllocation("abcd");
278 VerifyStringAllocation("fiskerdrengen er paa havet"); 279 VerifyStringAllocation("fiskerdrengen er paa havet");
279 } 280 }
280 281
281 282
282 TEST(LocalHandles) { 283 TEST(LocalHandles) {
283 InitializeVM(); 284 InitializeVM();
284 285
285 v8::HandleScope scope; 286 v8::HandleScope scope;
286 const char* name = "Kasper the spunky"; 287 const char* name = "Kasper the spunky";
287 Handle<String> string = Factory::NewStringFromAscii(CStrVector(name)); 288 Handle<String> string = FACTORY->NewStringFromAscii(CStrVector(name));
288 CHECK_EQ(StrLength(name), string->length()); 289 CHECK_EQ(StrLength(name), string->length());
289 } 290 }
290 291
291 292
292 TEST(GlobalHandles) { 293 TEST(GlobalHandles) {
294 GlobalHandles* global_handles = Isolate::Current()->global_handles();
293 InitializeVM(); 295 InitializeVM();
294 296
295 Handle<Object> h1; 297 Handle<Object> h1;
296 Handle<Object> h2; 298 Handle<Object> h2;
297 Handle<Object> h3; 299 Handle<Object> h3;
298 Handle<Object> h4; 300 Handle<Object> h4;
299 301
300 { 302 {
301 HandleScope scope; 303 HandleScope scope;
302 304
303 Handle<Object> i = Factory::NewStringFromAscii(CStrVector("fisk")); 305 Handle<Object> i = FACTORY->NewStringFromAscii(CStrVector("fisk"));
304 Handle<Object> u = Factory::NewNumber(1.12344); 306 Handle<Object> u = FACTORY->NewNumber(1.12344);
305 307
306 h1 = GlobalHandles::Create(*i); 308 h1 = global_handles->Create(*i);
307 h2 = GlobalHandles::Create(*u); 309 h2 = global_handles->Create(*u);
308 h3 = GlobalHandles::Create(*i); 310 h3 = global_handles->Create(*i);
309 h4 = GlobalHandles::Create(*u); 311 h4 = global_handles->Create(*u);
310 } 312 }
311 313
312 // after gc, it should survive 314 // after gc, it should survive
313 Heap::CollectGarbage(NEW_SPACE); 315 HEAP->CollectGarbage(NEW_SPACE);
314 316
315 CHECK((*h1)->IsString()); 317 CHECK((*h1)->IsString());
316 CHECK((*h2)->IsHeapNumber()); 318 CHECK((*h2)->IsHeapNumber());
317 CHECK((*h3)->IsString()); 319 CHECK((*h3)->IsString());
318 CHECK((*h4)->IsHeapNumber()); 320 CHECK((*h4)->IsHeapNumber());
319 321
320 CHECK_EQ(*h3, *h1); 322 CHECK_EQ(*h3, *h1);
321 GlobalHandles::Destroy(h1.location()); 323 global_handles->Destroy(h1.location());
322 GlobalHandles::Destroy(h3.location()); 324 global_handles->Destroy(h3.location());
323 325
324 CHECK_EQ(*h4, *h2); 326 CHECK_EQ(*h4, *h2);
325 GlobalHandles::Destroy(h2.location()); 327 global_handles->Destroy(h2.location());
326 GlobalHandles::Destroy(h4.location()); 328 global_handles->Destroy(h4.location());
327 } 329 }
328 330
329 331
330 static bool WeakPointerCleared = false; 332 static bool WeakPointerCleared = false;
331 333
332 static void TestWeakGlobalHandleCallback(v8::Persistent<v8::Value> handle, 334 static void TestWeakGlobalHandleCallback(v8::Persistent<v8::Value> handle,
333 void* id) { 335 void* id) {
334 if (1234 == reinterpret_cast<intptr_t>(id)) WeakPointerCleared = true; 336 if (1234 == reinterpret_cast<intptr_t>(id)) WeakPointerCleared = true;
335 handle.Dispose(); 337 handle.Dispose();
336 } 338 }
337 339
338 340
339 TEST(WeakGlobalHandlesScavenge) { 341 TEST(WeakGlobalHandlesScavenge) {
342 GlobalHandles* global_handles = Isolate::Current()->global_handles();
340 InitializeVM(); 343 InitializeVM();
341 344
342 WeakPointerCleared = false; 345 WeakPointerCleared = false;
343 346
344 Handle<Object> h1; 347 Handle<Object> h1;
345 Handle<Object> h2; 348 Handle<Object> h2;
346 349
347 { 350 {
348 HandleScope scope; 351 HandleScope scope;
349 352
350 Handle<Object> i = Factory::NewStringFromAscii(CStrVector("fisk")); 353 Handle<Object> i = FACTORY->NewStringFromAscii(CStrVector("fisk"));
351 Handle<Object> u = Factory::NewNumber(1.12344); 354 Handle<Object> u = FACTORY->NewNumber(1.12344);
352 355
353 h1 = GlobalHandles::Create(*i); 356 h1 = global_handles->Create(*i);
354 h2 = GlobalHandles::Create(*u); 357 h2 = global_handles->Create(*u);
355 } 358 }
356 359
357 GlobalHandles::MakeWeak(h2.location(), 360 global_handles->MakeWeak(h2.location(),
358 reinterpret_cast<void*>(1234), 361 reinterpret_cast<void*>(1234),
359 &TestWeakGlobalHandleCallback); 362 &TestWeakGlobalHandleCallback);
360 363
361 // Scavenge treats weak pointers as normal roots. 364 // Scavenge treats weak pointers as normal roots.
362 Heap::PerformScavenge(); 365 HEAP->PerformScavenge();
363 366
364 CHECK((*h1)->IsString()); 367 CHECK((*h1)->IsString());
365 CHECK((*h2)->IsHeapNumber()); 368 CHECK((*h2)->IsHeapNumber());
366 369
367 CHECK(!WeakPointerCleared); 370 CHECK(!WeakPointerCleared);
368 CHECK(!GlobalHandles::IsNearDeath(h2.location())); 371 CHECK(!global_handles->IsNearDeath(h2.location()));
369 CHECK(!GlobalHandles::IsNearDeath(h1.location())); 372 CHECK(!global_handles->IsNearDeath(h1.location()));
370 373
371 GlobalHandles::Destroy(h1.location()); 374 global_handles->Destroy(h1.location());
372 GlobalHandles::Destroy(h2.location()); 375 global_handles->Destroy(h2.location());
373 } 376 }
374 377
375 378
376 TEST(WeakGlobalHandlesMark) { 379 TEST(WeakGlobalHandlesMark) {
380 GlobalHandles* global_handles = Isolate::Current()->global_handles();
377 InitializeVM(); 381 InitializeVM();
378 382
379 WeakPointerCleared = false; 383 WeakPointerCleared = false;
380 384
381 Handle<Object> h1; 385 Handle<Object> h1;
382 Handle<Object> h2; 386 Handle<Object> h2;
383 387
384 { 388 {
385 HandleScope scope; 389 HandleScope scope;
386 390
387 Handle<Object> i = Factory::NewStringFromAscii(CStrVector("fisk")); 391 Handle<Object> i = FACTORY->NewStringFromAscii(CStrVector("fisk"));
388 Handle<Object> u = Factory::NewNumber(1.12344); 392 Handle<Object> u = FACTORY->NewNumber(1.12344);
389 393
390 h1 = GlobalHandles::Create(*i); 394 h1 = global_handles->Create(*i);
391 h2 = GlobalHandles::Create(*u); 395 h2 = global_handles->Create(*u);
392 } 396 }
393 397
394 Heap::CollectGarbage(OLD_POINTER_SPACE); 398 HEAP->CollectGarbage(OLD_POINTER_SPACE);
395 Heap::CollectGarbage(NEW_SPACE); 399 HEAP->CollectGarbage(NEW_SPACE);
396 // Make sure the object is promoted. 400 // Make sure the object is promoted.
397 401
398 GlobalHandles::MakeWeak(h2.location(), 402 global_handles->MakeWeak(h2.location(),
399 reinterpret_cast<void*>(1234), 403 reinterpret_cast<void*>(1234),
400 &TestWeakGlobalHandleCallback); 404 &TestWeakGlobalHandleCallback);
401 CHECK(!GlobalHandles::IsNearDeath(h1.location())); 405 CHECK(!GlobalHandles::IsNearDeath(h1.location()));
402 CHECK(!GlobalHandles::IsNearDeath(h2.location())); 406 CHECK(!GlobalHandles::IsNearDeath(h2.location()));
403 407
404 Heap::CollectGarbage(OLD_POINTER_SPACE); 408 HEAP->CollectGarbage(OLD_POINTER_SPACE);
405 409
406 CHECK((*h1)->IsString()); 410 CHECK((*h1)->IsString());
407 411
408 CHECK(WeakPointerCleared); 412 CHECK(WeakPointerCleared);
409 CHECK(!GlobalHandles::IsNearDeath(h1.location())); 413 CHECK(!GlobalHandles::IsNearDeath(h1.location()));
410 414
411 GlobalHandles::Destroy(h1.location()); 415 global_handles->Destroy(h1.location());
412 } 416 }
413 417
414 TEST(DeleteWeakGlobalHandle) { 418 TEST(DeleteWeakGlobalHandle) {
419 GlobalHandles* global_handles = Isolate::Current()->global_handles();
415 InitializeVM(); 420 InitializeVM();
416 421
417 WeakPointerCleared = false; 422 WeakPointerCleared = false;
418 423
419 Handle<Object> h; 424 Handle<Object> h;
420 425
421 { 426 {
422 HandleScope scope; 427 HandleScope scope;
423 428
424 Handle<Object> i = Factory::NewStringFromAscii(CStrVector("fisk")); 429 Handle<Object> i = FACTORY->NewStringFromAscii(CStrVector("fisk"));
425 h = GlobalHandles::Create(*i); 430 h = global_handles->Create(*i);
426 } 431 }
427 432
428 GlobalHandles::MakeWeak(h.location(), 433 global_handles->MakeWeak(h.location(),
429 reinterpret_cast<void*>(1234), 434 reinterpret_cast<void*>(1234),
430 &TestWeakGlobalHandleCallback); 435 &TestWeakGlobalHandleCallback);
431 436
432 // Scanvenge does not recognize weak reference. 437 // Scanvenge does not recognize weak reference.
433 Heap::PerformScavenge(); 438 HEAP->PerformScavenge();
434 439
435 CHECK(!WeakPointerCleared); 440 CHECK(!WeakPointerCleared);
436 441
437 // Mark-compact treats weak reference properly. 442 // Mark-compact treats weak reference properly.
438 Heap::CollectGarbage(OLD_POINTER_SPACE); 443 HEAP->CollectGarbage(OLD_POINTER_SPACE);
439 444
440 CHECK(WeakPointerCleared); 445 CHECK(WeakPointerCleared);
441 } 446 }
442 447
443 static const char* not_so_random_string_table[] = { 448 static const char* not_so_random_string_table[] = {
444 "abstract", 449 "abstract",
445 "boolean", 450 "boolean",
446 "break", 451 "break",
447 "byte", 452 "byte",
448 "case", 453 "case",
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
500 "volatile", 505 "volatile",
501 "while", 506 "while",
502 "with", 507 "with",
503 0 508 0
504 }; 509 };
505 510
506 511
507 static void CheckSymbols(const char** strings) { 512 static void CheckSymbols(const char** strings) {
508 for (const char* string = *strings; *strings != 0; string = *strings++) { 513 for (const char* string = *strings; *strings != 0; string = *strings++) {
509 Object* a; 514 Object* a;
510 MaybeObject* maybe_a = Heap::LookupAsciiSymbol(string); 515 MaybeObject* maybe_a = HEAP->LookupAsciiSymbol(string);
511 // LookupAsciiSymbol may return a failure if a GC is needed. 516 // LookupAsciiSymbol may return a failure if a GC is needed.
512 if (!maybe_a->ToObject(&a)) continue; 517 if (!maybe_a->ToObject(&a)) continue;
513 CHECK(a->IsSymbol()); 518 CHECK(a->IsSymbol());
514 Object* b; 519 Object* b;
515 MaybeObject *maybe_b = Heap::LookupAsciiSymbol(string); 520 MaybeObject* maybe_b = HEAP->LookupAsciiSymbol(string);
516 if (!maybe_b->ToObject(&b)) continue; 521 if (!maybe_b->ToObject(&b)) continue;
517 CHECK_EQ(b, a); 522 CHECK_EQ(b, a);
518 CHECK(String::cast(b)->IsEqualTo(CStrVector(string))); 523 CHECK(String::cast(b)->IsEqualTo(CStrVector(string)));
519 } 524 }
520 } 525 }
521 526
522 527
523 TEST(SymbolTable) { 528 TEST(SymbolTable) {
524 InitializeVM(); 529 InitializeVM();
525 530
526 CheckSymbols(not_so_random_string_table); 531 CheckSymbols(not_so_random_string_table);
527 CheckSymbols(not_so_random_string_table); 532 CheckSymbols(not_so_random_string_table);
528 } 533 }
529 534
530 535
531 TEST(FunctionAllocation) { 536 TEST(FunctionAllocation) {
532 InitializeVM(); 537 InitializeVM();
533 538
534 v8::HandleScope sc; 539 v8::HandleScope sc;
535 Handle<String> name = Factory::LookupAsciiSymbol("theFunction"); 540 Handle<String> name = FACTORY->LookupAsciiSymbol("theFunction");
536 Handle<JSFunction> function = 541 Handle<JSFunction> function =
537 Factory::NewFunction(name, Factory::undefined_value()); 542 FACTORY->NewFunction(name, FACTORY->undefined_value());
538 Handle<Map> initial_map = 543 Handle<Map> initial_map =
539 Factory::NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); 544 FACTORY->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize);
540 function->set_initial_map(*initial_map); 545 function->set_initial_map(*initial_map);
541 546
542 Handle<String> prop_name = Factory::LookupAsciiSymbol("theSlot"); 547 Handle<String> prop_name = FACTORY->LookupAsciiSymbol("theSlot");
543 Handle<JSObject> obj = Factory::NewJSObject(function); 548 Handle<JSObject> obj = FACTORY->NewJSObject(function);
544 obj->SetProperty( 549 obj->SetProperty(
545 *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked(); 550 *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked();
546 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); 551 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name));
547 // Check that we can add properties to function objects. 552 // Check that we can add properties to function objects.
548 function->SetProperty( 553 function->SetProperty(
549 *prop_name, Smi::FromInt(24), NONE, kNonStrictMode)->ToObjectChecked(); 554 *prop_name, Smi::FromInt(24), NONE, kNonStrictMode)->ToObjectChecked();
550 CHECK_EQ(Smi::FromInt(24), function->GetProperty(*prop_name)); 555 CHECK_EQ(Smi::FromInt(24), function->GetProperty(*prop_name));
551 } 556 }
552 557
553 558
554 TEST(ObjectProperties) { 559 TEST(ObjectProperties) {
555 InitializeVM(); 560 InitializeVM();
556 561
557 v8::HandleScope sc; 562 v8::HandleScope sc;
558 String* object_symbol = String::cast(Heap::Object_symbol()); 563 String* object_symbol = String::cast(HEAP->Object_symbol());
559 Object* raw_object = 564 Object* raw_object = Isolate::Current()->context()->global()->
560 Top::context()->global()->GetProperty(object_symbol)->ToObjectChecked(); 565 GetProperty(object_symbol)->ToObjectChecked();
561 JSFunction* object_function = JSFunction::cast(raw_object); 566 JSFunction* object_function = JSFunction::cast(raw_object);
562 Handle<JSFunction> constructor(object_function); 567 Handle<JSFunction> constructor(object_function);
563 Handle<JSObject> obj = Factory::NewJSObject(constructor); 568 Handle<JSObject> obj = FACTORY->NewJSObject(constructor);
564 Handle<String> first = Factory::LookupAsciiSymbol("first"); 569 Handle<String> first = FACTORY->LookupAsciiSymbol("first");
565 Handle<String> second = Factory::LookupAsciiSymbol("second"); 570 Handle<String> second = FACTORY->LookupAsciiSymbol("second");
566 571
567 // check for empty 572 // check for empty
568 CHECK(!obj->HasLocalProperty(*first)); 573 CHECK(!obj->HasLocalProperty(*first));
569 574
570 // add first 575 // add first
571 obj->SetProperty( 576 obj->SetProperty(
572 *first, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked(); 577 *first, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked();
573 CHECK(obj->HasLocalProperty(*first)); 578 CHECK(obj->HasLocalProperty(*first));
574 579
575 // delete first 580 // delete first
(...skipping 25 matching lines...) Expand all
601 606
602 // delete second and then first 607 // delete second and then first
603 CHECK(obj->DeleteProperty(*second, JSObject::NORMAL_DELETION)); 608 CHECK(obj->DeleteProperty(*second, JSObject::NORMAL_DELETION));
604 CHECK(obj->HasLocalProperty(*first)); 609 CHECK(obj->HasLocalProperty(*first));
605 CHECK(obj->DeleteProperty(*first, JSObject::NORMAL_DELETION)); 610 CHECK(obj->DeleteProperty(*first, JSObject::NORMAL_DELETION));
606 CHECK(!obj->HasLocalProperty(*first)); 611 CHECK(!obj->HasLocalProperty(*first));
607 CHECK(!obj->HasLocalProperty(*second)); 612 CHECK(!obj->HasLocalProperty(*second));
608 613
609 // check string and symbol match 614 // check string and symbol match
610 static const char* string1 = "fisk"; 615 static const char* string1 = "fisk";
611 Handle<String> s1 = Factory::NewStringFromAscii(CStrVector(string1)); 616 Handle<String> s1 = FACTORY->NewStringFromAscii(CStrVector(string1));
612 obj->SetProperty( 617 obj->SetProperty(
613 *s1, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked(); 618 *s1, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked();
614 Handle<String> s1_symbol = Factory::LookupAsciiSymbol(string1); 619 Handle<String> s1_symbol = FACTORY->LookupAsciiSymbol(string1);
615 CHECK(obj->HasLocalProperty(*s1_symbol)); 620 CHECK(obj->HasLocalProperty(*s1_symbol));
616 621
617 // check symbol and string match 622 // check symbol and string match
618 static const char* string2 = "fugl"; 623 static const char* string2 = "fugl";
619 Handle<String> s2_symbol = Factory::LookupAsciiSymbol(string2); 624 Handle<String> s2_symbol = FACTORY->LookupAsciiSymbol(string2);
620 obj->SetProperty( 625 obj->SetProperty(
621 *s2_symbol, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked(); 626 *s2_symbol, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked();
622 Handle<String> s2 = Factory::NewStringFromAscii(CStrVector(string2)); 627 Handle<String> s2 = FACTORY->NewStringFromAscii(CStrVector(string2));
623 CHECK(obj->HasLocalProperty(*s2)); 628 CHECK(obj->HasLocalProperty(*s2));
624 } 629 }
625 630
626 631
627 TEST(JSObjectMaps) { 632 TEST(JSObjectMaps) {
628 InitializeVM(); 633 InitializeVM();
629 634
630 v8::HandleScope sc; 635 v8::HandleScope sc;
631 Handle<String> name = Factory::LookupAsciiSymbol("theFunction"); 636 Handle<String> name = FACTORY->LookupAsciiSymbol("theFunction");
632 Handle<JSFunction> function = 637 Handle<JSFunction> function =
633 Factory::NewFunction(name, Factory::undefined_value()); 638 FACTORY->NewFunction(name, FACTORY->undefined_value());
634 Handle<Map> initial_map = 639 Handle<Map> initial_map =
635 Factory::NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); 640 FACTORY->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize);
636 function->set_initial_map(*initial_map); 641 function->set_initial_map(*initial_map);
637 642
638 Handle<String> prop_name = Factory::LookupAsciiSymbol("theSlot"); 643 Handle<String> prop_name = FACTORY->LookupAsciiSymbol("theSlot");
639 Handle<JSObject> obj = Factory::NewJSObject(function); 644 Handle<JSObject> obj = FACTORY->NewJSObject(function);
640 645
641 // Set a propery 646 // Set a propery
642 obj->SetProperty( 647 obj->SetProperty(
643 *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked(); 648 *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked();
644 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); 649 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name));
645 650
646 // Check the map has changed 651 // Check the map has changed
647 CHECK(*initial_map != obj->map()); 652 CHECK(*initial_map != obj->map());
648 } 653 }
649 654
650 655
651 TEST(JSArray) { 656 TEST(JSArray) {
652 InitializeVM(); 657 InitializeVM();
653 658
654 v8::HandleScope sc; 659 v8::HandleScope sc;
655 Handle<String> name = Factory::LookupAsciiSymbol("Array"); 660 Handle<String> name = FACTORY->LookupAsciiSymbol("Array");
656 Object* raw_object = 661 Object* raw_object = Isolate::Current()->context()->global()->
657 Top::context()->global()->GetProperty(*name)->ToObjectChecked(); 662 GetProperty(*name)->ToObjectChecked();
658 Handle<JSFunction> function = Handle<JSFunction>( 663 Handle<JSFunction> function = Handle<JSFunction>(
659 JSFunction::cast(raw_object)); 664 JSFunction::cast(raw_object));
660 665
661 // Allocate the object. 666 // Allocate the object.
662 Handle<JSObject> object = Factory::NewJSObject(function); 667 Handle<JSObject> object = FACTORY->NewJSObject(function);
663 Handle<JSArray> array = Handle<JSArray>::cast(object); 668 Handle<JSArray> array = Handle<JSArray>::cast(object);
664 // We just initialized the VM, no heap allocation failure yet. 669 // We just initialized the VM, no heap allocation failure yet.
665 Object* ok = array->Initialize(0)->ToObjectChecked(); 670 Object* ok = array->Initialize(0)->ToObjectChecked();
666 671
667 // Set array length to 0. 672 // Set array length to 0.
668 ok = array->SetElementsLength(Smi::FromInt(0))->ToObjectChecked(); 673 ok = array->SetElementsLength(Smi::FromInt(0))->ToObjectChecked();
669 CHECK_EQ(Smi::FromInt(0), array->length()); 674 CHECK_EQ(Smi::FromInt(0), array->length());
670 CHECK(array->HasFastElements()); // Must be in fast mode. 675 CHECK(array->HasFastElements()); // Must be in fast mode.
671 676
672 // array[length] = name. 677 // array[length] = name.
673 ok = array->SetElement(0, *name, kNonStrictMode)->ToObjectChecked(); 678 ok = array->SetElement(0, *name, kNonStrictMode)->ToObjectChecked();
674 CHECK_EQ(Smi::FromInt(1), array->length()); 679 CHECK_EQ(Smi::FromInt(1), array->length());
675 CHECK_EQ(array->GetElement(0), *name); 680 CHECK_EQ(array->GetElement(0), *name);
676 681
677 // Set array length with larger than smi value. 682 // Set array length with larger than smi value.
678 Handle<Object> length = 683 Handle<Object> length =
679 Factory::NewNumberFromUint(static_cast<uint32_t>(Smi::kMaxValue) + 1); 684 FACTORY->NewNumberFromUint(static_cast<uint32_t>(Smi::kMaxValue) + 1);
680 ok = array->SetElementsLength(*length)->ToObjectChecked(); 685 ok = array->SetElementsLength(*length)->ToObjectChecked();
681 686
682 uint32_t int_length = 0; 687 uint32_t int_length = 0;
683 CHECK(length->ToArrayIndex(&int_length)); 688 CHECK(length->ToArrayIndex(&int_length));
684 CHECK_EQ(*length, array->length()); 689 CHECK_EQ(*length, array->length());
685 CHECK(array->HasDictionaryElements()); // Must be in slow mode. 690 CHECK(array->HasDictionaryElements()); // Must be in slow mode.
686 691
687 // array[length] = name. 692 // array[length] = name.
688 ok = array->SetElement(int_length, *name, kNonStrictMode)->ToObjectChecked(); 693 ok = array->SetElement(int_length, *name, kNonStrictMode)->ToObjectChecked();
689 uint32_t new_int_length = 0; 694 uint32_t new_int_length = 0;
690 CHECK(array->length()->ToArrayIndex(&new_int_length)); 695 CHECK(array->length()->ToArrayIndex(&new_int_length));
691 CHECK_EQ(static_cast<double>(int_length), new_int_length - 1); 696 CHECK_EQ(static_cast<double>(int_length), new_int_length - 1);
692 CHECK_EQ(array->GetElement(int_length), *name); 697 CHECK_EQ(array->GetElement(int_length), *name);
693 CHECK_EQ(array->GetElement(0), *name); 698 CHECK_EQ(array->GetElement(0), *name);
694 } 699 }
695 700
696 701
697 TEST(JSObjectCopy) { 702 TEST(JSObjectCopy) {
698 InitializeVM(); 703 InitializeVM();
699 704
700 v8::HandleScope sc; 705 v8::HandleScope sc;
701 String* object_symbol = String::cast(Heap::Object_symbol()); 706 String* object_symbol = String::cast(HEAP->Object_symbol());
702 Object* raw_object = 707 Object* raw_object = Isolate::Current()->context()->global()->
703 Top::context()->global()->GetProperty(object_symbol)->ToObjectChecked(); 708 GetProperty(object_symbol)->ToObjectChecked();
704 JSFunction* object_function = JSFunction::cast(raw_object); 709 JSFunction* object_function = JSFunction::cast(raw_object);
705 Handle<JSFunction> constructor(object_function); 710 Handle<JSFunction> constructor(object_function);
706 Handle<JSObject> obj = Factory::NewJSObject(constructor); 711 Handle<JSObject> obj = FACTORY->NewJSObject(constructor);
707 Handle<String> first = Factory::LookupAsciiSymbol("first"); 712 Handle<String> first = FACTORY->LookupAsciiSymbol("first");
708 Handle<String> second = Factory::LookupAsciiSymbol("second"); 713 Handle<String> second = FACTORY->LookupAsciiSymbol("second");
709 714
710 obj->SetProperty( 715 obj->SetProperty(
711 *first, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked(); 716 *first, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked();
712 obj->SetProperty( 717 obj->SetProperty(
713 *second, Smi::FromInt(2), NONE, kNonStrictMode)->ToObjectChecked(); 718 *second, Smi::FromInt(2), NONE, kNonStrictMode)->ToObjectChecked();
714 719
715 Object* ok = obj->SetElement(0, *first, kNonStrictMode)->ToObjectChecked(); 720 Object* ok = obj->SetElement(0, *first, kNonStrictMode)->ToObjectChecked();
716 721
717 ok = obj->SetElement(1, *second, kNonStrictMode)->ToObjectChecked(); 722 ok = obj->SetElement(1, *second, kNonStrictMode)->ToObjectChecked();
718 723
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
754 char* ascii = NewArray<char>(length + 1); 759 char* ascii = NewArray<char>(length + 1);
755 non_ascii[3 * length] = 0; 760 non_ascii[3 * length] = 0;
756 ascii[length] = 0; 761 ascii[length] = 0;
757 for (int i = 0; i < length; i++) { 762 for (int i = 0; i < length; i++) {
758 ascii[i] = 'a'; 763 ascii[i] = 'a';
759 non_ascii[3 * i] = chars[0]; 764 non_ascii[3 * i] = chars[0];
760 non_ascii[3 * i + 1] = chars[1]; 765 non_ascii[3 * i + 1] = chars[1];
761 non_ascii[3 * i + 2] = chars[2]; 766 non_ascii[3 * i + 2] = chars[2];
762 } 767 }
763 Handle<String> non_ascii_sym = 768 Handle<String> non_ascii_sym =
764 Factory::LookupSymbol(Vector<const char>(non_ascii, 3 * length)); 769 FACTORY->LookupSymbol(Vector<const char>(non_ascii, 3 * length));
765 CHECK_EQ(length, non_ascii_sym->length()); 770 CHECK_EQ(length, non_ascii_sym->length());
766 Handle<String> ascii_sym = 771 Handle<String> ascii_sym =
767 Factory::LookupSymbol(Vector<const char>(ascii, length)); 772 FACTORY->LookupSymbol(Vector<const char>(ascii, length));
768 CHECK_EQ(length, ascii_sym->length()); 773 CHECK_EQ(length, ascii_sym->length());
769 Handle<String> non_ascii_str = 774 Handle<String> non_ascii_str =
770 Factory::NewStringFromUtf8(Vector<const char>(non_ascii, 3 * length)); 775 FACTORY->NewStringFromUtf8(Vector<const char>(non_ascii, 3 * length));
771 non_ascii_str->Hash(); 776 non_ascii_str->Hash();
772 CHECK_EQ(length, non_ascii_str->length()); 777 CHECK_EQ(length, non_ascii_str->length());
773 Handle<String> ascii_str = 778 Handle<String> ascii_str =
774 Factory::NewStringFromUtf8(Vector<const char>(ascii, length)); 779 FACTORY->NewStringFromUtf8(Vector<const char>(ascii, length));
775 ascii_str->Hash(); 780 ascii_str->Hash();
776 CHECK_EQ(length, ascii_str->length()); 781 CHECK_EQ(length, ascii_str->length());
777 DeleteArray(non_ascii); 782 DeleteArray(non_ascii);
778 DeleteArray(ascii); 783 DeleteArray(ascii);
779 } 784 }
780 } 785 }
781 786
782 787
783 static int ObjectsFoundInHeap(Handle<Object> objs[], int size) { 788 static int ObjectsFoundInHeap(Handle<Object> objs[], int size) {
784 // Count the number of objects found in the heap. 789 // Count the number of objects found in the heap.
(...skipping 13 matching lines...) Expand all
798 TEST(Iteration) { 803 TEST(Iteration) {
799 InitializeVM(); 804 InitializeVM();
800 v8::HandleScope scope; 805 v8::HandleScope scope;
801 806
802 // Array of objects to scan haep for. 807 // Array of objects to scan haep for.
803 const int objs_count = 6; 808 const int objs_count = 6;
804 Handle<Object> objs[objs_count]; 809 Handle<Object> objs[objs_count];
805 int next_objs_index = 0; 810 int next_objs_index = 0;
806 811
807 // Allocate a JS array to OLD_POINTER_SPACE and NEW_SPACE 812 // Allocate a JS array to OLD_POINTER_SPACE and NEW_SPACE
808 objs[next_objs_index++] = Factory::NewJSArray(10); 813 objs[next_objs_index++] = FACTORY->NewJSArray(10);
809 objs[next_objs_index++] = Factory::NewJSArray(10, TENURED); 814 objs[next_objs_index++] = FACTORY->NewJSArray(10, TENURED);
810 815
811 // Allocate a small string to OLD_DATA_SPACE and NEW_SPACE 816 // Allocate a small string to OLD_DATA_SPACE and NEW_SPACE
812 objs[next_objs_index++] = 817 objs[next_objs_index++] =
813 Factory::NewStringFromAscii(CStrVector("abcdefghij")); 818 FACTORY->NewStringFromAscii(CStrVector("abcdefghij"));
814 objs[next_objs_index++] = 819 objs[next_objs_index++] =
815 Factory::NewStringFromAscii(CStrVector("abcdefghij"), TENURED); 820 FACTORY->NewStringFromAscii(CStrVector("abcdefghij"), TENURED);
816 821
817 // Allocate a large string (for large object space). 822 // Allocate a large string (for large object space).
818 int large_size = Heap::MaxObjectSizeInPagedSpace() + 1; 823 int large_size = HEAP->MaxObjectSizeInPagedSpace() + 1;
819 char* str = new char[large_size]; 824 char* str = new char[large_size];
820 for (int i = 0; i < large_size - 1; ++i) str[i] = 'a'; 825 for (int i = 0; i < large_size - 1; ++i) str[i] = 'a';
821 str[large_size - 1] = '\0'; 826 str[large_size - 1] = '\0';
822 objs[next_objs_index++] = 827 objs[next_objs_index++] =
823 Factory::NewStringFromAscii(CStrVector(str), TENURED); 828 FACTORY->NewStringFromAscii(CStrVector(str), TENURED);
824 delete[] str; 829 delete[] str;
825 830
826 // Add a Map object to look for. 831 // Add a Map object to look for.
827 objs[next_objs_index++] = Handle<Map>(HeapObject::cast(*objs[0])->map()); 832 objs[next_objs_index++] = Handle<Map>(HeapObject::cast(*objs[0])->map());
828 833
829 CHECK_EQ(objs_count, next_objs_index); 834 CHECK_EQ(objs_count, next_objs_index);
830 CHECK_EQ(objs_count, ObjectsFoundInHeap(objs, objs_count)); 835 CHECK_EQ(objs_count, ObjectsFoundInHeap(objs, objs_count));
831 } 836 }
832 837
833 838
(...skipping 16 matching lines...) Expand all
850 static int LenFromSize(int size) { 855 static int LenFromSize(int size) {
851 return (size - FixedArray::kHeaderSize) / kPointerSize; 856 return (size - FixedArray::kHeaderSize) / kPointerSize;
852 } 857 }
853 858
854 859
855 TEST(Regression39128) { 860 TEST(Regression39128) {
856 // Test case for crbug.com/39128. 861 // Test case for crbug.com/39128.
857 InitializeVM(); 862 InitializeVM();
858 863
859 // Increase the chance of 'bump-the-pointer' allocation in old space. 864 // Increase the chance of 'bump-the-pointer' allocation in old space.
860 Heap::CollectAllGarbage(Heap::kForceCompactionMask); 865 HEAP->CollectAllGarbage(Heap::kForceCompactionMask);
861 866
862 v8::HandleScope scope; 867 v8::HandleScope scope;
863 868
864 // The plan: create JSObject which references objects in new space. 869 // The plan: create JSObject which references objects in new space.
865 // Then clone this object (forcing it to go into old space) and check 870 // Then clone this object (forcing it to go into old space) and check
866 // that region dirty marks are updated correctly. 871 // that region dirty marks are updated correctly.
867 872
868 // Step 1: prepare a map for the object. We add 1 inobject property to it. 873 // Step 1: prepare a map for the object. We add 1 inobject property to it.
869 Handle<JSFunction> object_ctor(Top::global_context()->object_function()); 874 Handle<JSFunction> object_ctor(
875 Isolate::Current()->global_context()->object_function());
870 CHECK(object_ctor->has_initial_map()); 876 CHECK(object_ctor->has_initial_map());
871 Handle<Map> object_map(object_ctor->initial_map()); 877 Handle<Map> object_map(object_ctor->initial_map());
872 // Create a map with single inobject property. 878 // Create a map with single inobject property.
873 Handle<Map> my_map = Factory::CopyMap(object_map, 1); 879 Handle<Map> my_map = FACTORY->CopyMap(object_map, 1);
874 int n_properties = my_map->inobject_properties(); 880 int n_properties = my_map->inobject_properties();
875 CHECK_GT(n_properties, 0); 881 CHECK_GT(n_properties, 0);
876 882
877 int object_size = my_map->instance_size(); 883 int object_size = my_map->instance_size();
878 884
879 // Step 2: allocate a lot of objects so to almost fill new space: we need 885 // Step 2: allocate a lot of objects so to almost fill new space: we need
880 // just enough room to allocate JSObject and thus fill the newspace. 886 // just enough room to allocate JSObject and thus fill the newspace.
881 887
882 int allocation_amount = Min(FixedArray::kMaxSize, 888 int allocation_amount = Min(FixedArray::kMaxSize,
883 Heap::MaxObjectSizeInNewSpace()); 889 HEAP->MaxObjectSizeInNewSpace());
884 int allocation_len = LenFromSize(allocation_amount); 890 int allocation_len = LenFromSize(allocation_amount);
885 NewSpace* new_space = Heap::new_space(); 891 NewSpace* new_space = HEAP->new_space();
886 Address* top_addr = new_space->allocation_top_address(); 892 Address* top_addr = new_space->allocation_top_address();
887 Address* limit_addr = new_space->allocation_limit_address(); 893 Address* limit_addr = new_space->allocation_limit_address();
888 while ((*limit_addr - *top_addr) > allocation_amount) { 894 while ((*limit_addr - *top_addr) > allocation_amount) {
889 CHECK(!Heap::always_allocate()); 895 CHECK(!HEAP->always_allocate());
890 Object* array = 896 Object* array = HEAP->AllocateFixedArray(allocation_len)->ToObjectChecked();
891 Heap::AllocateFixedArray(allocation_len)->ToObjectChecked(); 897 CHECK(!array->IsFailure());
892 CHECK(new_space->Contains(array)); 898 CHECK(new_space->Contains(array));
893 } 899 }
894 900
895 // Step 3: now allocate fixed array and JSObject to fill the whole new space. 901 // Step 3: now allocate fixed array and JSObject to fill the whole new space.
896 int to_fill = static_cast<int>(*limit_addr - *top_addr - object_size); 902 int to_fill = static_cast<int>(*limit_addr - *top_addr - object_size);
897 int fixed_array_len = LenFromSize(to_fill); 903 int fixed_array_len = LenFromSize(to_fill);
898 CHECK(fixed_array_len < FixedArray::kMaxLength); 904 CHECK(fixed_array_len < FixedArray::kMaxLength);
899 905
900 CHECK(!Heap::always_allocate()); 906 CHECK(!HEAP->always_allocate());
901 Object* array = 907 Object* array = HEAP->AllocateFixedArray(fixed_array_len)->ToObjectChecked();
902 Heap::AllocateFixedArray(fixed_array_len)->ToObjectChecked(); 908 CHECK(!array->IsFailure());
903 CHECK(new_space->Contains(array)); 909 CHECK(new_space->Contains(array));
904 910
905 Object* object = Heap::AllocateJSObjectFromMap(*my_map)->ToObjectChecked(); 911 Object* object = HEAP->AllocateJSObjectFromMap(*my_map)->ToObjectChecked();
906 CHECK(new_space->Contains(object)); 912 CHECK(new_space->Contains(object));
907 JSObject* jsobject = JSObject::cast(object); 913 JSObject* jsobject = JSObject::cast(object);
908 CHECK_EQ(0, FixedArray::cast(jsobject->elements())->length()); 914 CHECK_EQ(0, FixedArray::cast(jsobject->elements())->length());
909 CHECK_EQ(0, jsobject->properties()->length()); 915 CHECK_EQ(0, jsobject->properties()->length());
910 // Create a reference to object in new space in jsobject. 916 // Create a reference to object in new space in jsobject.
911 jsobject->FastPropertyAtPut(-1, array); 917 jsobject->FastPropertyAtPut(-1, array);
912 918
913 CHECK_EQ(0, static_cast<int>(*limit_addr - *top_addr)); 919 CHECK_EQ(0, static_cast<int>(*limit_addr - *top_addr));
914 920
915 // Step 4: clone jsobject, but force always allocate first to create a clone 921 // Step 4: clone jsobject, but force always allocate first to create a clone
916 // in old pointer space. 922 // in old pointer space.
917 Address old_pointer_space_top = Heap::old_pointer_space()->top(); 923 Address old_pointer_space_top = HEAP->old_pointer_space()->top();
918 AlwaysAllocateScope aa_scope; 924 AlwaysAllocateScope aa_scope;
919 Object* clone_obj = Heap::CopyJSObject(jsobject)->ToObjectChecked(); 925 Object* clone_obj = HEAP->CopyJSObject(jsobject)->ToObjectChecked();
920 JSObject* clone = JSObject::cast(clone_obj); 926 JSObject* clone = JSObject::cast(clone_obj);
921 if (clone->address() != old_pointer_space_top) { 927 if (clone->address() != old_pointer_space_top) {
922 // Alas, got allocated from free list, we cannot do checks. 928 // Alas, got allocated from free list, we cannot do checks.
923 return; 929 return;
924 } 930 }
925 CHECK(Heap::old_pointer_space()->Contains(clone->address())); 931 CHECK(HEAP->old_pointer_space()->Contains(clone->address()));
926 } 932 }
927 933
928 934
929 TEST(TestCodeFlushing) { 935 TEST(TestCodeFlushing) {
930 i::FLAG_allow_natives_syntax = true; 936 i::FLAG_allow_natives_syntax = true;
931 // If we do not flush code this test is invalid. 937 // If we do not flush code this test is invalid.
932 if (!FLAG_flush_code) return; 938 if (!FLAG_flush_code) return;
933 InitializeVM(); 939 InitializeVM();
934 v8::HandleScope scope; 940 v8::HandleScope scope;
935 const char* source = "function foo() {" 941 const char* source = "function foo() {"
936 " var x = 42;" 942 " var x = 42;"
937 " var y = 42;" 943 " var y = 42;"
938 " var z = x + y;" 944 " var z = x + y;"
939 "};" 945 "};"
940 "foo()"; 946 "foo()";
941 Handle<String> foo_name = Factory::LookupAsciiSymbol("foo"); 947 Handle<String> foo_name = FACTORY->LookupAsciiSymbol("foo");
942 948
943 // This compile will add the code to the compilation cache. 949 // This compile will add the code to the compilation cache.
944 { v8::HandleScope scope; 950 { v8::HandleScope scope;
945 CompileRun(source); 951 CompileRun(source);
946 } 952 }
947 953
948 // Check function is compiled. 954 // Check function is compiled.
949 Object* func_value = 955 Object* func_value = Isolate::Current()->context()->global()->
950 Top::context()->global()->GetProperty(*foo_name)->ToObjectChecked(); 956 GetProperty(*foo_name)->ToObjectChecked();
951 CHECK(func_value->IsJSFunction()); 957 CHECK(func_value->IsJSFunction());
952 Handle<JSFunction> function(JSFunction::cast(func_value)); 958 Handle<JSFunction> function(JSFunction::cast(func_value));
953 CHECK(function->shared()->is_compiled()); 959 CHECK(function->shared()->is_compiled());
954 960
955 Heap::CollectAllGarbage(Heap::kForceCompactionMask); 961 HEAP->CollectAllGarbage(Heap::kForceCompactionMask);
956 Heap::CollectAllGarbage(Heap::kForceCompactionMask); 962 HEAP->CollectAllGarbage(Heap::kForceCompactionMask);
957 963
958 CHECK(function->shared()->is_compiled()); 964 CHECK(function->shared()->is_compiled());
959 965
960 Heap::CollectAllGarbage(Heap::kForceCompactionMask); 966 HEAP->CollectAllGarbage(Heap::kForceCompactionMask);
961 Heap::CollectAllGarbage(Heap::kForceCompactionMask); 967 HEAP->CollectAllGarbage(Heap::kForceCompactionMask);
962 Heap::CollectAllGarbage(Heap::kForceCompactionMask); 968 HEAP->CollectAllGarbage(Heap::kForceCompactionMask);
963 Heap::CollectAllGarbage(Heap::kForceCompactionMask); 969 HEAP->CollectAllGarbage(Heap::kForceCompactionMask);
964 Heap::CollectAllGarbage(Heap::kForceCompactionMask); 970 HEAP->CollectAllGarbage(Heap::kForceCompactionMask);
965 Heap::CollectAllGarbage(Heap::kForceCompactionMask); 971 HEAP->CollectAllGarbage(Heap::kForceCompactionMask);
966 972
967 // foo should no longer be in the compilation cache 973 // foo should no longer be in the compilation cache
968 CHECK(!function->shared()->is_compiled() || function->IsOptimized()); 974 CHECK(!function->shared()->is_compiled() || function->IsOptimized());
969 CHECK(!function->is_compiled() || function->IsOptimized()); 975 CHECK(!function->is_compiled() || function->IsOptimized());
970 // Call foo to get it recompiled. 976 // Call foo to get it recompiled.
971 CompileRun("foo()"); 977 CompileRun("foo()");
972 CHECK(function->shared()->is_compiled()); 978 CHECK(function->shared()->is_compiled());
973 CHECK(function->is_compiled()); 979 CHECK(function->is_compiled());
974 } 980 }
975 981
976 982
977 // Count the number of global contexts in the weak list of global contexts. 983 // Count the number of global contexts in the weak list of global contexts.
978 static int CountGlobalContexts() { 984 static int CountGlobalContexts() {
979 int count = 0; 985 int count = 0;
980 Object* object = Heap::global_contexts_list(); 986 Object* object = HEAP->global_contexts_list();
981 while (!object->IsUndefined()) { 987 while (!object->IsUndefined()) {
982 count++; 988 count++;
983 object = Context::cast(object)->get(Context::NEXT_CONTEXT_LINK); 989 object = Context::cast(object)->get(Context::NEXT_CONTEXT_LINK);
984 } 990 }
985 return count; 991 return count;
986 } 992 }
987 993
988 994
989 // Count the number of user functions in the weak list of optimized 995 // Count the number of user functions in the weak list of optimized
990 // functions attached to a global context. 996 // functions attached to a global context.
991 static int CountOptimizedUserFunctions(v8::Handle<v8::Context> context) { 997 static int CountOptimizedUserFunctions(v8::Handle<v8::Context> context) {
992 int count = 0; 998 int count = 0;
993 Handle<Context> icontext = v8::Utils::OpenHandle(*context); 999 Handle<Context> icontext = v8::Utils::OpenHandle(*context);
994 Object* object = icontext->get(Context::OPTIMIZED_FUNCTIONS_LIST); 1000 Object* object = icontext->get(Context::OPTIMIZED_FUNCTIONS_LIST);
995 while (object->IsJSFunction() && !JSFunction::cast(object)->IsBuiltin()) { 1001 while (object->IsJSFunction() && !JSFunction::cast(object)->IsBuiltin()) {
996 count++; 1002 count++;
997 object = JSFunction::cast(object)->next_function_link(); 1003 object = JSFunction::cast(object)->next_function_link();
998 } 1004 }
999 return count; 1005 return count;
1000 } 1006 }
1001 1007
1002 1008
1003 TEST(TestInternalWeakLists) { 1009 TEST(TestInternalWeakLists) {
1010 v8::V8::Initialize();
1011
1004 static const int kNumTestContexts = 10; 1012 static const int kNumTestContexts = 10;
1005 1013
1006 v8::HandleScope scope; 1014 v8::HandleScope scope;
1007 v8::Persistent<v8::Context> ctx[kNumTestContexts]; 1015 v8::Persistent<v8::Context> ctx[kNumTestContexts];
1008 1016
1009 CHECK_EQ(0, CountGlobalContexts()); 1017 CHECK_EQ(0, CountGlobalContexts());
1010 1018
1011 // Create a number of global contests which gets linked together. 1019 // Create a number of global contests which gets linked together.
1012 for (int i = 0; i < kNumTestContexts; i++) { 1020 for (int i = 0; i < kNumTestContexts; i++) {
1013 ctx[i] = v8::Context::New(); 1021 ctx[i] = v8::Context::New();
(...skipping 23 matching lines...) Expand all
1037 CompileRun("f4()"); 1045 CompileRun("f4()");
1038 CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctions(ctx[i])); 1046 CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctions(ctx[i]));
1039 CompileRun("f5()"); 1047 CompileRun("f5()");
1040 CHECK_EQ(opt ? 5 : 0, CountOptimizedUserFunctions(ctx[i])); 1048 CHECK_EQ(opt ? 5 : 0, CountOptimizedUserFunctions(ctx[i]));
1041 1049
1042 // Remove function f1, and 1050 // Remove function f1, and
1043 CompileRun("f1=null"); 1051 CompileRun("f1=null");
1044 1052
1045 // Scavenge treats these references as strong. 1053 // Scavenge treats these references as strong.
1046 for (int j = 0; j < 10; j++) { 1054 for (int j = 0; j < 10; j++) {
1047 Heap::PerformScavenge(); 1055 HEAP->PerformScavenge();
1048 CHECK_EQ(opt ? 5 : 0, CountOptimizedUserFunctions(ctx[i])); 1056 CHECK_EQ(opt ? 5 : 0, CountOptimizedUserFunctions(ctx[i]));
1049 } 1057 }
1050 1058
1051 // Mark compact handles the weak references. 1059 // Mark compact handles the weak references.
1052 Heap::CollectAllGarbage(Heap::kForceCompactionMask); 1060 HEAP->CollectAllGarbage(Heap::kForceCompactionMask);
1053 CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctions(ctx[i])); 1061 CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctions(ctx[i]));
1054 1062
1055 // Get rid of f3 and f5 in the same way. 1063 // Get rid of f3 and f5 in the same way.
1056 CompileRun("f3=null"); 1064 CompileRun("f3=null");
1057 for (int j = 0; j < 10; j++) { 1065 for (int j = 0; j < 10; j++) {
1058 Heap::PerformScavenge(); 1066 HEAP->PerformScavenge();
1059 CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctions(ctx[i])); 1067 CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctions(ctx[i]));
1060 } 1068 }
1061 Heap::CollectAllGarbage(Heap::kForceCompactionMask); 1069 HEAP->CollectAllGarbage(Heap::kForceCompactionMask);
1062 CHECK_EQ(opt ? 3 : 0, CountOptimizedUserFunctions(ctx[i])); 1070 CHECK_EQ(opt ? 3 : 0, CountOptimizedUserFunctions(ctx[i]));
1063 CompileRun("f5=null"); 1071 CompileRun("f5=null");
1064 for (int j = 0; j < 10; j++) { 1072 for (int j = 0; j < 10; j++) {
1065 Heap::PerformScavenge(); 1073 HEAP->PerformScavenge();
1066 CHECK_EQ(opt ? 3 : 0, CountOptimizedUserFunctions(ctx[i])); 1074 CHECK_EQ(opt ? 3 : 0, CountOptimizedUserFunctions(ctx[i]));
1067 } 1075 }
1068 Heap::CollectAllGarbage(Heap::kForceCompactionMask); 1076 HEAP->CollectAllGarbage(Heap::kForceCompactionMask);
1069 CHECK_EQ(opt ? 2 : 0, CountOptimizedUserFunctions(ctx[i])); 1077 CHECK_EQ(opt ? 2 : 0, CountOptimizedUserFunctions(ctx[i]));
1070 1078
1071 ctx[i]->Exit(); 1079 ctx[i]->Exit();
1072 } 1080 }
1073 1081
1074 // Force compilation cache cleanup. 1082 // Force compilation cache cleanup.
1075 Heap::CollectAllGarbage(Heap::kForceCompactionMask); 1083 HEAP->CollectAllGarbage(Heap::kForceCompactionMask);
1076 1084
1077 // Dispose the global contexts one by one. 1085 // Dispose the global contexts one by one.
1078 for (int i = 0; i < kNumTestContexts; i++) { 1086 for (int i = 0; i < kNumTestContexts; i++) {
1079 ctx[i].Dispose(); 1087 ctx[i].Dispose();
1080 ctx[i].Clear(); 1088 ctx[i].Clear();
1081 1089
1082 // Scavenge treats these references as strong. 1090 // Scavenge treats these references as strong.
1083 for (int j = 0; j < 10; j++) { 1091 for (int j = 0; j < 10; j++) {
1084 Heap::PerformScavenge(); 1092 HEAP->PerformScavenge();
1085 CHECK_EQ(kNumTestContexts - i, CountGlobalContexts()); 1093 CHECK_EQ(kNumTestContexts - i, CountGlobalContexts());
1086 } 1094 }
1087 1095
1088 // Mark compact handles the weak references. 1096 // Mark compact handles the weak references.
1089 Heap::CollectAllGarbage(Heap::kForceCompactionMask); 1097 HEAP->CollectAllGarbage(Heap::kForceCompactionMask);
1090 CHECK_EQ(kNumTestContexts - i - 1, CountGlobalContexts()); 1098 CHECK_EQ(kNumTestContexts - i - 1, CountGlobalContexts());
1091 } 1099 }
1092 1100
1093 CHECK_EQ(0, CountGlobalContexts()); 1101 CHECK_EQ(0, CountGlobalContexts());
1094 } 1102 }
1095 1103
1096 1104
1097 // Count the number of global contexts in the weak list of global contexts 1105 // Count the number of global contexts in the weak list of global contexts
1098 // causing a GC after the specified number of elements. 1106 // causing a GC after the specified number of elements.
1099 static int CountGlobalContextsWithGC(int n) { 1107 static int CountGlobalContextsWithGC(int n) {
1100 int count = 0; 1108 int count = 0;
1101 Handle<Object> object(Heap::global_contexts_list()); 1109 Handle<Object> object(HEAP->global_contexts_list());
1102 while (!object->IsUndefined()) { 1110 while (!object->IsUndefined()) {
1103 count++; 1111 count++;
1104 if (count == n) Heap::CollectAllGarbage(Heap::kForceCompactionMask); 1112 if (count == n) HEAP->CollectAllGarbage(Heap::kForceCompactionMask);
1105 object = 1113 object =
1106 Handle<Object>(Context::cast(*object)->get(Context::NEXT_CONTEXT_LINK)); 1114 Handle<Object>(Context::cast(*object)->get(Context::NEXT_CONTEXT_LINK));
1107 } 1115 }
1108 return count; 1116 return count;
1109 } 1117 }
1110 1118
1111 1119
1112 // Count the number of user functions in the weak list of optimized 1120 // Count the number of user functions in the weak list of optimized
1113 // functions attached to a global context causing a GC after the 1121 // functions attached to a global context causing a GC after the
1114 // specified number of elements. 1122 // specified number of elements.
1115 static int CountOptimizedUserFunctionsWithGC(v8::Handle<v8::Context> context, 1123 static int CountOptimizedUserFunctionsWithGC(v8::Handle<v8::Context> context,
1116 int n) { 1124 int n) {
1117 int count = 0; 1125 int count = 0;
1118 Handle<Context> icontext = v8::Utils::OpenHandle(*context); 1126 Handle<Context> icontext = v8::Utils::OpenHandle(*context);
1119 Handle<Object> object(icontext->get(Context::OPTIMIZED_FUNCTIONS_LIST)); 1127 Handle<Object> object(icontext->get(Context::OPTIMIZED_FUNCTIONS_LIST));
1120 while (object->IsJSFunction() && 1128 while (object->IsJSFunction() &&
1121 !Handle<JSFunction>::cast(object)->IsBuiltin()) { 1129 !Handle<JSFunction>::cast(object)->IsBuiltin()) {
1122 count++; 1130 count++;
1123 if (count == n) Heap::CollectAllGarbage(Heap::kForceCompactionMask); 1131 if (count == n) HEAP->CollectAllGarbage(Heap::kForceCompactionMask);
1124 object = Handle<Object>( 1132 object = Handle<Object>(
1125 Object::cast(JSFunction::cast(*object)->next_function_link())); 1133 Object::cast(JSFunction::cast(*object)->next_function_link()));
1126 } 1134 }
1127 return count; 1135 return count;
1128 } 1136 }
1129 1137
1130 1138
1131 TEST(TestInternalWeakListsTraverseWithGC) { 1139 TEST(TestInternalWeakListsTraverseWithGC) {
1140 v8::V8::Initialize();
1141
1132 static const int kNumTestContexts = 10; 1142 static const int kNumTestContexts = 10;
1133 1143
1134 v8::HandleScope scope; 1144 v8::HandleScope scope;
1135 v8::Persistent<v8::Context> ctx[kNumTestContexts]; 1145 v8::Persistent<v8::Context> ctx[kNumTestContexts];
1136 1146
1137 CHECK_EQ(0, CountGlobalContexts()); 1147 CHECK_EQ(0, CountGlobalContexts());
1138 1148
1139 // Create an number of contexts and check the length of the weak list both 1149 // Create an number of contexts and check the length of the weak list both
1140 // with and without GCs while iterating the list. 1150 // with and without GCs while iterating the list.
1141 for (int i = 0; i < kNumTestContexts; i++) { 1151 for (int i = 0; i < kNumTestContexts; i++) {
(...skipping 29 matching lines...) Expand all
1171 CompileRun("f5()"); 1181 CompileRun("f5()");
1172 CHECK_EQ(opt ? 5 : 0, CountOptimizedUserFunctions(ctx[0])); 1182 CHECK_EQ(opt ? 5 : 0, CountOptimizedUserFunctions(ctx[0]));
1173 CHECK_EQ(opt ? 5 : 0, CountOptimizedUserFunctionsWithGC(ctx[0], 4)); 1183 CHECK_EQ(opt ? 5 : 0, CountOptimizedUserFunctionsWithGC(ctx[0], 4));
1174 1184
1175 ctx[0]->Exit(); 1185 ctx[0]->Exit();
1176 } 1186 }
1177 1187
1178 1188
1179 TEST(TestSizeOfObjectsVsHeapIteratorPrecision) { 1189 TEST(TestSizeOfObjectsVsHeapIteratorPrecision) {
1180 InitializeVM(); 1190 InitializeVM();
1181 Heap::EnsureHeapIsIterable(); 1191 HEAP->EnsureHeapIsIterable();
1182 intptr_t size_of_objects_1 = Heap::SizeOfObjects(); 1192 intptr_t size_of_objects_1 = HEAP->SizeOfObjects();
1183 HeapIterator iterator; 1193 HeapIterator iterator;
1184 intptr_t size_of_objects_2 = 0; 1194 intptr_t size_of_objects_2 = 0;
1185 for (HeapObject* obj = iterator.Next(); 1195 for (HeapObject* obj = iterator.Next();
1186 obj != NULL; 1196 obj != NULL;
1187 obj = iterator.Next()) { 1197 obj = iterator.Next()) {
1188 size_of_objects_2 += obj->Size(); 1198 size_of_objects_2 += obj->Size();
1189 } 1199 }
1190 // Delta must be within 5% of the larger result. 1200 // Delta must be within 5% of the larger result.
1191 // TODO(gc): Tighten this up by distinguishing between byte 1201 // TODO(gc): Tighten this up by distinguishing between byte
1192 // arrays that are real and those that merely mark free space 1202 // arrays that are real and those that merely mark free space
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1225 else if (obj == b_) 1235 else if (obj == b_)
1226 b_found_ = true; 1236 b_found_ = true;
1227 } 1237 }
1228 } 1238 }
1229 private: 1239 private:
1230 Object* a_; 1240 Object* a_;
1231 Object* b_; 1241 Object* b_;
1232 bool a_found_; 1242 bool a_found_;
1233 bool b_found_; 1243 bool b_found_;
1234 }; 1244 };
1235
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698