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

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

Issue 13483017: Unify the way cctest initalizes the VM for each test case. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fixed presubmit errors. Created 7 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
« no previous file with comments | « test/cctest/test-func-name-inference.cc ('k') | test/cctest/test-log-stack-tracer.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 21 matching lines...) Expand all
32 #include "compilation-cache.h" 32 #include "compilation-cache.h"
33 #include "execution.h" 33 #include "execution.h"
34 #include "factory.h" 34 #include "factory.h"
35 #include "macro-assembler.h" 35 #include "macro-assembler.h"
36 #include "global-handles.h" 36 #include "global-handles.h"
37 #include "stub-cache.h" 37 #include "stub-cache.h"
38 #include "cctest.h" 38 #include "cctest.h"
39 39
40 using namespace v8::internal; 40 using namespace v8::internal;
41 41
42 static v8::Persistent<v8::Context> env;
43
44 static void InitializeVM() {
45 if (env.IsEmpty()) env = v8::Context::New();
46 env->Enter();
47 }
48
49 42
50 // Go through all incremental marking steps in one swoop. 43 // Go through all incremental marking steps in one swoop.
51 static void SimulateIncrementalMarking() { 44 static void SimulateIncrementalMarking() {
52 MarkCompactCollector* collector = HEAP->mark_compact_collector(); 45 MarkCompactCollector* collector = HEAP->mark_compact_collector();
53 IncrementalMarking* marking = HEAP->incremental_marking(); 46 IncrementalMarking* marking = HEAP->incremental_marking();
54 if (collector->IsConcurrentSweepingInProgress()) { 47 if (collector->IsConcurrentSweepingInProgress()) {
55 collector->WaitUntilSweepingCompleted(); 48 collector->WaitUntilSweepingCompleted();
56 } 49 }
57 CHECK(marking->IsMarking() || marking->IsStopped()); 50 CHECK(marking->IsMarking() || marking->IsStopped());
58 if (marking->IsStopped()) { 51 if (marking->IsStopped()) {
(...skipping 12 matching lines...) Expand all
71 #ifdef DEBUG 64 #ifdef DEBUG
72 CHECK(HEAP->Contains(map)); 65 CHECK(HEAP->Contains(map));
73 #endif 66 #endif
74 CHECK_EQ(HEAP->meta_map(), map->map()); 67 CHECK_EQ(HEAP->meta_map(), map->map());
75 CHECK_EQ(type, map->instance_type()); 68 CHECK_EQ(type, map->instance_type());
76 CHECK_EQ(instance_size, map->instance_size()); 69 CHECK_EQ(instance_size, map->instance_size());
77 } 70 }
78 71
79 72
80 TEST(HeapMaps) { 73 TEST(HeapMaps) {
81 InitializeVM(); 74 CcTest::InitializeVM();
82 CheckMap(HEAP->meta_map(), MAP_TYPE, Map::kSize); 75 CheckMap(HEAP->meta_map(), MAP_TYPE, Map::kSize);
83 CheckMap(HEAP->heap_number_map(), HEAP_NUMBER_TYPE, HeapNumber::kSize); 76 CheckMap(HEAP->heap_number_map(), HEAP_NUMBER_TYPE, HeapNumber::kSize);
84 CheckMap(HEAP->fixed_array_map(), FIXED_ARRAY_TYPE, kVariableSizeSentinel); 77 CheckMap(HEAP->fixed_array_map(), FIXED_ARRAY_TYPE, kVariableSizeSentinel);
85 CheckMap(HEAP->string_map(), STRING_TYPE, kVariableSizeSentinel); 78 CheckMap(HEAP->string_map(), STRING_TYPE, kVariableSizeSentinel);
86 } 79 }
87 80
88 81
89 static void CheckOddball(Isolate* isolate, Object* obj, const char* string) { 82 static void CheckOddball(Isolate* isolate, Object* obj, const char* string) {
90 CHECK(obj->IsOddball()); 83 CHECK(obj->IsOddball());
91 bool exc; 84 bool exc;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 Handle<Code>())->ToObjectChecked(); 137 Handle<Code>())->ToObjectChecked();
145 CHECK(copy->IsCode()); 138 CHECK(copy->IsCode());
146 HeapObject* obj_copy = HeapObject::cast(copy); 139 HeapObject* obj_copy = HeapObject::cast(copy);
147 Object* not_right = heap->FindCodeObject(obj_copy->address() + 140 Object* not_right = heap->FindCodeObject(obj_copy->address() +
148 obj_copy->Size() / 2); 141 obj_copy->Size() / 2);
149 CHECK(not_right != code); 142 CHECK(not_right != code);
150 } 143 }
151 144
152 145
153 TEST(HeapObjects) { 146 TEST(HeapObjects) {
154 InitializeVM(); 147 CcTest::InitializeVM();
155 Isolate* isolate = Isolate::Current(); 148 Isolate* isolate = Isolate::Current();
156 Heap* heap = isolate->heap(); 149 Heap* heap = isolate->heap();
157 150
158 HandleScope sc(isolate); 151 HandleScope sc(isolate);
159 Object* value = heap->NumberFromDouble(1.000123)->ToObjectChecked(); 152 Object* value = heap->NumberFromDouble(1.000123)->ToObjectChecked();
160 CHECK(value->IsHeapNumber()); 153 CHECK(value->IsHeapNumber());
161 CHECK(value->IsNumber()); 154 CHECK(value->IsNumber());
162 CHECK_EQ(1.000123, value->Number()); 155 CHECK_EQ(1.000123, value->Number());
163 156
164 value = heap->NumberFromDouble(1.0)->ToObjectChecked(); 157 value = heap->NumberFromDouble(1.0)->ToObjectChecked();
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 CheckSmi(isolate, -42, "-42"); 222 CheckSmi(isolate, -42, "-42");
230 223
231 // Check ToString for Numbers 224 // Check ToString for Numbers
232 CheckNumber(isolate, 1.1, "1.1"); 225 CheckNumber(isolate, 1.1, "1.1");
233 226
234 CheckFindCodeObject(isolate); 227 CheckFindCodeObject(isolate);
235 } 228 }
236 229
237 230
238 TEST(Tagging) { 231 TEST(Tagging) {
239 InitializeVM(); 232 CcTest::InitializeVM();
240 int request = 24; 233 int request = 24;
241 CHECK_EQ(request, static_cast<int>(OBJECT_POINTER_ALIGN(request))); 234 CHECK_EQ(request, static_cast<int>(OBJECT_POINTER_ALIGN(request)));
242 CHECK(Smi::FromInt(42)->IsSmi()); 235 CHECK(Smi::FromInt(42)->IsSmi());
243 CHECK(Failure::RetryAfterGC(NEW_SPACE)->IsFailure()); 236 CHECK(Failure::RetryAfterGC(NEW_SPACE)->IsFailure());
244 CHECK_EQ(NEW_SPACE, 237 CHECK_EQ(NEW_SPACE,
245 Failure::RetryAfterGC(NEW_SPACE)->allocation_space()); 238 Failure::RetryAfterGC(NEW_SPACE)->allocation_space());
246 CHECK_EQ(OLD_POINTER_SPACE, 239 CHECK_EQ(OLD_POINTER_SPACE,
247 Failure::RetryAfterGC(OLD_POINTER_SPACE)->allocation_space()); 240 Failure::RetryAfterGC(OLD_POINTER_SPACE)->allocation_space());
248 CHECK(Failure::Exception()->IsFailure()); 241 CHECK(Failure::Exception()->IsFailure());
249 CHECK(Smi::FromInt(Smi::kMinValue)->IsSmi()); 242 CHECK(Smi::FromInt(Smi::kMinValue)->IsSmi());
250 CHECK(Smi::FromInt(Smi::kMaxValue)->IsSmi()); 243 CHECK(Smi::FromInt(Smi::kMaxValue)->IsSmi());
251 } 244 }
252 245
253 246
254 TEST(GarbageCollection) { 247 TEST(GarbageCollection) {
255 InitializeVM(); 248 CcTest::InitializeVM();
256 Isolate* isolate = Isolate::Current(); 249 Isolate* isolate = Isolate::Current();
257 Heap* heap = isolate->heap(); 250 Heap* heap = isolate->heap();
258 Factory* factory = isolate->factory(); 251 Factory* factory = isolate->factory();
259 252
260 HandleScope sc(isolate); 253 HandleScope sc(isolate);
261 // Check GC. 254 // Check GC.
262 heap->CollectGarbage(NEW_SPACE); 255 heap->CollectGarbage(NEW_SPACE);
263 256
264 Handle<String> name = factory->InternalizeUtf8String("theFunction"); 257 Handle<String> name = factory->InternalizeUtf8String("theFunction");
265 Handle<String> prop_name = factory->InternalizeUtf8String("theSlot"); 258 Handle<String> prop_name = factory->InternalizeUtf8String("theSlot");
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 HandleScope scope(isolate); 319 HandleScope scope(isolate);
327 Handle<String> s = isolate->factory()->NewStringFromUtf8(CStrVector(string)); 320 Handle<String> s = isolate->factory()->NewStringFromUtf8(CStrVector(string));
328 CHECK_EQ(StrLength(string), s->length()); 321 CHECK_EQ(StrLength(string), s->length());
329 for (int index = 0; index < s->length(); index++) { 322 for (int index = 0; index < s->length(); index++) {
330 CHECK_EQ(static_cast<uint16_t>(string[index]), s->Get(index)); 323 CHECK_EQ(static_cast<uint16_t>(string[index]), s->Get(index));
331 } 324 }
332 } 325 }
333 326
334 327
335 TEST(String) { 328 TEST(String) {
336 InitializeVM(); 329 CcTest::InitializeVM();
337 Isolate* isolate = reinterpret_cast<Isolate*>(env->GetIsolate()); 330 Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate());
338 331
339 VerifyStringAllocation(isolate, "a"); 332 VerifyStringAllocation(isolate, "a");
340 VerifyStringAllocation(isolate, "ab"); 333 VerifyStringAllocation(isolate, "ab");
341 VerifyStringAllocation(isolate, "abc"); 334 VerifyStringAllocation(isolate, "abc");
342 VerifyStringAllocation(isolate, "abcd"); 335 VerifyStringAllocation(isolate, "abcd");
343 VerifyStringAllocation(isolate, "fiskerdrengen er paa havet"); 336 VerifyStringAllocation(isolate, "fiskerdrengen er paa havet");
344 } 337 }
345 338
346 339
347 TEST(LocalHandles) { 340 TEST(LocalHandles) {
348 InitializeVM(); 341 CcTest::InitializeVM();
349 342
350 v8::HandleScope scope(env->GetIsolate()); 343 v8::HandleScope scope(CcTest::isolate());
351 const char* name = "Kasper the spunky"; 344 const char* name = "Kasper the spunky";
352 Handle<String> string = FACTORY->NewStringFromAscii(CStrVector(name)); 345 Handle<String> string = FACTORY->NewStringFromAscii(CStrVector(name));
353 CHECK_EQ(StrLength(name), string->length()); 346 CHECK_EQ(StrLength(name), string->length());
354 } 347 }
355 348
356 349
357 TEST(GlobalHandles) { 350 TEST(GlobalHandles) {
358 InitializeVM(); 351 CcTest::InitializeVM();
359 Isolate* isolate = Isolate::Current(); 352 Isolate* isolate = Isolate::Current();
360 Heap* heap = isolate->heap(); 353 Heap* heap = isolate->heap();
361 Factory* factory = isolate->factory(); 354 Factory* factory = isolate->factory();
362 GlobalHandles* global_handles = isolate->global_handles(); 355 GlobalHandles* global_handles = isolate->global_handles();
363 356
364 Handle<Object> h1; 357 Handle<Object> h1;
365 Handle<Object> h2; 358 Handle<Object> h2;
366 Handle<Object> h3; 359 Handle<Object> h3;
367 Handle<Object> h4; 360 Handle<Object> h4;
368 361
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 393
401 static void TestWeakGlobalHandleCallback(v8::Isolate* isolate, 394 static void TestWeakGlobalHandleCallback(v8::Isolate* isolate,
402 v8::Persistent<v8::Value> handle, 395 v8::Persistent<v8::Value> handle,
403 void* id) { 396 void* id) {
404 if (1234 == reinterpret_cast<intptr_t>(id)) WeakPointerCleared = true; 397 if (1234 == reinterpret_cast<intptr_t>(id)) WeakPointerCleared = true;
405 handle.Dispose(isolate); 398 handle.Dispose(isolate);
406 } 399 }
407 400
408 401
409 TEST(WeakGlobalHandlesScavenge) { 402 TEST(WeakGlobalHandlesScavenge) {
410 InitializeVM(); 403 CcTest::InitializeVM();
411 Isolate* isolate = Isolate::Current(); 404 Isolate* isolate = Isolate::Current();
412 Heap* heap = isolate->heap(); 405 Heap* heap = isolate->heap();
413 Factory* factory = isolate->factory(); 406 Factory* factory = isolate->factory();
414 GlobalHandles* global_handles = isolate->global_handles(); 407 GlobalHandles* global_handles = isolate->global_handles();
415 408
416 WeakPointerCleared = false; 409 WeakPointerCleared = false;
417 410
418 Handle<Object> h1; 411 Handle<Object> h1;
419 Handle<Object> h2; 412 Handle<Object> h2;
420 413
(...skipping 21 matching lines...) Expand all
442 CHECK(!WeakPointerCleared); 435 CHECK(!WeakPointerCleared);
443 CHECK(!global_handles->IsNearDeath(h2.location())); 436 CHECK(!global_handles->IsNearDeath(h2.location()));
444 CHECK(!global_handles->IsNearDeath(h1.location())); 437 CHECK(!global_handles->IsNearDeath(h1.location()));
445 438
446 global_handles->Destroy(h1.location()); 439 global_handles->Destroy(h1.location());
447 global_handles->Destroy(h2.location()); 440 global_handles->Destroy(h2.location());
448 } 441 }
449 442
450 443
451 TEST(WeakGlobalHandlesMark) { 444 TEST(WeakGlobalHandlesMark) {
452 InitializeVM(); 445 CcTest::InitializeVM();
453 Isolate* isolate = Isolate::Current(); 446 Isolate* isolate = Isolate::Current();
454 Heap* heap = isolate->heap(); 447 Heap* heap = isolate->heap();
455 Factory* factory = isolate->factory(); 448 Factory* factory = isolate->factory();
456 GlobalHandles* global_handles = isolate->global_handles(); 449 GlobalHandles* global_handles = isolate->global_handles();
457 450
458 WeakPointerCleared = false; 451 WeakPointerCleared = false;
459 452
460 Handle<Object> h1; 453 Handle<Object> h1;
461 Handle<Object> h2; 454 Handle<Object> h2;
462 455
(...skipping 25 matching lines...) Expand all
488 CHECK((*h1)->IsString()); 481 CHECK((*h1)->IsString());
489 482
490 CHECK(WeakPointerCleared); 483 CHECK(WeakPointerCleared);
491 CHECK(!GlobalHandles::IsNearDeath(h1.location())); 484 CHECK(!GlobalHandles::IsNearDeath(h1.location()));
492 485
493 global_handles->Destroy(h1.location()); 486 global_handles->Destroy(h1.location());
494 } 487 }
495 488
496 489
497 TEST(DeleteWeakGlobalHandle) { 490 TEST(DeleteWeakGlobalHandle) {
498 InitializeVM(); 491 CcTest::InitializeVM();
499 Isolate* isolate = Isolate::Current(); 492 Isolate* isolate = Isolate::Current();
500 Heap* heap = isolate->heap(); 493 Heap* heap = isolate->heap();
501 Factory* factory = isolate->factory(); 494 Factory* factory = isolate->factory();
502 GlobalHandles* global_handles = isolate->global_handles(); 495 GlobalHandles* global_handles = isolate->global_handles();
503 496
504 WeakPointerCleared = false; 497 WeakPointerCleared = false;
505 498
506 Handle<Object> h; 499 Handle<Object> h;
507 500
508 { 501 {
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
603 Object* b; 596 Object* b;
604 MaybeObject* maybe_b = HEAP->InternalizeUtf8String(string); 597 MaybeObject* maybe_b = HEAP->InternalizeUtf8String(string);
605 if (!maybe_b->ToObject(&b)) continue; 598 if (!maybe_b->ToObject(&b)) continue;
606 CHECK_EQ(b, a); 599 CHECK_EQ(b, a);
607 CHECK(String::cast(b)->IsUtf8EqualTo(CStrVector(string))); 600 CHECK(String::cast(b)->IsUtf8EqualTo(CStrVector(string)));
608 } 601 }
609 } 602 }
610 603
611 604
612 TEST(StringTable) { 605 TEST(StringTable) {
613 InitializeVM(); 606 CcTest::InitializeVM();
614 607
615 CheckInternalizedStrings(not_so_random_string_table); 608 CheckInternalizedStrings(not_so_random_string_table);
616 CheckInternalizedStrings(not_so_random_string_table); 609 CheckInternalizedStrings(not_so_random_string_table);
617 } 610 }
618 611
619 612
620 TEST(FunctionAllocation) { 613 TEST(FunctionAllocation) {
621 InitializeVM(); 614 CcTest::InitializeVM();
622 615
623 v8::HandleScope sc(env->GetIsolate()); 616 v8::HandleScope sc(CcTest::isolate());
624 Handle<String> name = FACTORY->InternalizeUtf8String("theFunction"); 617 Handle<String> name = FACTORY->InternalizeUtf8String("theFunction");
625 Handle<JSFunction> function = 618 Handle<JSFunction> function =
626 FACTORY->NewFunction(name, FACTORY->undefined_value()); 619 FACTORY->NewFunction(name, FACTORY->undefined_value());
627 Handle<Map> initial_map = 620 Handle<Map> initial_map =
628 FACTORY->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); 621 FACTORY->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize);
629 function->set_initial_map(*initial_map); 622 function->set_initial_map(*initial_map);
630 623
631 Handle<String> prop_name = FACTORY->InternalizeUtf8String("theSlot"); 624 Handle<String> prop_name = FACTORY->InternalizeUtf8String("theSlot");
632 Handle<JSObject> obj = FACTORY->NewJSObject(function); 625 Handle<JSObject> obj = FACTORY->NewJSObject(function);
633 obj->SetProperty( 626 obj->SetProperty(
634 *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked(); 627 *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked();
635 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); 628 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name));
636 // Check that we can add properties to function objects. 629 // Check that we can add properties to function objects.
637 function->SetProperty( 630 function->SetProperty(
638 *prop_name, Smi::FromInt(24), NONE, kNonStrictMode)->ToObjectChecked(); 631 *prop_name, Smi::FromInt(24), NONE, kNonStrictMode)->ToObjectChecked();
639 CHECK_EQ(Smi::FromInt(24), function->GetProperty(*prop_name)); 632 CHECK_EQ(Smi::FromInt(24), function->GetProperty(*prop_name));
640 } 633 }
641 634
642 635
643 TEST(ObjectProperties) { 636 TEST(ObjectProperties) {
644 InitializeVM(); 637 CcTest::InitializeVM();
645 638
646 v8::HandleScope sc(env->GetIsolate()); 639 v8::HandleScope sc(CcTest::isolate());
647 String* object_string = String::cast(HEAP->Object_string()); 640 String* object_string = String::cast(HEAP->Object_string());
648 Object* raw_object = Isolate::Current()->context()->global_object()-> 641 Object* raw_object = Isolate::Current()->context()->global_object()->
649 GetProperty(object_string)->ToObjectChecked(); 642 GetProperty(object_string)->ToObjectChecked();
650 JSFunction* object_function = JSFunction::cast(raw_object); 643 JSFunction* object_function = JSFunction::cast(raw_object);
651 Handle<JSFunction> constructor(object_function); 644 Handle<JSFunction> constructor(object_function);
652 Handle<JSObject> obj = FACTORY->NewJSObject(constructor); 645 Handle<JSObject> obj = FACTORY->NewJSObject(constructor);
653 Handle<String> first = FACTORY->InternalizeUtf8String("first"); 646 Handle<String> first = FACTORY->InternalizeUtf8String("first");
654 Handle<String> second = FACTORY->InternalizeUtf8String("second"); 647 Handle<String> second = FACTORY->InternalizeUtf8String("second");
655 648
656 // check for empty 649 // check for empty
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
707 const char* string2 = "fugl"; 700 const char* string2 = "fugl";
708 Handle<String> s2_string = FACTORY->InternalizeUtf8String(string2); 701 Handle<String> s2_string = FACTORY->InternalizeUtf8String(string2);
709 obj->SetProperty( 702 obj->SetProperty(
710 *s2_string, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked(); 703 *s2_string, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked();
711 Handle<String> s2 = FACTORY->NewStringFromAscii(CStrVector(string2)); 704 Handle<String> s2 = FACTORY->NewStringFromAscii(CStrVector(string2));
712 CHECK(obj->HasLocalProperty(*s2)); 705 CHECK(obj->HasLocalProperty(*s2));
713 } 706 }
714 707
715 708
716 TEST(JSObjectMaps) { 709 TEST(JSObjectMaps) {
717 InitializeVM(); 710 CcTest::InitializeVM();
718 711
719 v8::HandleScope sc(env->GetIsolate()); 712 v8::HandleScope sc(CcTest::isolate());
720 Handle<String> name = FACTORY->InternalizeUtf8String("theFunction"); 713 Handle<String> name = FACTORY->InternalizeUtf8String("theFunction");
721 Handle<JSFunction> function = 714 Handle<JSFunction> function =
722 FACTORY->NewFunction(name, FACTORY->undefined_value()); 715 FACTORY->NewFunction(name, FACTORY->undefined_value());
723 Handle<Map> initial_map = 716 Handle<Map> initial_map =
724 FACTORY->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); 717 FACTORY->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize);
725 function->set_initial_map(*initial_map); 718 function->set_initial_map(*initial_map);
726 719
727 Handle<String> prop_name = FACTORY->InternalizeUtf8String("theSlot"); 720 Handle<String> prop_name = FACTORY->InternalizeUtf8String("theSlot");
728 Handle<JSObject> obj = FACTORY->NewJSObject(function); 721 Handle<JSObject> obj = FACTORY->NewJSObject(function);
729 722
730 // Set a propery 723 // Set a propery
731 obj->SetProperty( 724 obj->SetProperty(
732 *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked(); 725 *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked();
733 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); 726 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name));
734 727
735 // Check the map has changed 728 // Check the map has changed
736 CHECK(*initial_map != obj->map()); 729 CHECK(*initial_map != obj->map());
737 } 730 }
738 731
739 732
740 TEST(JSArray) { 733 TEST(JSArray) {
741 InitializeVM(); 734 CcTest::InitializeVM();
742 735
743 v8::HandleScope sc(env->GetIsolate()); 736 v8::HandleScope sc(CcTest::isolate());
744 Handle<String> name = FACTORY->InternalizeUtf8String("Array"); 737 Handle<String> name = FACTORY->InternalizeUtf8String("Array");
745 Object* raw_object = Isolate::Current()->context()->global_object()-> 738 Object* raw_object = Isolate::Current()->context()->global_object()->
746 GetProperty(*name)->ToObjectChecked(); 739 GetProperty(*name)->ToObjectChecked();
747 Handle<JSFunction> function = Handle<JSFunction>( 740 Handle<JSFunction> function = Handle<JSFunction>(
748 JSFunction::cast(raw_object)); 741 JSFunction::cast(raw_object));
749 742
750 // Allocate the object. 743 // Allocate the object.
751 Handle<JSObject> object = FACTORY->NewJSObject(function); 744 Handle<JSObject> object = FACTORY->NewJSObject(function);
752 Handle<JSArray> array = Handle<JSArray>::cast(object); 745 Handle<JSArray> array = Handle<JSArray>::cast(object);
753 // We just initialized the VM, no heap allocation failure yet. 746 // We just initialized the VM, no heap allocation failure yet.
(...skipping 24 matching lines...) Expand all
778 array->SetElement(int_length, *name, NONE, kNonStrictMode)->ToObjectChecked(); 771 array->SetElement(int_length, *name, NONE, kNonStrictMode)->ToObjectChecked();
779 uint32_t new_int_length = 0; 772 uint32_t new_int_length = 0;
780 CHECK(array->length()->ToArrayIndex(&new_int_length)); 773 CHECK(array->length()->ToArrayIndex(&new_int_length));
781 CHECK_EQ(static_cast<double>(int_length), new_int_length - 1); 774 CHECK_EQ(static_cast<double>(int_length), new_int_length - 1);
782 CHECK_EQ(array->GetElement(int_length), *name); 775 CHECK_EQ(array->GetElement(int_length), *name);
783 CHECK_EQ(array->GetElement(0), *name); 776 CHECK_EQ(array->GetElement(0), *name);
784 } 777 }
785 778
786 779
787 TEST(JSObjectCopy) { 780 TEST(JSObjectCopy) {
788 InitializeVM(); 781 CcTest::InitializeVM();
789 782
790 v8::HandleScope sc(env->GetIsolate()); 783 v8::HandleScope sc(CcTest::isolate());
791 String* object_string = String::cast(HEAP->Object_string()); 784 String* object_string = String::cast(HEAP->Object_string());
792 Object* raw_object = Isolate::Current()->context()->global_object()-> 785 Object* raw_object = Isolate::Current()->context()->global_object()->
793 GetProperty(object_string)->ToObjectChecked(); 786 GetProperty(object_string)->ToObjectChecked();
794 JSFunction* object_function = JSFunction::cast(raw_object); 787 JSFunction* object_function = JSFunction::cast(raw_object);
795 Handle<JSFunction> constructor(object_function); 788 Handle<JSFunction> constructor(object_function);
796 Handle<JSObject> obj = FACTORY->NewJSObject(constructor); 789 Handle<JSObject> obj = FACTORY->NewJSObject(constructor);
797 Handle<String> first = FACTORY->InternalizeUtf8String("first"); 790 Handle<String> first = FACTORY->InternalizeUtf8String("first");
798 Handle<String> second = FACTORY->InternalizeUtf8String("second"); 791 Handle<String> second = FACTORY->InternalizeUtf8String("second");
799 792
800 obj->SetProperty( 793 obj->SetProperty(
(...skipping 25 matching lines...) Expand all
826 819
827 CHECK_EQ(obj->GetElement(1), clone->GetElement(0)); 820 CHECK_EQ(obj->GetElement(1), clone->GetElement(0));
828 CHECK_EQ(obj->GetElement(0), clone->GetElement(1)); 821 CHECK_EQ(obj->GetElement(0), clone->GetElement(1));
829 822
830 CHECK_EQ(obj->GetProperty(*second), clone->GetProperty(*first)); 823 CHECK_EQ(obj->GetProperty(*second), clone->GetProperty(*first));
831 CHECK_EQ(obj->GetProperty(*first), clone->GetProperty(*second)); 824 CHECK_EQ(obj->GetProperty(*first), clone->GetProperty(*second));
832 } 825 }
833 826
834 827
835 TEST(StringAllocation) { 828 TEST(StringAllocation) {
836 InitializeVM(); 829 CcTest::InitializeVM();
837 830
838 const unsigned char chars[] = { 0xe5, 0xa4, 0xa7 }; 831 const unsigned char chars[] = { 0xe5, 0xa4, 0xa7 };
839 for (int length = 0; length < 100; length++) { 832 for (int length = 0; length < 100; length++) {
840 v8::HandleScope scope(env->GetIsolate()); 833 v8::HandleScope scope(CcTest::isolate());
841 char* non_ascii = NewArray<char>(3 * length + 1); 834 char* non_ascii = NewArray<char>(3 * length + 1);
842 char* ascii = NewArray<char>(length + 1); 835 char* ascii = NewArray<char>(length + 1);
843 non_ascii[3 * length] = 0; 836 non_ascii[3 * length] = 0;
844 ascii[length] = 0; 837 ascii[length] = 0;
845 for (int i = 0; i < length; i++) { 838 for (int i = 0; i < length; i++) {
846 ascii[i] = 'a'; 839 ascii[i] = 'a';
847 non_ascii[3 * i] = chars[0]; 840 non_ascii[3 * i] = chars[0];
848 non_ascii[3 * i + 1] = chars[1]; 841 non_ascii[3 * i + 1] = chars[1];
849 non_ascii[3 * i + 2] = chars[2]; 842 non_ascii[3 * i + 2] = chars[2];
850 } 843 }
(...skipping 27 matching lines...) Expand all
878 if (*objs[i] == obj) { 871 if (*objs[i] == obj) {
879 found_count++; 872 found_count++;
880 } 873 }
881 } 874 }
882 } 875 }
883 return found_count; 876 return found_count;
884 } 877 }
885 878
886 879
887 TEST(Iteration) { 880 TEST(Iteration) {
888 InitializeVM(); 881 CcTest::InitializeVM();
889 v8::HandleScope scope(env->GetIsolate()); 882 v8::HandleScope scope(CcTest::isolate());
890 883
891 // Array of objects to scan haep for. 884 // Array of objects to scan haep for.
892 const int objs_count = 6; 885 const int objs_count = 6;
893 Handle<Object> objs[objs_count]; 886 Handle<Object> objs[objs_count];
894 int next_objs_index = 0; 887 int next_objs_index = 0;
895 888
896 // Allocate a JS array to OLD_POINTER_SPACE and NEW_SPACE 889 // Allocate a JS array to OLD_POINTER_SPACE and NEW_SPACE
897 objs[next_objs_index++] = FACTORY->NewJSArray(10); 890 objs[next_objs_index++] = FACTORY->NewJSArray(10);
898 objs[next_objs_index++] = FACTORY->NewJSArray(10, 891 objs[next_objs_index++] = FACTORY->NewJSArray(10,
899 FAST_HOLEY_ELEMENTS, 892 FAST_HOLEY_ELEMENTS,
(...skipping 16 matching lines...) Expand all
916 909
917 // Add a Map object to look for. 910 // Add a Map object to look for.
918 objs[next_objs_index++] = Handle<Map>(HeapObject::cast(*objs[0])->map()); 911 objs[next_objs_index++] = Handle<Map>(HeapObject::cast(*objs[0])->map());
919 912
920 CHECK_EQ(objs_count, next_objs_index); 913 CHECK_EQ(objs_count, next_objs_index);
921 CHECK_EQ(objs_count, ObjectsFoundInHeap(HEAP, objs, objs_count)); 914 CHECK_EQ(objs_count, ObjectsFoundInHeap(HEAP, objs, objs_count));
922 } 915 }
923 916
924 917
925 TEST(EmptyHandleEscapeFrom) { 918 TEST(EmptyHandleEscapeFrom) {
926 InitializeVM(); 919 CcTest::InitializeVM();
927 920
928 v8::HandleScope scope(env->GetIsolate()); 921 v8::HandleScope scope(CcTest::isolate());
929 Handle<JSObject> runaway; 922 Handle<JSObject> runaway;
930 923
931 { 924 {
932 v8::HandleScope nested(env->GetIsolate()); 925 v8::HandleScope nested(CcTest::isolate());
933 Handle<JSObject> empty; 926 Handle<JSObject> empty;
934 runaway = empty.EscapeFrom(&nested); 927 runaway = empty.EscapeFrom(&nested);
935 } 928 }
936 929
937 CHECK(runaway.is_null()); 930 CHECK(runaway.is_null());
938 } 931 }
939 932
940 933
941 static int LenFromSize(int size) { 934 static int LenFromSize(int size) {
942 return (size - FixedArray::kHeaderSize) / kPointerSize; 935 return (size - FixedArray::kHeaderSize) / kPointerSize;
943 } 936 }
944 937
945 938
946 TEST(Regression39128) { 939 TEST(Regression39128) {
947 // Test case for crbug.com/39128. 940 // Test case for crbug.com/39128.
948 InitializeVM(); 941 CcTest::InitializeVM();
949 942
950 // Increase the chance of 'bump-the-pointer' allocation in old space. 943 // Increase the chance of 'bump-the-pointer' allocation in old space.
951 HEAP->CollectAllGarbage(Heap::kNoGCFlags); 944 HEAP->CollectAllGarbage(Heap::kNoGCFlags);
952 945
953 v8::HandleScope scope(env->GetIsolate()); 946 v8::HandleScope scope(CcTest::isolate());
954 947
955 // The plan: create JSObject which references objects in new space. 948 // The plan: create JSObject which references objects in new space.
956 // Then clone this object (forcing it to go into old space) and check 949 // Then clone this object (forcing it to go into old space) and check
957 // that region dirty marks are updated correctly. 950 // that region dirty marks are updated correctly.
958 951
959 // Step 1: prepare a map for the object. We add 1 inobject property to it. 952 // Step 1: prepare a map for the object. We add 1 inobject property to it.
960 Handle<JSFunction> object_ctor( 953 Handle<JSFunction> object_ctor(
961 Isolate::Current()->native_context()->object_function()); 954 Isolate::Current()->native_context()->object_function());
962 CHECK(object_ctor->has_initial_map()); 955 CHECK(object_ctor->has_initial_map());
963 Handle<Map> object_map(object_ctor->initial_map()); 956 Handle<Map> object_map(object_ctor->initial_map());
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1015 return; 1008 return;
1016 } 1009 }
1017 CHECK(HEAP->old_pointer_space()->Contains(clone->address())); 1010 CHECK(HEAP->old_pointer_space()->Contains(clone->address()));
1018 } 1011 }
1019 1012
1020 1013
1021 TEST(TestCodeFlushing) { 1014 TEST(TestCodeFlushing) {
1022 // If we do not flush code this test is invalid. 1015 // If we do not flush code this test is invalid.
1023 if (!FLAG_flush_code) return; 1016 if (!FLAG_flush_code) return;
1024 i::FLAG_allow_natives_syntax = true; 1017 i::FLAG_allow_natives_syntax = true;
1025 InitializeVM(); 1018 CcTest::InitializeVM();
1026 v8::HandleScope scope(env->GetIsolate()); 1019 v8::HandleScope scope(CcTest::isolate());
1027 const char* source = "function foo() {" 1020 const char* source = "function foo() {"
1028 " var x = 42;" 1021 " var x = 42;"
1029 " var y = 42;" 1022 " var y = 42;"
1030 " var z = x + y;" 1023 " var z = x + y;"
1031 "};" 1024 "};"
1032 "foo()"; 1025 "foo()";
1033 Handle<String> foo_name = FACTORY->InternalizeUtf8String("foo"); 1026 Handle<String> foo_name = FACTORY->InternalizeUtf8String("foo");
1034 1027
1035 // This compile will add the code to the compilation cache. 1028 // This compile will add the code to the compilation cache.
1036 { v8::HandleScope scope(env->GetIsolate()); 1029 { v8::HandleScope scope(CcTest::isolate());
1037 CompileRun(source); 1030 CompileRun(source);
1038 } 1031 }
1039 1032
1040 // Check function is compiled. 1033 // Check function is compiled.
1041 Object* func_value = Isolate::Current()->context()->global_object()-> 1034 Object* func_value = Isolate::Current()->context()->global_object()->
1042 GetProperty(*foo_name)->ToObjectChecked(); 1035 GetProperty(*foo_name)->ToObjectChecked();
1043 CHECK(func_value->IsJSFunction()); 1036 CHECK(func_value->IsJSFunction());
1044 Handle<JSFunction> function(JSFunction::cast(func_value)); 1037 Handle<JSFunction> function(JSFunction::cast(func_value));
1045 CHECK(function->shared()->is_compiled()); 1038 CHECK(function->shared()->is_compiled());
1046 1039
(...skipping 15 matching lines...) Expand all
1062 CompileRun("foo()"); 1055 CompileRun("foo()");
1063 CHECK(function->shared()->is_compiled()); 1056 CHECK(function->shared()->is_compiled());
1064 CHECK(function->is_compiled()); 1057 CHECK(function->is_compiled());
1065 } 1058 }
1066 1059
1067 1060
1068 TEST(TestCodeFlushingIncremental) { 1061 TEST(TestCodeFlushingIncremental) {
1069 // If we do not flush code this test is invalid. 1062 // If we do not flush code this test is invalid.
1070 if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return; 1063 if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return;
1071 i::FLAG_allow_natives_syntax = true; 1064 i::FLAG_allow_natives_syntax = true;
1072 InitializeVM(); 1065 CcTest::InitializeVM();
1073 v8::HandleScope scope(env->GetIsolate()); 1066 v8::HandleScope scope(CcTest::isolate());
1074 const char* source = "function foo() {" 1067 const char* source = "function foo() {"
1075 " var x = 42;" 1068 " var x = 42;"
1076 " var y = 42;" 1069 " var y = 42;"
1077 " var z = x + y;" 1070 " var z = x + y;"
1078 "};" 1071 "};"
1079 "foo()"; 1072 "foo()";
1080 Handle<String> foo_name = FACTORY->InternalizeUtf8String("foo"); 1073 Handle<String> foo_name = FACTORY->InternalizeUtf8String("foo");
1081 1074
1082 // This compile will add the code to the compilation cache. 1075 // This compile will add the code to the compilation cache.
1083 { v8::HandleScope scope(env->GetIsolate()); 1076 { v8::HandleScope scope(CcTest::isolate());
1084 CompileRun(source); 1077 CompileRun(source);
1085 } 1078 }
1086 1079
1087 // Check function is compiled. 1080 // Check function is compiled.
1088 Object* func_value = Isolate::Current()->context()->global_object()-> 1081 Object* func_value = Isolate::Current()->context()->global_object()->
1089 GetProperty(*foo_name)->ToObjectChecked(); 1082 GetProperty(*foo_name)->ToObjectChecked();
1090 CHECK(func_value->IsJSFunction()); 1083 CHECK(func_value->IsJSFunction());
1091 Handle<JSFunction> function(JSFunction::cast(func_value)); 1084 Handle<JSFunction> function(JSFunction::cast(func_value));
1092 CHECK(function->shared()->is_compiled()); 1085 CHECK(function->shared()->is_compiled());
1093 1086
1094 // The code will survive at least two GCs. 1087 // The code will survive at least two GCs.
1095 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); 1088 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
1096 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); 1089 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
1097 CHECK(function->shared()->is_compiled()); 1090 CHECK(function->shared()->is_compiled());
1098 1091
1099 // Simulate several GCs that use incremental marking. 1092 // Simulate several GCs that use incremental marking.
1100 const int kAgingThreshold = 6; 1093 const int kAgingThreshold = 6;
1101 for (int i = 0; i < kAgingThreshold; i++) { 1094 for (int i = 0; i < kAgingThreshold; i++) {
1102 SimulateIncrementalMarking(); 1095 SimulateIncrementalMarking();
1103 HEAP->CollectAllGarbage(Heap::kNoGCFlags); 1096 HEAP->CollectAllGarbage(Heap::kNoGCFlags);
1104 } 1097 }
1105 CHECK(!function->shared()->is_compiled() || function->IsOptimized()); 1098 CHECK(!function->shared()->is_compiled() || function->IsOptimized());
1106 CHECK(!function->is_compiled() || function->IsOptimized()); 1099 CHECK(!function->is_compiled() || function->IsOptimized());
1107 1100
1108 // This compile will compile the function again. 1101 // This compile will compile the function again.
1109 { v8::HandleScope scope(env->GetIsolate()); 1102 { v8::HandleScope scope(CcTest::isolate());
1110 CompileRun("foo();"); 1103 CompileRun("foo();");
1111 } 1104 }
1112 1105
1113 // Simulate several GCs that use incremental marking but make sure 1106 // Simulate several GCs that use incremental marking but make sure
1114 // the loop breaks once the function is enqueued as a candidate. 1107 // the loop breaks once the function is enqueued as a candidate.
1115 for (int i = 0; i < kAgingThreshold; i++) { 1108 for (int i = 0; i < kAgingThreshold; i++) {
1116 SimulateIncrementalMarking(); 1109 SimulateIncrementalMarking();
1117 if (!function->next_function_link()->IsUndefined()) break; 1110 if (!function->next_function_link()->IsUndefined()) break;
1118 HEAP->CollectAllGarbage(Heap::kNoGCFlags); 1111 HEAP->CollectAllGarbage(Heap::kNoGCFlags);
1119 } 1112 }
1120 1113
1121 // Force optimization while incremental marking is active and while 1114 // Force optimization while incremental marking is active and while
1122 // the function is enqueued as a candidate. 1115 // the function is enqueued as a candidate.
1123 { v8::HandleScope scope(env->GetIsolate()); 1116 { v8::HandleScope scope(CcTest::isolate());
1124 CompileRun("%OptimizeFunctionOnNextCall(foo); foo();"); 1117 CompileRun("%OptimizeFunctionOnNextCall(foo); foo();");
1125 } 1118 }
1126 1119
1127 // Simulate one final GC to make sure the candidate queue is sane. 1120 // Simulate one final GC to make sure the candidate queue is sane.
1128 HEAP->CollectAllGarbage(Heap::kNoGCFlags); 1121 HEAP->CollectAllGarbage(Heap::kNoGCFlags);
1129 CHECK(function->shared()->is_compiled() || !function->IsOptimized()); 1122 CHECK(function->shared()->is_compiled() || !function->IsOptimized());
1130 CHECK(function->is_compiled() || !function->IsOptimized()); 1123 CHECK(function->is_compiled() || !function->IsOptimized());
1131 } 1124 }
1132 1125
1133 1126
1134 TEST(TestCodeFlushingIncrementalScavenge) { 1127 TEST(TestCodeFlushingIncrementalScavenge) {
1135 // If we do not flush code this test is invalid. 1128 // If we do not flush code this test is invalid.
1136 if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return; 1129 if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return;
1137 i::FLAG_allow_natives_syntax = true; 1130 i::FLAG_allow_natives_syntax = true;
1138 InitializeVM(); 1131 CcTest::InitializeVM();
1139 v8::HandleScope scope(env->GetIsolate()); 1132 v8::HandleScope scope(CcTest::isolate());
1140 const char* source = "var foo = function() {" 1133 const char* source = "var foo = function() {"
1141 " var x = 42;" 1134 " var x = 42;"
1142 " var y = 42;" 1135 " var y = 42;"
1143 " var z = x + y;" 1136 " var z = x + y;"
1144 "};" 1137 "};"
1145 "foo();" 1138 "foo();"
1146 "var bar = function() {" 1139 "var bar = function() {"
1147 " var x = 23;" 1140 " var x = 23;"
1148 "};" 1141 "};"
1149 "bar();"; 1142 "bar();";
1150 Handle<String> foo_name = FACTORY->InternalizeUtf8String("foo"); 1143 Handle<String> foo_name = FACTORY->InternalizeUtf8String("foo");
1151 Handle<String> bar_name = FACTORY->InternalizeUtf8String("bar"); 1144 Handle<String> bar_name = FACTORY->InternalizeUtf8String("bar");
1152 1145
1153 // Perfrom one initial GC to enable code flushing. 1146 // Perfrom one initial GC to enable code flushing.
1154 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); 1147 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
1155 1148
1156 // This compile will add the code to the compilation cache. 1149 // This compile will add the code to the compilation cache.
1157 { v8::HandleScope scope(env->GetIsolate()); 1150 { v8::HandleScope scope(CcTest::isolate());
1158 CompileRun(source); 1151 CompileRun(source);
1159 } 1152 }
1160 1153
1161 // Check functions are compiled. 1154 // Check functions are compiled.
1162 Object* func_value = Isolate::Current()->context()->global_object()-> 1155 Object* func_value = Isolate::Current()->context()->global_object()->
1163 GetProperty(*foo_name)->ToObjectChecked(); 1156 GetProperty(*foo_name)->ToObjectChecked();
1164 CHECK(func_value->IsJSFunction()); 1157 CHECK(func_value->IsJSFunction());
1165 Handle<JSFunction> function(JSFunction::cast(func_value)); 1158 Handle<JSFunction> function(JSFunction::cast(func_value));
1166 CHECK(function->shared()->is_compiled()); 1159 CHECK(function->shared()->is_compiled());
1167 Object* func_value2 = Isolate::Current()->context()->global_object()-> 1160 Object* func_value2 = Isolate::Current()->context()->global_object()->
1168 GetProperty(*bar_name)->ToObjectChecked(); 1161 GetProperty(*bar_name)->ToObjectChecked();
1169 CHECK(func_value2->IsJSFunction()); 1162 CHECK(func_value2->IsJSFunction());
1170 Handle<JSFunction> function2(JSFunction::cast(func_value2)); 1163 Handle<JSFunction> function2(JSFunction::cast(func_value2));
1171 CHECK(function2->shared()->is_compiled()); 1164 CHECK(function2->shared()->is_compiled());
1172 1165
1173 // Clear references to functions so that one of them can die. 1166 // Clear references to functions so that one of them can die.
1174 { v8::HandleScope scope(env->GetIsolate()); 1167 { v8::HandleScope scope(CcTest::isolate());
1175 CompileRun("foo = 0; bar = 0;"); 1168 CompileRun("foo = 0; bar = 0;");
1176 } 1169 }
1177 1170
1178 // Bump the code age so that flushing is triggered while the function 1171 // Bump the code age so that flushing is triggered while the function
1179 // object is still located in new-space. 1172 // object is still located in new-space.
1180 const int kAgingThreshold = 6; 1173 const int kAgingThreshold = 6;
1181 for (int i = 0; i < kAgingThreshold; i++) { 1174 for (int i = 0; i < kAgingThreshold; i++) {
1182 function->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2)); 1175 function->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2));
1183 function2->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2)); 1176 function2->shared()->code()->MakeOlder(static_cast<MarkingParity>(i % 2));
1184 } 1177 }
1185 1178
1186 // Simulate incremental marking so that the functions are enqueued as 1179 // Simulate incremental marking so that the functions are enqueued as
1187 // code flushing candidates. Then kill one of the functions. Finally 1180 // code flushing candidates. Then kill one of the functions. Finally
1188 // perform a scavenge while incremental marking is still running. 1181 // perform a scavenge while incremental marking is still running.
1189 SimulateIncrementalMarking(); 1182 SimulateIncrementalMarking();
1190 *function2.location() = NULL; 1183 *function2.location() = NULL;
1191 HEAP->CollectGarbage(NEW_SPACE, "test scavenge while marking"); 1184 HEAP->CollectGarbage(NEW_SPACE, "test scavenge while marking");
1192 1185
1193 // Simulate one final GC to make sure the candidate queue is sane. 1186 // Simulate one final GC to make sure the candidate queue is sane.
1194 HEAP->CollectAllGarbage(Heap::kNoGCFlags); 1187 HEAP->CollectAllGarbage(Heap::kNoGCFlags);
1195 CHECK(!function->shared()->is_compiled() || function->IsOptimized()); 1188 CHECK(!function->shared()->is_compiled() || function->IsOptimized());
1196 CHECK(!function->is_compiled() || function->IsOptimized()); 1189 CHECK(!function->is_compiled() || function->IsOptimized());
1197 } 1190 }
1198 1191
1199 1192
1200 TEST(TestCodeFlushingIncrementalAbort) { 1193 TEST(TestCodeFlushingIncrementalAbort) {
1201 // If we do not flush code this test is invalid. 1194 // If we do not flush code this test is invalid.
1202 if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return; 1195 if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return;
1203 i::FLAG_allow_natives_syntax = true; 1196 i::FLAG_allow_natives_syntax = true;
1204 InitializeVM(); 1197 CcTest::InitializeVM();
1205 Isolate* isolate = Isolate::Current(); 1198 Isolate* isolate = Isolate::Current();
1206 Heap* heap = isolate->heap(); 1199 Heap* heap = isolate->heap();
1207 v8::HandleScope scope(env->GetIsolate()); 1200 v8::HandleScope scope(CcTest::isolate());
1208 const char* source = "function foo() {" 1201 const char* source = "function foo() {"
1209 " var x = 42;" 1202 " var x = 42;"
1210 " var y = 42;" 1203 " var y = 42;"
1211 " var z = x + y;" 1204 " var z = x + y;"
1212 "};" 1205 "};"
1213 "foo()"; 1206 "foo()";
1214 Handle<String> foo_name = FACTORY->InternalizeUtf8String("foo"); 1207 Handle<String> foo_name = FACTORY->InternalizeUtf8String("foo");
1215 1208
1216 // This compile will add the code to the compilation cache. 1209 // This compile will add the code to the compilation cache.
1217 { v8::HandleScope scope(env->GetIsolate()); 1210 { v8::HandleScope scope(CcTest::isolate());
1218 CompileRun(source); 1211 CompileRun(source);
1219 } 1212 }
1220 1213
1221 // Check function is compiled. 1214 // Check function is compiled.
1222 Object* func_value = Isolate::Current()->context()->global_object()-> 1215 Object* func_value = Isolate::Current()->context()->global_object()->
1223 GetProperty(*foo_name)->ToObjectChecked(); 1216 GetProperty(*foo_name)->ToObjectChecked();
1224 CHECK(func_value->IsJSFunction()); 1217 CHECK(func_value->IsJSFunction());
1225 Handle<JSFunction> function(JSFunction::cast(func_value)); 1218 Handle<JSFunction> function(JSFunction::cast(func_value));
1226 CHECK(function->shared()->is_compiled()); 1219 CHECK(function->shared()->is_compiled());
1227 1220
(...skipping 16 matching lines...) Expand all
1244 // Enable the debugger and add a breakpoint while incremental marking 1237 // Enable the debugger and add a breakpoint while incremental marking
1245 // is running so that incremental marking aborts and code flushing is 1238 // is running so that incremental marking aborts and code flushing is
1246 // disabled. 1239 // disabled.
1247 int position = 0; 1240 int position = 0;
1248 Handle<Object> breakpoint_object(Smi::FromInt(0), isolate); 1241 Handle<Object> breakpoint_object(Smi::FromInt(0), isolate);
1249 isolate->debug()->SetBreakPoint(function, breakpoint_object, &position); 1242 isolate->debug()->SetBreakPoint(function, breakpoint_object, &position);
1250 isolate->debug()->ClearAllBreakPoints(); 1243 isolate->debug()->ClearAllBreakPoints();
1251 #endif // ENABLE_DEBUGGER_SUPPORT 1244 #endif // ENABLE_DEBUGGER_SUPPORT
1252 1245
1253 // Force optimization now that code flushing is disabled. 1246 // Force optimization now that code flushing is disabled.
1254 { v8::HandleScope scope(env->GetIsolate()); 1247 { v8::HandleScope scope(CcTest::isolate());
1255 CompileRun("%OptimizeFunctionOnNextCall(foo); foo();"); 1248 CompileRun("%OptimizeFunctionOnNextCall(foo); foo();");
1256 } 1249 }
1257 1250
1258 // Simulate one final GC to make sure the candidate queue is sane. 1251 // Simulate one final GC to make sure the candidate queue is sane.
1259 heap->CollectAllGarbage(Heap::kNoGCFlags); 1252 heap->CollectAllGarbage(Heap::kNoGCFlags);
1260 CHECK(function->shared()->is_compiled() || !function->IsOptimized()); 1253 CHECK(function->shared()->is_compiled() || !function->IsOptimized());
1261 CHECK(function->is_compiled() || !function->IsOptimized()); 1254 CHECK(function->is_compiled() || !function->IsOptimized());
1262 } 1255 }
1263 1256
1264 1257
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
1516 1509
1517 // Advancing the sweeper step-wise should not change the heap size. 1510 // Advancing the sweeper step-wise should not change the heap size.
1518 while (!HEAP->old_pointer_space()->IsLazySweepingComplete()) { 1511 while (!HEAP->old_pointer_space()->IsLazySweepingComplete()) {
1519 HEAP->old_pointer_space()->AdvanceSweeper(KB); 1512 HEAP->old_pointer_space()->AdvanceSweeper(KB);
1520 CHECK_EQ(initial_size, static_cast<int>(HEAP->SizeOfObjects())); 1513 CHECK_EQ(initial_size, static_cast<int>(HEAP->SizeOfObjects()));
1521 } 1514 }
1522 } 1515 }
1523 1516
1524 1517
1525 TEST(TestSizeOfObjectsVsHeapIteratorPrecision) { 1518 TEST(TestSizeOfObjectsVsHeapIteratorPrecision) {
1526 InitializeVM(); 1519 CcTest::InitializeVM();
1527 HEAP->EnsureHeapIsIterable(); 1520 HEAP->EnsureHeapIsIterable();
1528 intptr_t size_of_objects_1 = HEAP->SizeOfObjects(); 1521 intptr_t size_of_objects_1 = HEAP->SizeOfObjects();
1529 HeapIterator iterator(HEAP); 1522 HeapIterator iterator(HEAP);
1530 intptr_t size_of_objects_2 = 0; 1523 intptr_t size_of_objects_2 = 0;
1531 for (HeapObject* obj = iterator.next(); 1524 for (HeapObject* obj = iterator.next();
1532 obj != NULL; 1525 obj != NULL;
1533 obj = iterator.next()) { 1526 obj = iterator.next()) {
1534 if (!obj->IsFreeSpace()) { 1527 if (!obj->IsFreeSpace()) {
1535 size_of_objects_2 += obj->Size(); 1528 size_of_objects_2 += obj->Size();
1536 } 1529 }
(...skipping 30 matching lines...) Expand all
1567 AlwaysAllocateScope always_allocate; 1560 AlwaysAllocateScope always_allocate;
1568 intptr_t available = new_space->EffectiveCapacity() - new_space->Size(); 1561 intptr_t available = new_space->EffectiveCapacity() - new_space->Size();
1569 intptr_t number_of_fillers = (available / FixedArray::SizeFor(32)) - 1; 1562 intptr_t number_of_fillers = (available / FixedArray::SizeFor(32)) - 1;
1570 for (intptr_t i = 0; i < number_of_fillers; i++) { 1563 for (intptr_t i = 0; i < number_of_fillers; i++) {
1571 CHECK(heap->InNewSpace(*factory->NewFixedArray(32, NOT_TENURED))); 1564 CHECK(heap->InNewSpace(*factory->NewFixedArray(32, NOT_TENURED)));
1572 } 1565 }
1573 } 1566 }
1574 1567
1575 1568
1576 TEST(GrowAndShrinkNewSpace) { 1569 TEST(GrowAndShrinkNewSpace) {
1577 InitializeVM(); 1570 CcTest::InitializeVM();
1578 NewSpace* new_space = HEAP->new_space(); 1571 NewSpace* new_space = HEAP->new_space();
1579 1572
1580 if (HEAP->ReservedSemiSpaceSize() == HEAP->InitialSemiSpaceSize() || 1573 if (HEAP->ReservedSemiSpaceSize() == HEAP->InitialSemiSpaceSize() ||
1581 HEAP->MaxSemiSpaceSize() == HEAP->InitialSemiSpaceSize()) { 1574 HEAP->MaxSemiSpaceSize() == HEAP->InitialSemiSpaceSize()) {
1582 // The max size cannot exceed the reserved size, since semispaces must be 1575 // The max size cannot exceed the reserved size, since semispaces must be
1583 // always within the reserved space. We can't test new space growing and 1576 // always within the reserved space. We can't test new space growing and
1584 // shrinking if the reserved size is the same as the minimum (initial) size. 1577 // shrinking if the reserved size is the same as the minimum (initial) size.
1585 return; 1578 return;
1586 } 1579 }
1587 1580
(...skipping 29 matching lines...) Expand all
1617 old_capacity = new_space->Capacity(); 1610 old_capacity = new_space->Capacity();
1618 new_space->Shrink(); 1611 new_space->Shrink();
1619 new_space->Shrink(); 1612 new_space->Shrink();
1620 new_space->Shrink(); 1613 new_space->Shrink();
1621 new_capacity = new_space->Capacity(); 1614 new_capacity = new_space->Capacity();
1622 CHECK(old_capacity == new_capacity); 1615 CHECK(old_capacity == new_capacity);
1623 } 1616 }
1624 1617
1625 1618
1626 TEST(CollectingAllAvailableGarbageShrinksNewSpace) { 1619 TEST(CollectingAllAvailableGarbageShrinksNewSpace) {
1627 InitializeVM(); 1620 CcTest::InitializeVM();
1628 1621
1629 if (HEAP->ReservedSemiSpaceSize() == HEAP->InitialSemiSpaceSize() || 1622 if (HEAP->ReservedSemiSpaceSize() == HEAP->InitialSemiSpaceSize() ||
1630 HEAP->MaxSemiSpaceSize() == HEAP->InitialSemiSpaceSize()) { 1623 HEAP->MaxSemiSpaceSize() == HEAP->InitialSemiSpaceSize()) {
1631 // The max size cannot exceed the reserved size, since semispaces must be 1624 // The max size cannot exceed the reserved size, since semispaces must be
1632 // always within the reserved space. We can't test new space growing and 1625 // always within the reserved space. We can't test new space growing and
1633 // shrinking if the reserved size is the same as the minimum (initial) size. 1626 // shrinking if the reserved size is the same as the minimum (initial) size.
1634 return; 1627 return;
1635 } 1628 }
1636 1629
1637 v8::HandleScope scope(env->GetIsolate()); 1630 v8::HandleScope scope(CcTest::isolate());
1638 NewSpace* new_space = HEAP->new_space(); 1631 NewSpace* new_space = HEAP->new_space();
1639 intptr_t old_capacity, new_capacity; 1632 intptr_t old_capacity, new_capacity;
1640 old_capacity = new_space->Capacity(); 1633 old_capacity = new_space->Capacity();
1641 new_space->Grow(); 1634 new_space->Grow();
1642 new_capacity = new_space->Capacity(); 1635 new_capacity = new_space->Capacity();
1643 CHECK(2 * old_capacity == new_capacity); 1636 CHECK(2 * old_capacity == new_capacity);
1644 FillUpNewSpace(new_space); 1637 FillUpNewSpace(new_space);
1645 HEAP->CollectAllAvailableGarbage(); 1638 HEAP->CollectAllAvailableGarbage();
1646 new_capacity = new_space->Capacity(); 1639 new_capacity = new_space->Capacity();
1647 CHECK(old_capacity == new_capacity); 1640 CHECK(old_capacity == new_capacity);
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
1809 CHECK_EQ(0, NumberOfGlobalObjects()); 1802 CHECK_EQ(0, NumberOfGlobalObjects());
1810 } 1803 }
1811 1804
1812 1805
1813 TEST(InstanceOfStubWriteBarrier) { 1806 TEST(InstanceOfStubWriteBarrier) {
1814 i::FLAG_allow_natives_syntax = true; 1807 i::FLAG_allow_natives_syntax = true;
1815 #ifdef VERIFY_HEAP 1808 #ifdef VERIFY_HEAP
1816 i::FLAG_verify_heap = true; 1809 i::FLAG_verify_heap = true;
1817 #endif 1810 #endif
1818 1811
1819 InitializeVM(); 1812 CcTest::InitializeVM();
1820 if (!i::V8::UseCrankshaft()) return; 1813 if (!i::V8::UseCrankshaft()) return;
1821 if (i::FLAG_force_marking_deque_overflows) return; 1814 if (i::FLAG_force_marking_deque_overflows) return;
1822 v8::HandleScope outer_scope(v8::Isolate::GetCurrent()); 1815 v8::HandleScope outer_scope(v8::Isolate::GetCurrent());
1823 1816
1824 { 1817 {
1825 v8::HandleScope scope(v8::Isolate::GetCurrent()); 1818 v8::HandleScope scope(v8::Isolate::GetCurrent());
1826 CompileRun( 1819 CompileRun(
1827 "function foo () { }" 1820 "function foo () { }"
1828 "function mkbar () { return new (new Function(\"\")) (); }" 1821 "function mkbar () { return new (new Function(\"\")) (); }"
1829 "function f (x) { return (x instanceof foo); }" 1822 "function f (x) { return (x instanceof foo); }"
(...skipping 30 matching lines...) Expand all
1860 v8::Handle<v8::Function>::Cast(global->Get(v8_str("g"))); 1853 v8::Handle<v8::Function>::Cast(global->Get(v8_str("g")));
1861 g->Call(global, 0, NULL); 1854 g->Call(global, 0, NULL);
1862 } 1855 }
1863 1856
1864 HEAP->incremental_marking()->set_should_hurry(true); 1857 HEAP->incremental_marking()->set_should_hurry(true);
1865 HEAP->CollectGarbage(OLD_POINTER_SPACE); 1858 HEAP->CollectGarbage(OLD_POINTER_SPACE);
1866 } 1859 }
1867 1860
1868 1861
1869 TEST(PrototypeTransitionClearing) { 1862 TEST(PrototypeTransitionClearing) {
1870 InitializeVM(); 1863 CcTest::InitializeVM();
1871 v8::HandleScope scope(env->GetIsolate()); 1864 v8::HandleScope scope(CcTest::isolate());
1872 1865
1873 CompileRun( 1866 CompileRun(
1874 "var base = {};" 1867 "var base = {};"
1875 "var live = [];" 1868 "var live = [];"
1876 "for (var i = 0; i < 10; i++) {" 1869 "for (var i = 0; i < 10; i++) {"
1877 " var object = {};" 1870 " var object = {};"
1878 " var prototype = {};" 1871 " var prototype = {};"
1879 " object.__proto__ = prototype;" 1872 " object.__proto__ = prototype;"
1880 " if (i >= 3) live.push(object, prototype);" 1873 " if (i >= 3) live.push(object, prototype);"
1881 "}"); 1874 "}");
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1923 CHECK(map->GetPrototypeTransition(*prototype)->IsMap()); 1916 CHECK(map->GetPrototypeTransition(*prototype)->IsMap());
1924 } 1917 }
1925 1918
1926 1919
1927 TEST(ResetSharedFunctionInfoCountersDuringIncrementalMarking) { 1920 TEST(ResetSharedFunctionInfoCountersDuringIncrementalMarking) {
1928 i::FLAG_allow_natives_syntax = true; 1921 i::FLAG_allow_natives_syntax = true;
1929 #ifdef VERIFY_HEAP 1922 #ifdef VERIFY_HEAP
1930 i::FLAG_verify_heap = true; 1923 i::FLAG_verify_heap = true;
1931 #endif 1924 #endif
1932 1925
1933 InitializeVM(); 1926 CcTest::InitializeVM();
1934 if (!i::V8::UseCrankshaft()) return; 1927 if (!i::V8::UseCrankshaft()) return;
1935 v8::HandleScope outer_scope(v8::Isolate::GetCurrent()); 1928 v8::HandleScope outer_scope(v8::Isolate::GetCurrent());
1936 1929
1937 { 1930 {
1938 v8::HandleScope scope(v8::Isolate::GetCurrent()); 1931 v8::HandleScope scope(v8::Isolate::GetCurrent());
1939 CompileRun( 1932 CompileRun(
1940 "function f () {" 1933 "function f () {"
1941 " var s = 0;" 1934 " var s = 0;"
1942 " for (var i = 0; i < 100; i++) s += i;" 1935 " for (var i = 0; i < 100; i++) s += i;"
1943 " return s;" 1936 " return s;"
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1979 CHECK_EQ(0, f->shared()->code()->profiler_ticks()); 1972 CHECK_EQ(0, f->shared()->code()->profiler_ticks());
1980 } 1973 }
1981 1974
1982 1975
1983 TEST(ResetSharedFunctionInfoCountersDuringMarkSweep) { 1976 TEST(ResetSharedFunctionInfoCountersDuringMarkSweep) {
1984 i::FLAG_allow_natives_syntax = true; 1977 i::FLAG_allow_natives_syntax = true;
1985 #ifdef VERIFY_HEAP 1978 #ifdef VERIFY_HEAP
1986 i::FLAG_verify_heap = true; 1979 i::FLAG_verify_heap = true;
1987 #endif 1980 #endif
1988 1981
1989 InitializeVM(); 1982 CcTest::InitializeVM();
1990 if (!i::V8::UseCrankshaft()) return; 1983 if (!i::V8::UseCrankshaft()) return;
1991 v8::HandleScope outer_scope(env->GetIsolate()); 1984 v8::HandleScope outer_scope(CcTest::isolate());
1992 1985
1993 { 1986 {
1994 v8::HandleScope scope(env->GetIsolate()); 1987 v8::HandleScope scope(CcTest::isolate());
1995 CompileRun( 1988 CompileRun(
1996 "function f () {" 1989 "function f () {"
1997 " var s = 0;" 1990 " var s = 0;"
1998 " for (var i = 0; i < 100; i++) s += i;" 1991 " for (var i = 0; i < 100; i++) s += i;"
1999 " return s;" 1992 " return s;"
2000 "}" 1993 "}"
2001 "f(); f();" 1994 "f(); f();"
2002 "%OptimizeFunctionOnNextCall(f);" 1995 "%OptimizeFunctionOnNextCall(f);"
2003 "f();"); 1996 "f();");
2004 } 1997 }
(...skipping 13 matching lines...) Expand all
2018 2011
2019 CHECK_EQ(HEAP->global_ic_age(), f->shared()->ic_age()); 2012 CHECK_EQ(HEAP->global_ic_age(), f->shared()->ic_age());
2020 CHECK_EQ(0, f->shared()->opt_count()); 2013 CHECK_EQ(0, f->shared()->opt_count());
2021 CHECK_EQ(0, f->shared()->code()->profiler_ticks()); 2014 CHECK_EQ(0, f->shared()->code()->profiler_ticks());
2022 } 2015 }
2023 2016
2024 2017
2025 // Test that HAllocateObject will always return an object in new-space. 2018 // Test that HAllocateObject will always return an object in new-space.
2026 TEST(OptimizedAllocationAlwaysInNewSpace) { 2019 TEST(OptimizedAllocationAlwaysInNewSpace) {
2027 i::FLAG_allow_natives_syntax = true; 2020 i::FLAG_allow_natives_syntax = true;
2028 InitializeVM(); 2021 CcTest::InitializeVM();
2029 if (!i::V8::UseCrankshaft() || i::FLAG_always_opt) return; 2022 if (!i::V8::UseCrankshaft() || i::FLAG_always_opt) return;
2030 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; 2023 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
2031 v8::HandleScope scope(env->GetIsolate()); 2024 v8::HandleScope scope(CcTest::isolate());
2032 2025
2033 SimulateFullSpace(HEAP->new_space()); 2026 SimulateFullSpace(HEAP->new_space());
2034 AlwaysAllocateScope always_allocate; 2027 AlwaysAllocateScope always_allocate;
2035 v8::Local<v8::Value> res = CompileRun( 2028 v8::Local<v8::Value> res = CompileRun(
2036 "function c(x) {" 2029 "function c(x) {"
2037 " this.x = x;" 2030 " this.x = x;"
2038 " for (var i = 0; i < 32; i++) {" 2031 " for (var i = 0; i < 32; i++) {"
2039 " this['x' + i] = x;" 2032 " this['x' + i] = x;"
2040 " }" 2033 " }"
2041 "}" 2034 "}"
2042 "function f(x) { return new c(x); };" 2035 "function f(x) { return new c(x); };"
2043 "f(1); f(2); f(3);" 2036 "f(1); f(2); f(3);"
2044 "%OptimizeFunctionOnNextCall(f);" 2037 "%OptimizeFunctionOnNextCall(f);"
2045 "f(4);"); 2038 "f(4);");
2046 CHECK_EQ(4, res->ToObject()->GetRealNamedProperty(v8_str("x"))->Int32Value()); 2039 CHECK_EQ(4, res->ToObject()->GetRealNamedProperty(v8_str("x"))->Int32Value());
2047 2040
2048 Handle<JSObject> o = 2041 Handle<JSObject> o =
2049 v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res)); 2042 v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
2050 2043
2051 CHECK(HEAP->InNewSpace(*o)); 2044 CHECK(HEAP->InNewSpace(*o));
2052 } 2045 }
2053 2046
2054 2047
2055 // Test pretenuring of array literals allocated with HAllocate. 2048 // Test pretenuring of array literals allocated with HAllocate.
2056 TEST(OptimizedPretenuringArrayLiterals) { 2049 TEST(OptimizedPretenuringArrayLiterals) {
2057 i::FLAG_allow_natives_syntax = true; 2050 i::FLAG_allow_natives_syntax = true;
2058 i::FLAG_pretenure_literals = true; 2051 i::FLAG_pretenure_literals = true;
2059 InitializeVM(); 2052 CcTest::InitializeVM();
2060 if (!i::V8::UseCrankshaft() || i::FLAG_always_opt) return; 2053 if (!i::V8::UseCrankshaft() || i::FLAG_always_opt) return;
2061 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; 2054 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
2062 v8::HandleScope scope(env->GetIsolate()); 2055 v8::HandleScope scope(CcTest::isolate());
2063 2056
2064 AlwaysAllocateScope always_allocate; 2057 AlwaysAllocateScope always_allocate;
2065 v8::Local<v8::Value> res = CompileRun( 2058 v8::Local<v8::Value> res = CompileRun(
2066 "function f() {" 2059 "function f() {"
2067 " var numbers = [1, 2, 3];" 2060 " var numbers = [1, 2, 3];"
2068 " numbers[0] = {};" 2061 " numbers[0] = {};"
2069 " return numbers;" 2062 " return numbers;"
2070 "};" 2063 "};"
2071 "f(); f(); f();" 2064 "f(); f(); f();"
2072 "%OptimizeFunctionOnNextCall(f);" 2065 "%OptimizeFunctionOnNextCall(f);"
2073 "f();"); 2066 "f();");
2074 2067
2075 Handle<JSObject> o = 2068 Handle<JSObject> o =
2076 v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res)); 2069 v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res));
2077 2070
2078 CHECK(HEAP->InOldPointerSpace(o->elements())); 2071 CHECK(HEAP->InOldPointerSpace(o->elements()));
2079 } 2072 }
2080 2073
2081 2074
2082 // Test regular array literals allocation. 2075 // Test regular array literals allocation.
2083 TEST(OptimizedAllocationArrayLiterals) { 2076 TEST(OptimizedAllocationArrayLiterals) {
2084 i::FLAG_allow_natives_syntax = true; 2077 i::FLAG_allow_natives_syntax = true;
2085 InitializeVM(); 2078 CcTest::InitializeVM();
2086 if (!i::V8::UseCrankshaft() || i::FLAG_always_opt) return; 2079 if (!i::V8::UseCrankshaft() || i::FLAG_always_opt) return;
2087 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; 2080 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return;
2088 v8::HandleScope scope(env->GetIsolate()); 2081 v8::HandleScope scope(CcTest::isolate());
2089 2082
2090 AlwaysAllocateScope always_allocate; 2083 AlwaysAllocateScope always_allocate;
2091 v8::Local<v8::Value> res = CompileRun( 2084 v8::Local<v8::Value> res = CompileRun(
2092 "function f() {" 2085 "function f() {"
2093 " var numbers = new Array(1, 2, 3);" 2086 " var numbers = new Array(1, 2, 3);"
2094 " numbers[0] = 3.14;" 2087 " numbers[0] = 3.14;"
2095 " return numbers;" 2088 " return numbers;"
2096 "};" 2089 "};"
2097 "f(); f(); f();" 2090 "f(); f(); f();"
2098 "%OptimizeFunctionOnNextCall(f);" 2091 "%OptimizeFunctionOnNextCall(f);"
(...skipping 11 matching lines...) Expand all
2110 static int CountMapTransitions(Map* map) { 2103 static int CountMapTransitions(Map* map) {
2111 return map->transitions()->number_of_transitions(); 2104 return map->transitions()->number_of_transitions();
2112 } 2105 }
2113 2106
2114 2107
2115 // Test that map transitions are cleared and maps are collected with 2108 // Test that map transitions are cleared and maps are collected with
2116 // incremental marking as well. 2109 // incremental marking as well.
2117 TEST(Regress1465) { 2110 TEST(Regress1465) {
2118 i::FLAG_allow_natives_syntax = true; 2111 i::FLAG_allow_natives_syntax = true;
2119 i::FLAG_trace_incremental_marking = true; 2112 i::FLAG_trace_incremental_marking = true;
2120 InitializeVM(); 2113 CcTest::InitializeVM();
2121 v8::HandleScope scope(env->GetIsolate()); 2114 v8::HandleScope scope(CcTest::isolate());
2122 static const int transitions_count = 256; 2115 static const int transitions_count = 256;
2123 2116
2124 { 2117 {
2125 AlwaysAllocateScope always_allocate; 2118 AlwaysAllocateScope always_allocate;
2126 for (int i = 0; i < transitions_count; i++) { 2119 for (int i = 0; i < transitions_count; i++) {
2127 EmbeddedVector<char, 64> buffer; 2120 EmbeddedVector<char, 64> buffer;
2128 OS::SNPrintF(buffer, "var o = new Object; o.prop%d = %d;", i, i); 2121 OS::SNPrintF(buffer, "var o = new Object; o.prop%d = %d;", i, i);
2129 CompileRun(buffer.start()); 2122 CompileRun(buffer.start());
2130 } 2123 }
2131 CompileRun("var root = new Object;"); 2124 CompileRun("var root = new Object;");
(...skipping 16 matching lines...) Expand all
2148 // is left, because 'o' still holds an instance of one transition target. 2141 // is left, because 'o' still holds an instance of one transition target.
2149 int transitions_after = CountMapTransitions(root->map()); 2142 int transitions_after = CountMapTransitions(root->map());
2150 CompileRun("%DebugPrint(root);"); 2143 CompileRun("%DebugPrint(root);");
2151 CHECK_EQ(1, transitions_after); 2144 CHECK_EQ(1, transitions_after);
2152 } 2145 }
2153 2146
2154 2147
2155 TEST(Regress2143a) { 2148 TEST(Regress2143a) {
2156 i::FLAG_collect_maps = true; 2149 i::FLAG_collect_maps = true;
2157 i::FLAG_incremental_marking = true; 2150 i::FLAG_incremental_marking = true;
2158 InitializeVM(); 2151 CcTest::InitializeVM();
2159 v8::HandleScope scope(env->GetIsolate()); 2152 v8::HandleScope scope(CcTest::isolate());
2160 2153
2161 // Prepare a map transition from the root object together with a yet 2154 // Prepare a map transition from the root object together with a yet
2162 // untransitioned root object. 2155 // untransitioned root object.
2163 CompileRun("var root = new Object;" 2156 CompileRun("var root = new Object;"
2164 "root.foo = 0;" 2157 "root.foo = 0;"
2165 "root = new Object;"); 2158 "root = new Object;");
2166 2159
2167 SimulateIncrementalMarking(); 2160 SimulateIncrementalMarking();
2168 2161
2169 // Compile a StoreIC that performs the prepared map transition. This 2162 // Compile a StoreIC that performs the prepared map transition. This
(...skipping 19 matching lines...) Expand all
2189 // The root object should be in a sane state. 2182 // The root object should be in a sane state.
2190 CHECK(root->IsJSObject()); 2183 CHECK(root->IsJSObject());
2191 CHECK(root->map()->IsMap()); 2184 CHECK(root->map()->IsMap());
2192 } 2185 }
2193 2186
2194 2187
2195 TEST(Regress2143b) { 2188 TEST(Regress2143b) {
2196 i::FLAG_collect_maps = true; 2189 i::FLAG_collect_maps = true;
2197 i::FLAG_incremental_marking = true; 2190 i::FLAG_incremental_marking = true;
2198 i::FLAG_allow_natives_syntax = true; 2191 i::FLAG_allow_natives_syntax = true;
2199 InitializeVM(); 2192 CcTest::InitializeVM();
2200 v8::HandleScope scope(env->GetIsolate()); 2193 v8::HandleScope scope(CcTest::isolate());
2201 2194
2202 // Prepare a map transition from the root object together with a yet 2195 // Prepare a map transition from the root object together with a yet
2203 // untransitioned root object. 2196 // untransitioned root object.
2204 CompileRun("var root = new Object;" 2197 CompileRun("var root = new Object;"
2205 "root.foo = 0;" 2198 "root.foo = 0;"
2206 "root = new Object;"); 2199 "root = new Object;");
2207 2200
2208 SimulateIncrementalMarking(); 2201 SimulateIncrementalMarking();
2209 2202
2210 // Compile an optimized LStoreNamedField that performs the prepared 2203 // Compile an optimized LStoreNamedField that performs the prepared
(...skipping 23 matching lines...) Expand all
2234 CHECK(root->IsJSObject()); 2227 CHECK(root->IsJSObject());
2235 CHECK(root->map()->IsMap()); 2228 CHECK(root->map()->IsMap());
2236 } 2229 }
2237 2230
2238 2231
2239 TEST(ReleaseOverReservedPages) { 2232 TEST(ReleaseOverReservedPages) {
2240 i::FLAG_trace_gc = true; 2233 i::FLAG_trace_gc = true;
2241 // The optimizer can allocate stuff, messing up the test. 2234 // The optimizer can allocate stuff, messing up the test.
2242 i::FLAG_crankshaft = false; 2235 i::FLAG_crankshaft = false;
2243 i::FLAG_always_opt = false; 2236 i::FLAG_always_opt = false;
2244 InitializeVM(); 2237 CcTest::InitializeVM();
2245 v8::HandleScope scope(env->GetIsolate()); 2238 v8::HandleScope scope(CcTest::isolate());
2246 static const int number_of_test_pages = 20; 2239 static const int number_of_test_pages = 20;
2247 2240
2248 // Prepare many pages with low live-bytes count. 2241 // Prepare many pages with low live-bytes count.
2249 PagedSpace* old_pointer_space = HEAP->old_pointer_space(); 2242 PagedSpace* old_pointer_space = HEAP->old_pointer_space();
2250 CHECK_EQ(1, old_pointer_space->CountTotalPages()); 2243 CHECK_EQ(1, old_pointer_space->CountTotalPages());
2251 for (int i = 0; i < number_of_test_pages; i++) { 2244 for (int i = 0; i < number_of_test_pages; i++) {
2252 AlwaysAllocateScope always_allocate; 2245 AlwaysAllocateScope always_allocate;
2253 SimulateFullSpace(old_pointer_space); 2246 SimulateFullSpace(old_pointer_space);
2254 FACTORY->NewFixedArray(1, TENURED); 2247 FACTORY->NewFixedArray(1, TENURED);
2255 } 2248 }
(...skipping 17 matching lines...) Expand all
2273 // size of the first page a little in SizeOfFirstPage in spaces.cc. The 2266 // size of the first page a little in SizeOfFirstPage in spaces.cc. The
2274 // first page should be small in order to reduce memory used when the VM 2267 // first page should be small in order to reduce memory used when the VM
2275 // boots, but if the 20 small arrays don't fit on the first page then that's 2268 // boots, but if the 20 small arrays don't fit on the first page then that's
2276 // an indication that it is too small. 2269 // an indication that it is too small.
2277 HEAP->CollectAllAvailableGarbage("triggered really hard"); 2270 HEAP->CollectAllAvailableGarbage("triggered really hard");
2278 CHECK_EQ(1, old_pointer_space->CountTotalPages()); 2271 CHECK_EQ(1, old_pointer_space->CountTotalPages());
2279 } 2272 }
2280 2273
2281 2274
2282 TEST(Regress2237) { 2275 TEST(Regress2237) {
2283 InitializeVM(); 2276 CcTest::InitializeVM();
2284 v8::HandleScope scope(env->GetIsolate()); 2277 v8::HandleScope scope(CcTest::isolate());
2285 Handle<String> slice(HEAP->empty_string()); 2278 Handle<String> slice(HEAP->empty_string());
2286 2279
2287 { 2280 {
2288 // Generate a parent that lives in new-space. 2281 // Generate a parent that lives in new-space.
2289 v8::HandleScope inner_scope(env->GetIsolate()); 2282 v8::HandleScope inner_scope(CcTest::isolate());
2290 const char* c = "This text is long enough to trigger sliced strings."; 2283 const char* c = "This text is long enough to trigger sliced strings.";
2291 Handle<String> s = FACTORY->NewStringFromAscii(CStrVector(c)); 2284 Handle<String> s = FACTORY->NewStringFromAscii(CStrVector(c));
2292 CHECK(s->IsSeqOneByteString()); 2285 CHECK(s->IsSeqOneByteString());
2293 CHECK(HEAP->InNewSpace(*s)); 2286 CHECK(HEAP->InNewSpace(*s));
2294 2287
2295 // Generate a sliced string that is based on the above parent and 2288 // Generate a sliced string that is based on the above parent and
2296 // lives in old-space. 2289 // lives in old-space.
2297 SimulateFullSpace(HEAP->new_space()); 2290 SimulateFullSpace(HEAP->new_space());
2298 AlwaysAllocateScope always_allocate; 2291 AlwaysAllocateScope always_allocate;
2299 Handle<String> t = FACTORY->NewProperSubString(s, 5, 35); 2292 Handle<String> t = FACTORY->NewProperSubString(s, 5, 35);
2300 CHECK(t->IsSlicedString()); 2293 CHECK(t->IsSlicedString());
2301 CHECK(!HEAP->InNewSpace(*t)); 2294 CHECK(!HEAP->InNewSpace(*t));
2302 *slice.location() = *t.location(); 2295 *slice.location() = *t.location();
2303 } 2296 }
2304 2297
2305 CHECK(SlicedString::cast(*slice)->parent()->IsSeqOneByteString()); 2298 CHECK(SlicedString::cast(*slice)->parent()->IsSeqOneByteString());
2306 HEAP->CollectAllGarbage(Heap::kNoGCFlags); 2299 HEAP->CollectAllGarbage(Heap::kNoGCFlags);
2307 CHECK(SlicedString::cast(*slice)->parent()->IsSeqOneByteString()); 2300 CHECK(SlicedString::cast(*slice)->parent()->IsSeqOneByteString());
2308 } 2301 }
2309 2302
2310 2303
2311 #ifdef OBJECT_PRINT 2304 #ifdef OBJECT_PRINT
2312 TEST(PrintSharedFunctionInfo) { 2305 TEST(PrintSharedFunctionInfo) {
2313 InitializeVM(); 2306 CcTest::InitializeVM();
2314 v8::HandleScope scope(env->GetIsolate()); 2307 v8::HandleScope scope(CcTest::isolate());
2315 const char* source = "f = function() { return 987654321; }\n" 2308 const char* source = "f = function() { return 987654321; }\n"
2316 "g = function() { return 123456789; }\n"; 2309 "g = function() { return 123456789; }\n";
2317 CompileRun(source); 2310 CompileRun(source);
2318 Handle<JSFunction> g = 2311 Handle<JSFunction> g =
2319 v8::Utils::OpenHandle( 2312 v8::Utils::OpenHandle(
2320 *v8::Handle<v8::Function>::Cast( 2313 *v8::Handle<v8::Function>::Cast(
2321 v8::Context::GetCurrent()->Global()->Get(v8_str("g")))); 2314 v8::Context::GetCurrent()->Global()->Get(v8_str("g"))));
2322 2315
2323 AssertNoAllocation no_alloc; 2316 AssertNoAllocation no_alloc;
2324 g->shared()->PrintLn(); 2317 g->shared()->PrintLn();
2325 } 2318 }
2326 #endif // OBJECT_PRINT 2319 #endif // OBJECT_PRINT
2327 2320
2328 2321
2329 TEST(Regress2211) { 2322 TEST(Regress2211) {
2330 InitializeVM(); 2323 CcTest::InitializeVM();
2331 v8::HandleScope scope(env->GetIsolate()); 2324 v8::HandleScope scope(CcTest::isolate());
2332 2325
2333 v8::Handle<v8::String> value = v8_str("val string"); 2326 v8::Handle<v8::String> value = v8_str("val string");
2334 Smi* hash = Smi::FromInt(321); 2327 Smi* hash = Smi::FromInt(321);
2335 Heap* heap = Isolate::Current()->heap(); 2328 Heap* heap = Isolate::Current()->heap();
2336 2329
2337 for (int i = 0; i < 2; i++) { 2330 for (int i = 0; i < 2; i++) {
2338 // Store identity hash first and common hidden property second. 2331 // Store identity hash first and common hidden property second.
2339 v8::Handle<v8::Object> obj = v8::Object::New(); 2332 v8::Handle<v8::Object> obj = v8::Object::New();
2340 Handle<JSObject> internal_obj = v8::Utils::OpenHandle(*obj); 2333 Handle<JSObject> internal_obj = v8::Utils::OpenHandle(*obj);
2341 CHECK(internal_obj->HasFastProperties()); 2334 CHECK(internal_obj->HasFastProperties());
(...skipping 16 matching lines...) Expand all
2358 ObjectHashTable* hashtable = ObjectHashTable::cast( 2351 ObjectHashTable* hashtable = ObjectHashTable::cast(
2359 internal_obj->FastPropertyAt(descriptors->GetFieldIndex(0))); 2352 internal_obj->FastPropertyAt(descriptors->GetFieldIndex(0)));
2360 // HashTable header (5) and 4 initial entries (8). 2353 // HashTable header (5) and 4 initial entries (8).
2361 CHECK_LE(hashtable->SizeFor(hashtable->length()), 13 * kPointerSize); 2354 CHECK_LE(hashtable->SizeFor(hashtable->length()), 13 * kPointerSize);
2362 } 2355 }
2363 } 2356 }
2364 2357
2365 2358
2366 TEST(IncrementalMarkingClearsTypeFeedbackCells) { 2359 TEST(IncrementalMarkingClearsTypeFeedbackCells) {
2367 if (i::FLAG_always_opt) return; 2360 if (i::FLAG_always_opt) return;
2368 InitializeVM(); 2361 CcTest::InitializeVM();
2369 v8::HandleScope scope(env->GetIsolate()); 2362 v8::HandleScope scope(CcTest::isolate());
2370 v8::Local<v8::Value> fun1, fun2; 2363 v8::Local<v8::Value> fun1, fun2;
2371 2364
2372 { 2365 {
2373 LocalContext env; 2366 LocalContext env;
2374 CompileRun("function fun() {};"); 2367 CompileRun("function fun() {};");
2375 fun1 = env->Global()->Get(v8_str("fun")); 2368 fun1 = env->Global()->Get(v8_str("fun"));
2376 } 2369 }
2377 2370
2378 { 2371 {
2379 LocalContext env; 2372 LocalContext env;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
2417 if (target->is_inline_cache_stub() && target->kind() == kind) { 2410 if (target->is_inline_cache_stub() && target->kind() == kind) {
2418 return target; 2411 return target;
2419 } 2412 }
2420 } 2413 }
2421 return NULL; 2414 return NULL;
2422 } 2415 }
2423 2416
2424 2417
2425 TEST(IncrementalMarkingPreservesMonomorhpicIC) { 2418 TEST(IncrementalMarkingPreservesMonomorhpicIC) {
2426 if (i::FLAG_always_opt) return; 2419 if (i::FLAG_always_opt) return;
2427 InitializeVM(); 2420 CcTest::InitializeVM();
2428 v8::HandleScope scope(env->GetIsolate()); 2421 v8::HandleScope scope(CcTest::isolate());
2429 2422
2430 // Prepare function f that contains a monomorphic IC for object 2423 // Prepare function f that contains a monomorphic IC for object
2431 // originating from the same native context. 2424 // originating from the same native context.
2432 CompileRun("function fun() { this.x = 1; }; var obj = new fun();" 2425 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"
2433 "function f(o) { return o.x; } f(obj); f(obj);"); 2426 "function f(o) { return o.x; } f(obj); f(obj);");
2434 Handle<JSFunction> f = 2427 Handle<JSFunction> f =
2435 v8::Utils::OpenHandle( 2428 v8::Utils::OpenHandle(
2436 *v8::Handle<v8::Function>::Cast( 2429 *v8::Handle<v8::Function>::Cast(
2437 v8::Context::GetCurrent()->Global()->Get(v8_str("f")))); 2430 v8::Context::GetCurrent()->Global()->Get(v8_str("f"))));
2438 2431
2439 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC); 2432 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
2440 CHECK(ic_before->ic_state() == MONOMORPHIC); 2433 CHECK(ic_before->ic_state() == MONOMORPHIC);
2441 2434
2442 SimulateIncrementalMarking(); 2435 SimulateIncrementalMarking();
2443 HEAP->CollectAllGarbage(Heap::kNoGCFlags); 2436 HEAP->CollectAllGarbage(Heap::kNoGCFlags);
2444 2437
2445 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); 2438 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
2446 CHECK(ic_after->ic_state() == MONOMORPHIC); 2439 CHECK(ic_after->ic_state() == MONOMORPHIC);
2447 } 2440 }
2448 2441
2449 2442
2450 TEST(IncrementalMarkingClearsMonomorhpicIC) { 2443 TEST(IncrementalMarkingClearsMonomorhpicIC) {
2451 if (i::FLAG_always_opt) return; 2444 if (i::FLAG_always_opt) return;
2452 InitializeVM(); 2445 CcTest::InitializeVM();
2453 v8::HandleScope scope(env->GetIsolate()); 2446 v8::HandleScope scope(CcTest::isolate());
2454 v8::Local<v8::Value> obj1; 2447 v8::Local<v8::Value> obj1;
2455 2448
2456 { 2449 {
2457 LocalContext env; 2450 LocalContext env;
2458 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); 2451 CompileRun("function fun() { this.x = 1; }; var obj = new fun();");
2459 obj1 = env->Global()->Get(v8_str("obj")); 2452 obj1 = env->Global()->Get(v8_str("obj"));
2460 } 2453 }
2461 2454
2462 // Prepare function f that contains a monomorphic IC for object 2455 // Prepare function f that contains a monomorphic IC for object
2463 // originating from a different native context. 2456 // originating from a different native context.
(...skipping 12 matching lines...) Expand all
2476 SimulateIncrementalMarking(); 2469 SimulateIncrementalMarking();
2477 HEAP->CollectAllGarbage(Heap::kNoGCFlags); 2470 HEAP->CollectAllGarbage(Heap::kNoGCFlags);
2478 2471
2479 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); 2472 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
2480 CHECK(ic_after->ic_state() == UNINITIALIZED); 2473 CHECK(ic_after->ic_state() == UNINITIALIZED);
2481 } 2474 }
2482 2475
2483 2476
2484 TEST(IncrementalMarkingClearsPolymorhpicIC) { 2477 TEST(IncrementalMarkingClearsPolymorhpicIC) {
2485 if (i::FLAG_always_opt) return; 2478 if (i::FLAG_always_opt) return;
2486 InitializeVM(); 2479 CcTest::InitializeVM();
2487 v8::HandleScope scope(env->GetIsolate()); 2480 v8::HandleScope scope(CcTest::isolate());
2488 v8::Local<v8::Value> obj1, obj2; 2481 v8::Local<v8::Value> obj1, obj2;
2489 2482
2490 { 2483 {
2491 LocalContext env; 2484 LocalContext env;
2492 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); 2485 CompileRun("function fun() { this.x = 1; }; var obj = new fun();");
2493 obj1 = env->Global()->Get(v8_str("obj")); 2486 obj1 = env->Global()->Get(v8_str("obj"));
2494 } 2487 }
2495 2488
2496 { 2489 {
2497 LocalContext env; 2490 LocalContext env;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
2542 const char* data_; 2535 const char* data_;
2543 size_t length_; 2536 size_t length_;
2544 }; 2537 };
2545 2538
2546 2539
2547 void ReleaseStackTraceDataTest(const char* source) { 2540 void ReleaseStackTraceDataTest(const char* source) {
2548 // Test that the data retained by the Error.stack accessor is released 2541 // Test that the data retained by the Error.stack accessor is released
2549 // after the first time the accessor is fired. We use external string 2542 // after the first time the accessor is fired. We use external string
2550 // to check whether the data is being released since the external string 2543 // to check whether the data is being released since the external string
2551 // resource's callback is fired when the external string is GC'ed. 2544 // resource's callback is fired when the external string is GC'ed.
2552 InitializeVM(); 2545 CcTest::InitializeVM();
2553 v8::HandleScope scope(env->GetIsolate()); 2546 v8::HandleScope scope(CcTest::isolate());
2554 SourceResource* resource = new SourceResource(i::StrDup(source)); 2547 SourceResource* resource = new SourceResource(i::StrDup(source));
2555 { 2548 {
2556 v8::HandleScope scope(env->GetIsolate()); 2549 v8::HandleScope scope(CcTest::isolate());
2557 v8::Handle<v8::String> source_string = v8::String::NewExternal(resource); 2550 v8::Handle<v8::String> source_string = v8::String::NewExternal(resource);
2558 v8::Script::Compile(source_string)->Run(); 2551 v8::Script::Compile(source_string)->Run();
2559 CHECK(!resource->IsDisposed()); 2552 CHECK(!resource->IsDisposed());
2560 } 2553 }
2561 HEAP->CollectAllAvailableGarbage(); 2554 HEAP->CollectAllAvailableGarbage();
2562 2555
2563 // External source has been released. 2556 // External source has been released.
2564 CHECK(resource->IsDisposed()); 2557 CHECK(resource->IsDisposed());
2565 delete resource; 2558 delete resource;
2566 } 2559 }
(...skipping 11 matching lines...) Expand all
2578 " (function f() { f(); })(); " 2571 " (function f() { f(); })(); "
2579 "} catch (e) { " 2572 "} catch (e) { "
2580 " error = e; " 2573 " error = e; "
2581 "} "; 2574 "} ";
2582 ReleaseStackTraceDataTest(source1); 2575 ReleaseStackTraceDataTest(source1);
2583 ReleaseStackTraceDataTest(source2); 2576 ReleaseStackTraceDataTest(source2);
2584 } 2577 }
2585 2578
2586 2579
2587 TEST(Regression144230) { 2580 TEST(Regression144230) {
2588 InitializeVM(); 2581 CcTest::InitializeVM();
2589 Isolate* isolate = Isolate::Current(); 2582 Isolate* isolate = Isolate::Current();
2590 Heap* heap = isolate->heap(); 2583 Heap* heap = isolate->heap();
2591 HandleScope scope(isolate); 2584 HandleScope scope(isolate);
2592 2585
2593 // First make sure that the uninitialized CallIC stub is on a single page 2586 // First make sure that the uninitialized CallIC stub is on a single page
2594 // that will later be selected as an evacuation candidate. 2587 // that will later be selected as an evacuation candidate.
2595 { 2588 {
2596 HandleScope inner_scope(isolate); 2589 HandleScope inner_scope(isolate);
2597 AlwaysAllocateScope always_allocate; 2590 AlwaysAllocateScope always_allocate;
2598 SimulateFullSpace(heap->code_space()); 2591 SimulateFullSpace(heap->code_space());
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2641 // Either heap verification caught the problem already or we go kaboom once 2634 // Either heap verification caught the problem already or we go kaboom once
2642 // the CallIC is executed the next time. 2635 // the CallIC is executed the next time.
2643 USE(global->SetProperty(*name, *call_function, NONE, kNonStrictMode)); 2636 USE(global->SetProperty(*name, *call_function, NONE, kNonStrictMode));
2644 CompileRun("call();"); 2637 CompileRun("call();");
2645 } 2638 }
2646 2639
2647 2640
2648 TEST(Regress159140) { 2641 TEST(Regress159140) {
2649 i::FLAG_allow_natives_syntax = true; 2642 i::FLAG_allow_natives_syntax = true;
2650 i::FLAG_flush_code_incrementally = true; 2643 i::FLAG_flush_code_incrementally = true;
2651 InitializeVM(); 2644 CcTest::InitializeVM();
2652 Isolate* isolate = Isolate::Current(); 2645 Isolate* isolate = Isolate::Current();
2653 Heap* heap = isolate->heap(); 2646 Heap* heap = isolate->heap();
2654 HandleScope scope(isolate); 2647 HandleScope scope(isolate);
2655 2648
2656 // Perform one initial GC to enable code flushing. 2649 // Perform one initial GC to enable code flushing.
2657 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); 2650 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
2658 2651
2659 // Prepare several closures that are all eligible for code flushing 2652 // Prepare several closures that are all eligible for code flushing
2660 // because all reachable ones are not optimized. Make sure that the 2653 // because all reachable ones are not optimized. Make sure that the
2661 // optimized code object is directly reachable through a handle so 2654 // optimized code object is directly reachable through a handle so
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2703 heap->CollectAllGarbage(Heap::kNoGCFlags); 2696 heap->CollectAllGarbage(Heap::kNoGCFlags);
2704 2697
2705 // Unoptimized code is missing and the deoptimizer will go ballistic. 2698 // Unoptimized code is missing and the deoptimizer will go ballistic.
2706 CompileRun("g('bozo');"); 2699 CompileRun("g('bozo');");
2707 } 2700 }
2708 2701
2709 2702
2710 TEST(Regress165495) { 2703 TEST(Regress165495) {
2711 i::FLAG_allow_natives_syntax = true; 2704 i::FLAG_allow_natives_syntax = true;
2712 i::FLAG_flush_code_incrementally = true; 2705 i::FLAG_flush_code_incrementally = true;
2713 InitializeVM(); 2706 CcTest::InitializeVM();
2714 Isolate* isolate = Isolate::Current(); 2707 Isolate* isolate = Isolate::Current();
2715 Heap* heap = isolate->heap(); 2708 Heap* heap = isolate->heap();
2716 HandleScope scope(isolate); 2709 HandleScope scope(isolate);
2717 2710
2718 // Perform one initial GC to enable code flushing. 2711 // Perform one initial GC to enable code flushing.
2719 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); 2712 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
2720 2713
2721 // Prepare an optimized closure that the optimized code map will get 2714 // Prepare an optimized closure that the optimized code map will get
2722 // populated. Then age the unoptimized code to trigger code flushing 2715 // populated. Then age the unoptimized code to trigger code flushing
2723 // but make sure the optimized code is unreachable. 2716 // but make sure the optimized code is unreachable.
(...skipping 27 matching lines...) Expand all
2751 // Make a new closure that will get code installed from the code map. 2744 // Make a new closure that will get code installed from the code map.
2752 // Unoptimized code is missing and the deoptimizer will go ballistic. 2745 // Unoptimized code is missing and the deoptimizer will go ballistic.
2753 CompileRun("var g = mkClosure(); g('bozo');"); 2746 CompileRun("var g = mkClosure(); g('bozo');");
2754 } 2747 }
2755 2748
2756 2749
2757 TEST(Regress169209) { 2750 TEST(Regress169209) {
2758 i::FLAG_stress_compaction = false; 2751 i::FLAG_stress_compaction = false;
2759 i::FLAG_allow_natives_syntax = true; 2752 i::FLAG_allow_natives_syntax = true;
2760 i::FLAG_flush_code_incrementally = true; 2753 i::FLAG_flush_code_incrementally = true;
2761 InitializeVM(); 2754 CcTest::InitializeVM();
2762 Isolate* isolate = Isolate::Current(); 2755 Isolate* isolate = Isolate::Current();
2763 Heap* heap = isolate->heap(); 2756 Heap* heap = isolate->heap();
2764 HandleScope scope(isolate); 2757 HandleScope scope(isolate);
2765 2758
2766 // Perform one initial GC to enable code flushing. 2759 // Perform one initial GC to enable code flushing.
2767 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); 2760 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
2768 2761
2769 // Prepare a shared function info eligible for code flushing for which 2762 // Prepare a shared function info eligible for code flushing for which
2770 // the unoptimized code will be replaced during optimization. 2763 // the unoptimized code will be replaced during optimization.
2771 Handle<SharedFunctionInfo> shared1; 2764 Handle<SharedFunctionInfo> shared1;
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
2837 int new_linear_size = space_remaining - extra_bytes; 2830 int new_linear_size = space_remaining - extra_bytes;
2838 v8::internal::MaybeObject* maybe = space->AllocateRaw(new_linear_size); 2831 v8::internal::MaybeObject* maybe = space->AllocateRaw(new_linear_size);
2839 v8::internal::FreeListNode* node = v8::internal::FreeListNode::cast(maybe); 2832 v8::internal::FreeListNode* node = v8::internal::FreeListNode::cast(maybe);
2840 node->set_size(space->heap(), new_linear_size); 2833 node->set_size(space->heap(), new_linear_size);
2841 } 2834 }
2842 2835
2843 2836
2844 TEST(Regress169928) { 2837 TEST(Regress169928) {
2845 i::FLAG_allow_natives_syntax = true; 2838 i::FLAG_allow_natives_syntax = true;
2846 i::FLAG_crankshaft = false; 2839 i::FLAG_crankshaft = false;
2847 InitializeVM(); 2840 CcTest::InitializeVM();
2848 v8::HandleScope scope(env->GetIsolate()); 2841 v8::HandleScope scope(CcTest::isolate());
2849 2842
2850 // Some flags turn Scavenge collections into Mark-sweep collections 2843 // Some flags turn Scavenge collections into Mark-sweep collections
2851 // and hence are incompatible with this test case. 2844 // and hence are incompatible with this test case.
2852 if (FLAG_gc_global || FLAG_stress_compaction) return; 2845 if (FLAG_gc_global || FLAG_stress_compaction) return;
2853 2846
2854 // Prepare the environment 2847 // Prepare the environment
2855 CompileRun("function fastliteralcase(literal, value) {" 2848 CompileRun("function fastliteralcase(literal, value) {"
2856 " literal[0] = value;" 2849 " literal[0] = value;"
2857 " return literal;" 2850 " return literal;"
2858 "}" 2851 "}"
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
2910 AlwaysAllocateScope aa_scope; 2903 AlwaysAllocateScope aa_scope;
2911 v8::Script::Compile(mote_code_string)->Run(); 2904 v8::Script::Compile(mote_code_string)->Run();
2912 } 2905 }
2913 2906
2914 2907
2915 TEST(Regress168801) { 2908 TEST(Regress168801) {
2916 i::FLAG_always_compact = true; 2909 i::FLAG_always_compact = true;
2917 i::FLAG_cache_optimized_code = false; 2910 i::FLAG_cache_optimized_code = false;
2918 i::FLAG_allow_natives_syntax = true; 2911 i::FLAG_allow_natives_syntax = true;
2919 i::FLAG_flush_code_incrementally = true; 2912 i::FLAG_flush_code_incrementally = true;
2920 InitializeVM(); 2913 CcTest::InitializeVM();
2921 Isolate* isolate = Isolate::Current(); 2914 Isolate* isolate = Isolate::Current();
2922 Heap* heap = isolate->heap(); 2915 Heap* heap = isolate->heap();
2923 HandleScope scope(isolate); 2916 HandleScope scope(isolate);
2924 2917
2925 // Perform one initial GC to enable code flushing. 2918 // Perform one initial GC to enable code flushing.
2926 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); 2919 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
2927 2920
2928 // Ensure the code ends up on an evacuation candidate. 2921 // Ensure the code ends up on an evacuation candidate.
2929 SimulateFullSpace(heap->code_space()); 2922 SimulateFullSpace(heap->code_space());
2930 2923
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
2966 heap->CollectAllGarbage(Heap::kNoGCFlags); 2959 heap->CollectAllGarbage(Heap::kNoGCFlags);
2967 heap->CollectAllGarbage(Heap::kNoGCFlags); 2960 heap->CollectAllGarbage(Heap::kNoGCFlags);
2968 } 2961 }
2969 2962
2970 2963
2971 TEST(Regress173458) { 2964 TEST(Regress173458) {
2972 i::FLAG_always_compact = true; 2965 i::FLAG_always_compact = true;
2973 i::FLAG_cache_optimized_code = false; 2966 i::FLAG_cache_optimized_code = false;
2974 i::FLAG_allow_natives_syntax = true; 2967 i::FLAG_allow_natives_syntax = true;
2975 i::FLAG_flush_code_incrementally = true; 2968 i::FLAG_flush_code_incrementally = true;
2976 InitializeVM(); 2969 CcTest::InitializeVM();
2977 Isolate* isolate = Isolate::Current(); 2970 Isolate* isolate = Isolate::Current();
2978 Heap* heap = isolate->heap(); 2971 Heap* heap = isolate->heap();
2979 HandleScope scope(isolate); 2972 HandleScope scope(isolate);
2980 2973
2981 // Perform one initial GC to enable code flushing. 2974 // Perform one initial GC to enable code flushing.
2982 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); 2975 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask);
2983 2976
2984 // Ensure the code ends up on an evacuation candidate. 2977 // Ensure the code ends up on an evacuation candidate.
2985 SimulateFullSpace(heap->code_space()); 2978 SimulateFullSpace(heap->code_space());
2986 2979
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
3023 } 3016 }
3024 3017
3025 3018
3026 class DummyVisitor : public ObjectVisitor { 3019 class DummyVisitor : public ObjectVisitor {
3027 public: 3020 public:
3028 void VisitPointers(Object** start, Object** end) { } 3021 void VisitPointers(Object** start, Object** end) { }
3029 }; 3022 };
3030 3023
3031 3024
3032 TEST(DeferredHandles) { 3025 TEST(DeferredHandles) {
3033 InitializeVM(); 3026 CcTest::InitializeVM();
3034 Isolate* isolate = Isolate::Current(); 3027 Isolate* isolate = Isolate::Current();
3035 Heap* heap = isolate->heap(); 3028 Heap* heap = isolate->heap();
3036 v8::HandleScope scope; 3029 v8::HandleScope scope;
3037 v8::ImplementationUtilities::HandleScopeData* data = 3030 v8::ImplementationUtilities::HandleScopeData* data =
3038 isolate->handle_scope_data(); 3031 isolate->handle_scope_data();
3039 Handle<Object> init(heap->empty_string(), isolate); 3032 Handle<Object> init(heap->empty_string(), isolate);
3040 while (data->next < data->limit) { 3033 while (data->next < data->limit) {
3041 Handle<Object> obj(heap->empty_string(), isolate); 3034 Handle<Object> obj(heap->empty_string(), isolate);
3042 } 3035 }
3043 // An entire block of handles has been filled. 3036 // An entire block of handles has been filled.
3044 // Next handle would require a new block. 3037 // Next handle would require a new block.
3045 ASSERT(data->next == data->limit); 3038 ASSERT(data->next == data->limit);
3046 3039
3047 DeferredHandleScope deferred(isolate); 3040 DeferredHandleScope deferred(isolate);
3048 DummyVisitor visitor; 3041 DummyVisitor visitor;
3049 isolate->handle_scope_implementer()->Iterate(&visitor); 3042 isolate->handle_scope_implementer()->Iterate(&visitor);
3050 deferred.Detach(); 3043 deferred.Detach();
3051 } 3044 }
OLDNEW
« no previous file with comments | « test/cctest/test-func-name-inference.cc ('k') | test/cctest/test-log-stack-tracer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698