| OLD | NEW |
| 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 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 CHECK(map->IsHeapObject()); | 63 CHECK(map->IsHeapObject()); |
| 64 #ifdef DEBUG | 64 #ifdef DEBUG |
| 65 CHECK(CcTest::heap()->Contains(map)); | 65 CHECK(CcTest::heap()->Contains(map)); |
| 66 #endif | 66 #endif |
| 67 CHECK_EQ(CcTest::heap()->meta_map(), map->map()); | 67 CHECK_EQ(CcTest::heap()->meta_map(), map->map()); |
| 68 CHECK_EQ(type, map->instance_type()); | 68 CHECK_EQ(type, map->instance_type()); |
| 69 CHECK_EQ(instance_size, map->instance_size()); | 69 CHECK_EQ(instance_size, map->instance_size()); |
| 70 } | 70 } |
| 71 | 71 |
| 72 | 72 |
| 73 TEST(HeapMaps) { | 73 TEST_TRACK_ALLOCATIONS(HeapMaps) { |
| 74 CcTest::InitializeVM(); | 74 CcTest::InitializeVM(); |
| 75 Heap* heap = CcTest::heap(); | 75 Heap* heap = CcTest::heap(); |
| 76 CheckMap(heap->meta_map(), MAP_TYPE, Map::kSize); | 76 CheckMap(heap->meta_map(), MAP_TYPE, Map::kSize); |
| 77 CheckMap(heap->heap_number_map(), HEAP_NUMBER_TYPE, HeapNumber::kSize); | 77 CheckMap(heap->heap_number_map(), HEAP_NUMBER_TYPE, HeapNumber::kSize); |
| 78 CheckMap(heap->fixed_array_map(), FIXED_ARRAY_TYPE, kVariableSizeSentinel); | 78 CheckMap(heap->fixed_array_map(), FIXED_ARRAY_TYPE, kVariableSizeSentinel); |
| 79 CheckMap(heap->string_map(), STRING_TYPE, kVariableSizeSentinel); | 79 CheckMap(heap->string_map(), STRING_TYPE, kVariableSizeSentinel); |
| 80 } | 80 } |
| 81 | 81 |
| 82 | 82 |
| 83 static void CheckOddball(Isolate* isolate, Object* obj, const char* string) { | 83 static void CheckOddball(Isolate* isolate, Object* obj, const char* string) { |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 140 Code::ComputeFlags(Code::STUB), | 140 Code::ComputeFlags(Code::STUB), |
| 141 Handle<Code>())->ToObjectChecked(); | 141 Handle<Code>())->ToObjectChecked(); |
| 142 CHECK(copy->IsCode()); | 142 CHECK(copy->IsCode()); |
| 143 HeapObject* obj_copy = HeapObject::cast(copy); | 143 HeapObject* obj_copy = HeapObject::cast(copy); |
| 144 Object* not_right = isolate->FindCodeObject(obj_copy->address() + | 144 Object* not_right = isolate->FindCodeObject(obj_copy->address() + |
| 145 obj_copy->Size() / 2); | 145 obj_copy->Size() / 2); |
| 146 CHECK(not_right != code); | 146 CHECK(not_right != code); |
| 147 } | 147 } |
| 148 | 148 |
| 149 | 149 |
| 150 TEST(HeapObjects) { | 150 TEST_TRACK_ALLOCATIONS(HeapObjects) { |
| 151 CcTest::InitializeVM(); | 151 CcTest::InitializeVM(); |
| 152 Isolate* isolate = CcTest::i_isolate(); | 152 Isolate* isolate = CcTest::i_isolate(); |
| 153 Factory* factory = isolate->factory(); | 153 Factory* factory = isolate->factory(); |
| 154 Heap* heap = isolate->heap(); | 154 Heap* heap = isolate->heap(); |
| 155 | 155 |
| 156 HandleScope sc(isolate); | 156 HandleScope sc(isolate); |
| 157 Object* value = heap->NumberFromDouble(1.000123)->ToObjectChecked(); | 157 Object* value = heap->NumberFromDouble(1.000123)->ToObjectChecked(); |
| 158 CHECK(value->IsHeapNumber()); | 158 CHECK(value->IsHeapNumber()); |
| 159 CHECK(value->IsNumber()); | 159 CHECK(value->IsNumber()); |
| 160 CHECK_EQ(1.000123, value->Number()); | 160 CHECK_EQ(1.000123, value->Number()); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 225 CheckSmi(isolate, 42, "42"); | 225 CheckSmi(isolate, 42, "42"); |
| 226 CheckSmi(isolate, -42, "-42"); | 226 CheckSmi(isolate, -42, "-42"); |
| 227 | 227 |
| 228 // Check ToString for Numbers | 228 // Check ToString for Numbers |
| 229 CheckNumber(isolate, 1.1, "1.1"); | 229 CheckNumber(isolate, 1.1, "1.1"); |
| 230 | 230 |
| 231 CheckFindCodeObject(isolate); | 231 CheckFindCodeObject(isolate); |
| 232 } | 232 } |
| 233 | 233 |
| 234 | 234 |
| 235 TEST(Tagging) { | 235 TEST_TRACK_ALLOCATIONS(Tagging) { |
| 236 CcTest::InitializeVM(); | 236 CcTest::InitializeVM(); |
| 237 int request = 24; | 237 int request = 24; |
| 238 CHECK_EQ(request, static_cast<int>(OBJECT_POINTER_ALIGN(request))); | 238 CHECK_EQ(request, static_cast<int>(OBJECT_POINTER_ALIGN(request))); |
| 239 CHECK(Smi::FromInt(42)->IsSmi()); | 239 CHECK(Smi::FromInt(42)->IsSmi()); |
| 240 CHECK(Failure::RetryAfterGC(NEW_SPACE)->IsFailure()); | 240 CHECK(Failure::RetryAfterGC(NEW_SPACE)->IsFailure()); |
| 241 CHECK_EQ(NEW_SPACE, | 241 CHECK_EQ(NEW_SPACE, |
| 242 Failure::RetryAfterGC(NEW_SPACE)->allocation_space()); | 242 Failure::RetryAfterGC(NEW_SPACE)->allocation_space()); |
| 243 CHECK_EQ(OLD_POINTER_SPACE, | 243 CHECK_EQ(OLD_POINTER_SPACE, |
| 244 Failure::RetryAfterGC(OLD_POINTER_SPACE)->allocation_space()); | 244 Failure::RetryAfterGC(OLD_POINTER_SPACE)->allocation_space()); |
| 245 CHECK(Failure::Exception()->IsFailure()); | 245 CHECK(Failure::Exception()->IsFailure()); |
| 246 CHECK(Smi::FromInt(Smi::kMinValue)->IsSmi()); | 246 CHECK(Smi::FromInt(Smi::kMinValue)->IsSmi()); |
| 247 CHECK(Smi::FromInt(Smi::kMaxValue)->IsSmi()); | 247 CHECK(Smi::FromInt(Smi::kMaxValue)->IsSmi()); |
| 248 } | 248 } |
| 249 | 249 |
| 250 | 250 |
| 251 TEST(GarbageCollection) { | 251 TEST_TRACK_ALLOCATIONS(GarbageCollection) { |
| 252 CcTest::InitializeVM(); | 252 CcTest::InitializeVM(); |
| 253 Isolate* isolate = CcTest::i_isolate(); | 253 Isolate* isolate = CcTest::i_isolate(); |
| 254 Heap* heap = isolate->heap(); | 254 Heap* heap = isolate->heap(); |
| 255 Factory* factory = isolate->factory(); | 255 Factory* factory = isolate->factory(); |
| 256 | 256 |
| 257 HandleScope sc(isolate); | 257 HandleScope sc(isolate); |
| 258 // Check GC. | 258 // Check GC. |
| 259 heap->CollectGarbage(NEW_SPACE); | 259 heap->CollectGarbage(NEW_SPACE); |
| 260 | 260 |
| 261 Handle<GlobalObject> global(CcTest::i_isolate()->context()->global_object()); | 261 Handle<GlobalObject> global(CcTest::i_isolate()->context()->global_object()); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 318 static void VerifyStringAllocation(Isolate* isolate, const char* string) { | 318 static void VerifyStringAllocation(Isolate* isolate, const char* string) { |
| 319 HandleScope scope(isolate); | 319 HandleScope scope(isolate); |
| 320 Handle<String> s = isolate->factory()->NewStringFromUtf8(CStrVector(string)); | 320 Handle<String> s = isolate->factory()->NewStringFromUtf8(CStrVector(string)); |
| 321 CHECK_EQ(StrLength(string), s->length()); | 321 CHECK_EQ(StrLength(string), s->length()); |
| 322 for (int index = 0; index < s->length(); index++) { | 322 for (int index = 0; index < s->length(); index++) { |
| 323 CHECK_EQ(static_cast<uint16_t>(string[index]), s->Get(index)); | 323 CHECK_EQ(static_cast<uint16_t>(string[index]), s->Get(index)); |
| 324 } | 324 } |
| 325 } | 325 } |
| 326 | 326 |
| 327 | 327 |
| 328 TEST(String) { | 328 TEST_TRACK_ALLOCATIONS(String) { |
| 329 CcTest::InitializeVM(); | 329 CcTest::InitializeVM(); |
| 330 Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate()); | 330 Isolate* isolate = reinterpret_cast<Isolate*>(CcTest::isolate()); |
| 331 | 331 |
| 332 VerifyStringAllocation(isolate, "a"); | 332 VerifyStringAllocation(isolate, "a"); |
| 333 VerifyStringAllocation(isolate, "ab"); | 333 VerifyStringAllocation(isolate, "ab"); |
| 334 VerifyStringAllocation(isolate, "abc"); | 334 VerifyStringAllocation(isolate, "abc"); |
| 335 VerifyStringAllocation(isolate, "abcd"); | 335 VerifyStringAllocation(isolate, "abcd"); |
| 336 VerifyStringAllocation(isolate, "fiskerdrengen er paa havet"); | 336 VerifyStringAllocation(isolate, "fiskerdrengen er paa havet"); |
| 337 } | 337 } |
| 338 | 338 |
| 339 | 339 |
| 340 TEST(LocalHandles) { | 340 TEST_TRACK_ALLOCATIONS(LocalHandles) { |
| 341 CcTest::InitializeVM(); | 341 CcTest::InitializeVM(); |
| 342 Isolate* isolate = CcTest::i_isolate(); | 342 Isolate* isolate = CcTest::i_isolate(); |
| 343 Factory* factory = isolate->factory(); | 343 Factory* factory = isolate->factory(); |
| 344 | 344 |
| 345 v8::HandleScope scope(CcTest::isolate()); | 345 v8::HandleScope scope(CcTest::isolate()); |
| 346 const char* name = "Kasper the spunky"; | 346 const char* name = "Kasper the spunky"; |
| 347 Handle<String> string = factory->NewStringFromAscii(CStrVector(name)); | 347 Handle<String> string = factory->NewStringFromAscii(CStrVector(name)); |
| 348 CHECK_EQ(StrLength(name), string->length()); | 348 CHECK_EQ(StrLength(name), string->length()); |
| 349 } | 349 } |
| 350 | 350 |
| 351 | 351 |
| 352 TEST(GlobalHandles) { | 352 TEST_TRACK_ALLOCATIONS(GlobalHandles) { |
| 353 CcTest::InitializeVM(); | 353 CcTest::InitializeVM(); |
| 354 Isolate* isolate = CcTest::i_isolate(); | 354 Isolate* isolate = CcTest::i_isolate(); |
| 355 Heap* heap = isolate->heap(); | 355 Heap* heap = isolate->heap(); |
| 356 Factory* factory = isolate->factory(); | 356 Factory* factory = isolate->factory(); |
| 357 GlobalHandles* global_handles = isolate->global_handles(); | 357 GlobalHandles* global_handles = isolate->global_handles(); |
| 358 | 358 |
| 359 Handle<Object> h1; | 359 Handle<Object> h1; |
| 360 Handle<Object> h2; | 360 Handle<Object> h2; |
| 361 Handle<Object> h3; | 361 Handle<Object> h3; |
| 362 Handle<Object> h4; | 362 Handle<Object> h4; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 394 static bool WeakPointerCleared = false; | 394 static bool WeakPointerCleared = false; |
| 395 | 395 |
| 396 static void TestWeakGlobalHandleCallback(v8::Isolate* isolate, | 396 static void TestWeakGlobalHandleCallback(v8::Isolate* isolate, |
| 397 v8::Persistent<v8::Value>* handle, | 397 v8::Persistent<v8::Value>* handle, |
| 398 void* id) { | 398 void* id) { |
| 399 if (1234 == reinterpret_cast<intptr_t>(id)) WeakPointerCleared = true; | 399 if (1234 == reinterpret_cast<intptr_t>(id)) WeakPointerCleared = true; |
| 400 handle->Dispose(); | 400 handle->Dispose(); |
| 401 } | 401 } |
| 402 | 402 |
| 403 | 403 |
| 404 TEST(WeakGlobalHandlesScavenge) { | 404 TEST_TRACK_ALLOCATIONS(WeakGlobalHandlesScavenge) { |
| 405 i::FLAG_stress_compaction = false; | 405 i::FLAG_stress_compaction = false; |
| 406 CcTest::InitializeVM(); | 406 CcTest::InitializeVM(); |
| 407 Isolate* isolate = CcTest::i_isolate(); | 407 Isolate* isolate = CcTest::i_isolate(); |
| 408 Heap* heap = isolate->heap(); | 408 Heap* heap = isolate->heap(); |
| 409 Factory* factory = isolate->factory(); | 409 Factory* factory = isolate->factory(); |
| 410 GlobalHandles* global_handles = isolate->global_handles(); | 410 GlobalHandles* global_handles = isolate->global_handles(); |
| 411 | 411 |
| 412 WeakPointerCleared = false; | 412 WeakPointerCleared = false; |
| 413 | 413 |
| 414 Handle<Object> h1; | 414 Handle<Object> h1; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 436 | 436 |
| 437 CHECK(!WeakPointerCleared); | 437 CHECK(!WeakPointerCleared); |
| 438 CHECK(!global_handles->IsNearDeath(h2.location())); | 438 CHECK(!global_handles->IsNearDeath(h2.location())); |
| 439 CHECK(!global_handles->IsNearDeath(h1.location())); | 439 CHECK(!global_handles->IsNearDeath(h1.location())); |
| 440 | 440 |
| 441 global_handles->Destroy(h1.location()); | 441 global_handles->Destroy(h1.location()); |
| 442 global_handles->Destroy(h2.location()); | 442 global_handles->Destroy(h2.location()); |
| 443 } | 443 } |
| 444 | 444 |
| 445 | 445 |
| 446 TEST(WeakGlobalHandlesMark) { | 446 TEST_TRACK_ALLOCATIONS(WeakGlobalHandlesMark) { |
| 447 CcTest::InitializeVM(); | 447 CcTest::InitializeVM(); |
| 448 Isolate* isolate = CcTest::i_isolate(); | 448 Isolate* isolate = CcTest::i_isolate(); |
| 449 Heap* heap = isolate->heap(); | 449 Heap* heap = isolate->heap(); |
| 450 Factory* factory = isolate->factory(); | 450 Factory* factory = isolate->factory(); |
| 451 GlobalHandles* global_handles = isolate->global_handles(); | 451 GlobalHandles* global_handles = isolate->global_handles(); |
| 452 | 452 |
| 453 WeakPointerCleared = false; | 453 WeakPointerCleared = false; |
| 454 | 454 |
| 455 Handle<Object> h1; | 455 Handle<Object> h1; |
| 456 Handle<Object> h2; | 456 Handle<Object> h2; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 481 | 481 |
| 482 CHECK((*h1)->IsString()); | 482 CHECK((*h1)->IsString()); |
| 483 | 483 |
| 484 CHECK(WeakPointerCleared); | 484 CHECK(WeakPointerCleared); |
| 485 CHECK(!GlobalHandles::IsNearDeath(h1.location())); | 485 CHECK(!GlobalHandles::IsNearDeath(h1.location())); |
| 486 | 486 |
| 487 global_handles->Destroy(h1.location()); | 487 global_handles->Destroy(h1.location()); |
| 488 } | 488 } |
| 489 | 489 |
| 490 | 490 |
| 491 TEST(DeleteWeakGlobalHandle) { | 491 TEST_TRACK_ALLOCATIONS(DeleteWeakGlobalHandle) { |
| 492 i::FLAG_stress_compaction = false; | 492 i::FLAG_stress_compaction = false; |
| 493 CcTest::InitializeVM(); | 493 CcTest::InitializeVM(); |
| 494 Isolate* isolate = CcTest::i_isolate(); | 494 Isolate* isolate = CcTest::i_isolate(); |
| 495 Heap* heap = isolate->heap(); | 495 Heap* heap = isolate->heap(); |
| 496 Factory* factory = isolate->factory(); | 496 Factory* factory = isolate->factory(); |
| 497 GlobalHandles* global_handles = isolate->global_handles(); | 497 GlobalHandles* global_handles = isolate->global_handles(); |
| 498 | 498 |
| 499 WeakPointerCleared = false; | 499 WeakPointerCleared = false; |
| 500 | 500 |
| 501 Handle<Object> h; | 501 Handle<Object> h; |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 596 CHECK(a->IsInternalizedString()); | 596 CHECK(a->IsInternalizedString()); |
| 597 Object* b; | 597 Object* b; |
| 598 MaybeObject* maybe_b = CcTest::heap()->InternalizeUtf8String(string); | 598 MaybeObject* maybe_b = CcTest::heap()->InternalizeUtf8String(string); |
| 599 if (!maybe_b->ToObject(&b)) continue; | 599 if (!maybe_b->ToObject(&b)) continue; |
| 600 CHECK_EQ(b, a); | 600 CHECK_EQ(b, a); |
| 601 CHECK(String::cast(b)->IsUtf8EqualTo(CStrVector(string))); | 601 CHECK(String::cast(b)->IsUtf8EqualTo(CStrVector(string))); |
| 602 } | 602 } |
| 603 } | 603 } |
| 604 | 604 |
| 605 | 605 |
| 606 TEST(StringTable) { | 606 TEST_TRACK_ALLOCATIONS(StringTable) { |
| 607 CcTest::InitializeVM(); | 607 CcTest::InitializeVM(); |
| 608 | 608 |
| 609 CheckInternalizedStrings(not_so_random_string_table); | 609 CheckInternalizedStrings(not_so_random_string_table); |
| 610 CheckInternalizedStrings(not_so_random_string_table); | 610 CheckInternalizedStrings(not_so_random_string_table); |
| 611 } | 611 } |
| 612 | 612 |
| 613 | 613 |
| 614 TEST(FunctionAllocation) { | 614 TEST_TRACK_ALLOCATIONS(FunctionAllocation) { |
| 615 CcTest::InitializeVM(); | 615 CcTest::InitializeVM(); |
| 616 Isolate* isolate = CcTest::i_isolate(); | 616 Isolate* isolate = CcTest::i_isolate(); |
| 617 Factory* factory = isolate->factory(); | 617 Factory* factory = isolate->factory(); |
| 618 | 618 |
| 619 v8::HandleScope sc(CcTest::isolate()); | 619 v8::HandleScope sc(CcTest::isolate()); |
| 620 Handle<String> name = factory->InternalizeUtf8String("theFunction"); | 620 Handle<String> name = factory->InternalizeUtf8String("theFunction"); |
| 621 Handle<JSFunction> function = | 621 Handle<JSFunction> function = |
| 622 factory->NewFunction(name, factory->undefined_value()); | 622 factory->NewFunction(name, factory->undefined_value()); |
| 623 Handle<Map> initial_map = | 623 Handle<Map> initial_map = |
| 624 factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); | 624 factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); |
| 625 function->set_initial_map(*initial_map); | 625 function->set_initial_map(*initial_map); |
| 626 | 626 |
| 627 Handle<Smi> twenty_three(Smi::FromInt(23), isolate); | 627 Handle<Smi> twenty_three(Smi::FromInt(23), isolate); |
| 628 Handle<Smi> twenty_four(Smi::FromInt(24), isolate); | 628 Handle<Smi> twenty_four(Smi::FromInt(24), isolate); |
| 629 | 629 |
| 630 Handle<String> prop_name = factory->InternalizeUtf8String("theSlot"); | 630 Handle<String> prop_name = factory->InternalizeUtf8String("theSlot"); |
| 631 Handle<JSObject> obj = factory->NewJSObject(function); | 631 Handle<JSObject> obj = factory->NewJSObject(function); |
| 632 JSReceiver::SetProperty(obj, prop_name, twenty_three, NONE, kNonStrictMode); | 632 JSReceiver::SetProperty(obj, prop_name, twenty_three, NONE, kNonStrictMode); |
| 633 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); | 633 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); |
| 634 // Check that we can add properties to function objects. | 634 // Check that we can add properties to function objects. |
| 635 JSReceiver::SetProperty(function, prop_name, twenty_four, NONE, | 635 JSReceiver::SetProperty(function, prop_name, twenty_four, NONE, |
| 636 kNonStrictMode); | 636 kNonStrictMode); |
| 637 CHECK_EQ(Smi::FromInt(24), function->GetProperty(*prop_name)); | 637 CHECK_EQ(Smi::FromInt(24), function->GetProperty(*prop_name)); |
| 638 } | 638 } |
| 639 | 639 |
| 640 | 640 |
| 641 TEST(ObjectProperties) { | 641 TEST_TRACK_ALLOCATIONS(ObjectProperties) { |
| 642 CcTest::InitializeVM(); | 642 CcTest::InitializeVM(); |
| 643 Isolate* isolate = CcTest::i_isolate(); | 643 Isolate* isolate = CcTest::i_isolate(); |
| 644 Factory* factory = isolate->factory(); | 644 Factory* factory = isolate->factory(); |
| 645 | 645 |
| 646 v8::HandleScope sc(CcTest::isolate()); | 646 v8::HandleScope sc(CcTest::isolate()); |
| 647 String* object_string = String::cast(CcTest::heap()->Object_string()); | 647 String* object_string = String::cast(CcTest::heap()->Object_string()); |
| 648 Object* raw_object = CcTest::i_isolate()->context()->global_object()-> | 648 Object* raw_object = CcTest::i_isolate()->context()->global_object()-> |
| 649 GetProperty(object_string)->ToObjectChecked(); | 649 GetProperty(object_string)->ToObjectChecked(); |
| 650 JSFunction* object_function = JSFunction::cast(raw_object); | 650 JSFunction* object_function = JSFunction::cast(raw_object); |
| 651 Handle<JSFunction> constructor(object_function); | 651 Handle<JSFunction> constructor(object_function); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 702 | 702 |
| 703 // check internalized string and string match | 703 // check internalized string and string match |
| 704 const char* string2 = "fugl"; | 704 const char* string2 = "fugl"; |
| 705 Handle<String> s2_string = factory->InternalizeUtf8String(string2); | 705 Handle<String> s2_string = factory->InternalizeUtf8String(string2); |
| 706 JSReceiver::SetProperty(obj, s2_string, one, NONE, kNonStrictMode); | 706 JSReceiver::SetProperty(obj, s2_string, one, NONE, kNonStrictMode); |
| 707 Handle<String> s2 = factory->NewStringFromAscii(CStrVector(string2)); | 707 Handle<String> s2 = factory->NewStringFromAscii(CStrVector(string2)); |
| 708 CHECK(JSReceiver::HasLocalProperty(obj, s2)); | 708 CHECK(JSReceiver::HasLocalProperty(obj, s2)); |
| 709 } | 709 } |
| 710 | 710 |
| 711 | 711 |
| 712 TEST(JSObjectMaps) { | 712 TEST_TRACK_ALLOCATIONS(JSObjectMaps) { |
| 713 CcTest::InitializeVM(); | 713 CcTest::InitializeVM(); |
| 714 Isolate* isolate = CcTest::i_isolate(); | 714 Isolate* isolate = CcTest::i_isolate(); |
| 715 Factory* factory = isolate->factory(); | 715 Factory* factory = isolate->factory(); |
| 716 | 716 |
| 717 v8::HandleScope sc(CcTest::isolate()); | 717 v8::HandleScope sc(CcTest::isolate()); |
| 718 Handle<String> name = factory->InternalizeUtf8String("theFunction"); | 718 Handle<String> name = factory->InternalizeUtf8String("theFunction"); |
| 719 Handle<JSFunction> function = | 719 Handle<JSFunction> function = |
| 720 factory->NewFunction(name, factory->undefined_value()); | 720 factory->NewFunction(name, factory->undefined_value()); |
| 721 Handle<Map> initial_map = | 721 Handle<Map> initial_map = |
| 722 factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); | 722 factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); |
| 723 function->set_initial_map(*initial_map); | 723 function->set_initial_map(*initial_map); |
| 724 | 724 |
| 725 Handle<String> prop_name = factory->InternalizeUtf8String("theSlot"); | 725 Handle<String> prop_name = factory->InternalizeUtf8String("theSlot"); |
| 726 Handle<JSObject> obj = factory->NewJSObject(function); | 726 Handle<JSObject> obj = factory->NewJSObject(function); |
| 727 | 727 |
| 728 // Set a propery | 728 // Set a propery |
| 729 Handle<Smi> twenty_three(Smi::FromInt(23), isolate); | 729 Handle<Smi> twenty_three(Smi::FromInt(23), isolate); |
| 730 JSReceiver::SetProperty(obj, prop_name, twenty_three, NONE, kNonStrictMode); | 730 JSReceiver::SetProperty(obj, prop_name, twenty_three, NONE, kNonStrictMode); |
| 731 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); | 731 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); |
| 732 | 732 |
| 733 // Check the map has changed | 733 // Check the map has changed |
| 734 CHECK(*initial_map != obj->map()); | 734 CHECK(*initial_map != obj->map()); |
| 735 } | 735 } |
| 736 | 736 |
| 737 | 737 |
| 738 TEST(JSArray) { | 738 TEST_TRACK_ALLOCATIONS(JSArray) { |
| 739 CcTest::InitializeVM(); | 739 CcTest::InitializeVM(); |
| 740 Isolate* isolate = CcTest::i_isolate(); | 740 Isolate* isolate = CcTest::i_isolate(); |
| 741 Factory* factory = isolate->factory(); | 741 Factory* factory = isolate->factory(); |
| 742 | 742 |
| 743 v8::HandleScope sc(CcTest::isolate()); | 743 v8::HandleScope sc(CcTest::isolate()); |
| 744 Handle<String> name = factory->InternalizeUtf8String("Array"); | 744 Handle<String> name = factory->InternalizeUtf8String("Array"); |
| 745 Object* raw_object = CcTest::i_isolate()->context()->global_object()-> | 745 Object* raw_object = CcTest::i_isolate()->context()->global_object()-> |
| 746 GetProperty(*name)->ToObjectChecked(); | 746 GetProperty(*name)->ToObjectChecked(); |
| 747 Handle<JSFunction> function = Handle<JSFunction>( | 747 Handle<JSFunction> function = Handle<JSFunction>( |
| 748 JSFunction::cast(raw_object)); | 748 JSFunction::cast(raw_object)); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 777 // array[length] = name. | 777 // array[length] = name. |
| 778 array->SetElement(int_length, *name, NONE, kNonStrictMode)->ToObjectChecked(); | 778 array->SetElement(int_length, *name, NONE, kNonStrictMode)->ToObjectChecked(); |
| 779 uint32_t new_int_length = 0; | 779 uint32_t new_int_length = 0; |
| 780 CHECK(array->length()->ToArrayIndex(&new_int_length)); | 780 CHECK(array->length()->ToArrayIndex(&new_int_length)); |
| 781 CHECK_EQ(static_cast<double>(int_length), new_int_length - 1); | 781 CHECK_EQ(static_cast<double>(int_length), new_int_length - 1); |
| 782 CHECK_EQ(array->GetElement(isolate, int_length), *name); | 782 CHECK_EQ(array->GetElement(isolate, int_length), *name); |
| 783 CHECK_EQ(array->GetElement(isolate, 0), *name); | 783 CHECK_EQ(array->GetElement(isolate, 0), *name); |
| 784 } | 784 } |
| 785 | 785 |
| 786 | 786 |
| 787 TEST(JSObjectCopy) { | 787 TEST_TRACK_ALLOCATIONS(JSObjectCopy) { |
| 788 CcTest::InitializeVM(); | 788 CcTest::InitializeVM(); |
| 789 Isolate* isolate = CcTest::i_isolate(); | 789 Isolate* isolate = CcTest::i_isolate(); |
| 790 Factory* factory = isolate->factory(); | 790 Factory* factory = isolate->factory(); |
| 791 | 791 |
| 792 v8::HandleScope sc(CcTest::isolate()); | 792 v8::HandleScope sc(CcTest::isolate()); |
| 793 String* object_string = String::cast(CcTest::heap()->Object_string()); | 793 String* object_string = String::cast(CcTest::heap()->Object_string()); |
| 794 Object* raw_object = CcTest::i_isolate()->context()->global_object()-> | 794 Object* raw_object = CcTest::i_isolate()->context()->global_object()-> |
| 795 GetProperty(object_string)->ToObjectChecked(); | 795 GetProperty(object_string)->ToObjectChecked(); |
| 796 JSFunction* object_function = JSFunction::cast(raw_object); | 796 JSFunction* object_function = JSFunction::cast(raw_object); |
| 797 Handle<JSFunction> constructor(object_function); | 797 Handle<JSFunction> constructor(object_function); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 826 clone->SetElement(1, *first, NONE, kNonStrictMode)->ToObjectChecked(); | 826 clone->SetElement(1, *first, NONE, kNonStrictMode)->ToObjectChecked(); |
| 827 | 827 |
| 828 CHECK_EQ(obj->GetElement(isolate, 1), clone->GetElement(isolate, 0)); | 828 CHECK_EQ(obj->GetElement(isolate, 1), clone->GetElement(isolate, 0)); |
| 829 CHECK_EQ(obj->GetElement(isolate, 0), clone->GetElement(isolate, 1)); | 829 CHECK_EQ(obj->GetElement(isolate, 0), clone->GetElement(isolate, 1)); |
| 830 | 830 |
| 831 CHECK_EQ(obj->GetProperty(*second), clone->GetProperty(*first)); | 831 CHECK_EQ(obj->GetProperty(*second), clone->GetProperty(*first)); |
| 832 CHECK_EQ(obj->GetProperty(*first), clone->GetProperty(*second)); | 832 CHECK_EQ(obj->GetProperty(*first), clone->GetProperty(*second)); |
| 833 } | 833 } |
| 834 | 834 |
| 835 | 835 |
| 836 TEST(StringAllocation) { | 836 TEST_TRACK_ALLOCATIONS(StringAllocation) { |
| 837 CcTest::InitializeVM(); | 837 CcTest::InitializeVM(); |
| 838 Isolate* isolate = CcTest::i_isolate(); | 838 Isolate* isolate = CcTest::i_isolate(); |
| 839 Factory* factory = isolate->factory(); | 839 Factory* factory = isolate->factory(); |
| 840 | 840 |
| 841 const unsigned char chars[] = { 0xe5, 0xa4, 0xa7 }; | 841 const unsigned char chars[] = { 0xe5, 0xa4, 0xa7 }; |
| 842 for (int length = 0; length < 100; length++) { | 842 for (int length = 0; length < 100; length++) { |
| 843 v8::HandleScope scope(CcTest::isolate()); | 843 v8::HandleScope scope(CcTest::isolate()); |
| 844 char* non_ascii = NewArray<char>(3 * length + 1); | 844 char* non_ascii = NewArray<char>(3 * length + 1); |
| 845 char* ascii = NewArray<char>(length + 1); | 845 char* ascii = NewArray<char>(length + 1); |
| 846 non_ascii[3 * length] = 0; | 846 non_ascii[3 * length] = 0; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 881 for (int i = 0; i < size; i++) { | 881 for (int i = 0; i < size; i++) { |
| 882 if (*objs[i] == obj) { | 882 if (*objs[i] == obj) { |
| 883 found_count++; | 883 found_count++; |
| 884 } | 884 } |
| 885 } | 885 } |
| 886 } | 886 } |
| 887 return found_count; | 887 return found_count; |
| 888 } | 888 } |
| 889 | 889 |
| 890 | 890 |
| 891 TEST(Iteration) { | 891 TEST_TRACK_ALLOCATIONS(Iteration) { |
| 892 CcTest::InitializeVM(); | 892 CcTest::InitializeVM(); |
| 893 Isolate* isolate = CcTest::i_isolate(); | 893 Isolate* isolate = CcTest::i_isolate(); |
| 894 Factory* factory = isolate->factory(); | 894 Factory* factory = isolate->factory(); |
| 895 v8::HandleScope scope(CcTest::isolate()); | 895 v8::HandleScope scope(CcTest::isolate()); |
| 896 | 896 |
| 897 // Array of objects to scan haep for. | 897 // Array of objects to scan haep for. |
| 898 const int objs_count = 6; | 898 const int objs_count = 6; |
| 899 Handle<Object> objs[objs_count]; | 899 Handle<Object> objs[objs_count]; |
| 900 int next_objs_index = 0; | 900 int next_objs_index = 0; |
| 901 | 901 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 921 delete[] str; | 921 delete[] str; |
| 922 | 922 |
| 923 // Add a Map object to look for. | 923 // Add a Map object to look for. |
| 924 objs[next_objs_index++] = Handle<Map>(HeapObject::cast(*objs[0])->map()); | 924 objs[next_objs_index++] = Handle<Map>(HeapObject::cast(*objs[0])->map()); |
| 925 | 925 |
| 926 CHECK_EQ(objs_count, next_objs_index); | 926 CHECK_EQ(objs_count, next_objs_index); |
| 927 CHECK_EQ(objs_count, ObjectsFoundInHeap(CcTest::heap(), objs, objs_count)); | 927 CHECK_EQ(objs_count, ObjectsFoundInHeap(CcTest::heap(), objs, objs_count)); |
| 928 } | 928 } |
| 929 | 929 |
| 930 | 930 |
| 931 TEST(EmptyHandleEscapeFrom) { | 931 TEST_TRACK_ALLOCATIONS(EmptyHandleEscapeFrom) { |
| 932 CcTest::InitializeVM(); | 932 CcTest::InitializeVM(); |
| 933 | 933 |
| 934 v8::HandleScope scope(CcTest::isolate()); | 934 v8::HandleScope scope(CcTest::isolate()); |
| 935 Handle<JSObject> runaway; | 935 Handle<JSObject> runaway; |
| 936 | 936 |
| 937 { | 937 { |
| 938 v8::HandleScope nested(CcTest::isolate()); | 938 v8::HandleScope nested(CcTest::isolate()); |
| 939 Handle<JSObject> empty; | 939 Handle<JSObject> empty; |
| 940 runaway = empty.EscapeFrom(&nested); | 940 runaway = empty.EscapeFrom(&nested); |
| 941 } | 941 } |
| 942 | 942 |
| 943 CHECK(runaway.is_null()); | 943 CHECK(runaway.is_null()); |
| 944 } | 944 } |
| 945 | 945 |
| 946 | 946 |
| 947 static int LenFromSize(int size) { | 947 static int LenFromSize(int size) { |
| 948 return (size - FixedArray::kHeaderSize) / kPointerSize; | 948 return (size - FixedArray::kHeaderSize) / kPointerSize; |
| 949 } | 949 } |
| 950 | 950 |
| 951 | 951 |
| 952 TEST(Regression39128) { | 952 TEST_TRACK_ALLOCATIONS(Regression39128) { |
| 953 // Test case for crbug.com/39128. | 953 // Test case for crbug.com/39128. |
| 954 CcTest::InitializeVM(); | 954 CcTest::InitializeVM(); |
| 955 Isolate* isolate = CcTest::i_isolate(); | 955 Isolate* isolate = CcTest::i_isolate(); |
| 956 Factory* factory = isolate->factory(); | 956 Factory* factory = isolate->factory(); |
| 957 Heap* heap = isolate->heap(); | 957 Heap* heap = isolate->heap(); |
| 958 | 958 |
| 959 // Increase the chance of 'bump-the-pointer' allocation in old space. | 959 // Increase the chance of 'bump-the-pointer' allocation in old space. |
| 960 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); | 960 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 961 | 961 |
| 962 v8::HandleScope scope(CcTest::isolate()); | 962 v8::HandleScope scope(CcTest::isolate()); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1020 Object* clone_obj = heap->CopyJSObject(jsobject)->ToObjectChecked(); | 1020 Object* clone_obj = heap->CopyJSObject(jsobject)->ToObjectChecked(); |
| 1021 JSObject* clone = JSObject::cast(clone_obj); | 1021 JSObject* clone = JSObject::cast(clone_obj); |
| 1022 if (clone->address() != old_pointer_space_top) { | 1022 if (clone->address() != old_pointer_space_top) { |
| 1023 // Alas, got allocated from free list, we cannot do checks. | 1023 // Alas, got allocated from free list, we cannot do checks. |
| 1024 return; | 1024 return; |
| 1025 } | 1025 } |
| 1026 CHECK(heap->old_pointer_space()->Contains(clone->address())); | 1026 CHECK(heap->old_pointer_space()->Contains(clone->address())); |
| 1027 } | 1027 } |
| 1028 | 1028 |
| 1029 | 1029 |
| 1030 TEST(TestCodeFlushing) { | 1030 TEST_TRACK_ALLOCATIONS(TestCodeFlushing) { |
| 1031 // If we do not flush code this test is invalid. | 1031 // If we do not flush code this test is invalid. |
| 1032 if (!FLAG_flush_code) return; | 1032 if (!FLAG_flush_code) return; |
| 1033 i::FLAG_allow_natives_syntax = true; | 1033 i::FLAG_allow_natives_syntax = true; |
| 1034 CcTest::InitializeVM(); | 1034 CcTest::InitializeVM(); |
| 1035 Isolate* isolate = CcTest::i_isolate(); | 1035 Isolate* isolate = CcTest::i_isolate(); |
| 1036 Factory* factory = isolate->factory(); | 1036 Factory* factory = isolate->factory(); |
| 1037 v8::HandleScope scope(CcTest::isolate()); | 1037 v8::HandleScope scope(CcTest::isolate()); |
| 1038 const char* source = "function foo() {" | 1038 const char* source = "function foo() {" |
| 1039 " var x = 42;" | 1039 " var x = 42;" |
| 1040 " var y = 42;" | 1040 " var y = 42;" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1069 // foo should no longer be in the compilation cache | 1069 // foo should no longer be in the compilation cache |
| 1070 CHECK(!function->shared()->is_compiled() || function->IsOptimized()); | 1070 CHECK(!function->shared()->is_compiled() || function->IsOptimized()); |
| 1071 CHECK(!function->is_compiled() || function->IsOptimized()); | 1071 CHECK(!function->is_compiled() || function->IsOptimized()); |
| 1072 // Call foo to get it recompiled. | 1072 // Call foo to get it recompiled. |
| 1073 CompileRun("foo()"); | 1073 CompileRun("foo()"); |
| 1074 CHECK(function->shared()->is_compiled()); | 1074 CHECK(function->shared()->is_compiled()); |
| 1075 CHECK(function->is_compiled()); | 1075 CHECK(function->is_compiled()); |
| 1076 } | 1076 } |
| 1077 | 1077 |
| 1078 | 1078 |
| 1079 TEST(TestCodeFlushingIncremental) { | 1079 TEST_TRACK_ALLOCATIONS(TestCodeFlushingIncremental) { |
| 1080 // If we do not flush code this test is invalid. | 1080 // If we do not flush code this test is invalid. |
| 1081 if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return; | 1081 if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return; |
| 1082 i::FLAG_allow_natives_syntax = true; | 1082 i::FLAG_allow_natives_syntax = true; |
| 1083 CcTest::InitializeVM(); | 1083 CcTest::InitializeVM(); |
| 1084 Isolate* isolate = CcTest::i_isolate(); | 1084 Isolate* isolate = CcTest::i_isolate(); |
| 1085 Factory* factory = isolate->factory(); | 1085 Factory* factory = isolate->factory(); |
| 1086 v8::HandleScope scope(CcTest::isolate()); | 1086 v8::HandleScope scope(CcTest::isolate()); |
| 1087 const char* source = "function foo() {" | 1087 const char* source = "function foo() {" |
| 1088 " var x = 42;" | 1088 " var x = 42;" |
| 1089 " var y = 42;" | 1089 " var y = 42;" |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1137 CompileRun("%OptimizeFunctionOnNextCall(foo); foo();"); | 1137 CompileRun("%OptimizeFunctionOnNextCall(foo); foo();"); |
| 1138 } | 1138 } |
| 1139 | 1139 |
| 1140 // Simulate one final GC to make sure the candidate queue is sane. | 1140 // Simulate one final GC to make sure the candidate queue is sane. |
| 1141 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); | 1141 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); |
| 1142 CHECK(function->shared()->is_compiled() || !function->IsOptimized()); | 1142 CHECK(function->shared()->is_compiled() || !function->IsOptimized()); |
| 1143 CHECK(function->is_compiled() || !function->IsOptimized()); | 1143 CHECK(function->is_compiled() || !function->IsOptimized()); |
| 1144 } | 1144 } |
| 1145 | 1145 |
| 1146 | 1146 |
| 1147 TEST(TestCodeFlushingIncrementalScavenge) { | 1147 TEST_TRACK_ALLOCATIONS(TestCodeFlushingIncrementalScavenge) { |
| 1148 // If we do not flush code this test is invalid. | 1148 // If we do not flush code this test is invalid. |
| 1149 if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return; | 1149 if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return; |
| 1150 i::FLAG_allow_natives_syntax = true; | 1150 i::FLAG_allow_natives_syntax = true; |
| 1151 CcTest::InitializeVM(); | 1151 CcTest::InitializeVM(); |
| 1152 Isolate* isolate = CcTest::i_isolate(); | 1152 Isolate* isolate = CcTest::i_isolate(); |
| 1153 Factory* factory = isolate->factory(); | 1153 Factory* factory = isolate->factory(); |
| 1154 v8::HandleScope scope(CcTest::isolate()); | 1154 v8::HandleScope scope(CcTest::isolate()); |
| 1155 const char* source = "var foo = function() {" | 1155 const char* source = "var foo = function() {" |
| 1156 " var x = 42;" | 1156 " var x = 42;" |
| 1157 " var y = 42;" | 1157 " var y = 42;" |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1205 *function2.location() = NULL; | 1205 *function2.location() = NULL; |
| 1206 CcTest::heap()->CollectGarbage(NEW_SPACE, "test scavenge while marking"); | 1206 CcTest::heap()->CollectGarbage(NEW_SPACE, "test scavenge while marking"); |
| 1207 | 1207 |
| 1208 // Simulate one final GC to make sure the candidate queue is sane. | 1208 // Simulate one final GC to make sure the candidate queue is sane. |
| 1209 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); | 1209 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); |
| 1210 CHECK(!function->shared()->is_compiled() || function->IsOptimized()); | 1210 CHECK(!function->shared()->is_compiled() || function->IsOptimized()); |
| 1211 CHECK(!function->is_compiled() || function->IsOptimized()); | 1211 CHECK(!function->is_compiled() || function->IsOptimized()); |
| 1212 } | 1212 } |
| 1213 | 1213 |
| 1214 | 1214 |
| 1215 TEST(TestCodeFlushingIncrementalAbort) { | 1215 TEST_TRACK_ALLOCATIONS(TestCodeFlushingIncrementalAbort) { |
| 1216 // If we do not flush code this test is invalid. | 1216 // If we do not flush code this test is invalid. |
| 1217 if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return; | 1217 if (!FLAG_flush_code || !FLAG_flush_code_incrementally) return; |
| 1218 i::FLAG_allow_natives_syntax = true; | 1218 i::FLAG_allow_natives_syntax = true; |
| 1219 CcTest::InitializeVM(); | 1219 CcTest::InitializeVM(); |
| 1220 Isolate* isolate = CcTest::i_isolate(); | 1220 Isolate* isolate = CcTest::i_isolate(); |
| 1221 Factory* factory = isolate->factory(); | 1221 Factory* factory = isolate->factory(); |
| 1222 Heap* heap = isolate->heap(); | 1222 Heap* heap = isolate->heap(); |
| 1223 v8::HandleScope scope(CcTest::isolate()); | 1223 v8::HandleScope scope(CcTest::isolate()); |
| 1224 const char* source = "function foo() {" | 1224 const char* source = "function foo() {" |
| 1225 " var x = 42;" | 1225 " var x = 42;" |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1297 Handle<Context> icontext = v8::Utils::OpenHandle(*context); | 1297 Handle<Context> icontext = v8::Utils::OpenHandle(*context); |
| 1298 Object* object = icontext->get(Context::OPTIMIZED_FUNCTIONS_LIST); | 1298 Object* object = icontext->get(Context::OPTIMIZED_FUNCTIONS_LIST); |
| 1299 while (object->IsJSFunction() && !JSFunction::cast(object)->IsBuiltin()) { | 1299 while (object->IsJSFunction() && !JSFunction::cast(object)->IsBuiltin()) { |
| 1300 count++; | 1300 count++; |
| 1301 object = JSFunction::cast(object)->next_function_link(); | 1301 object = JSFunction::cast(object)->next_function_link(); |
| 1302 } | 1302 } |
| 1303 return count; | 1303 return count; |
| 1304 } | 1304 } |
| 1305 | 1305 |
| 1306 | 1306 |
| 1307 TEST(TestInternalWeakLists) { | 1307 TEST_TRACK_ALLOCATIONS(TestInternalWeakLists) { |
| 1308 v8::V8::Initialize(); | 1308 v8::V8::Initialize(); |
| 1309 | 1309 |
| 1310 // Some flags turn Scavenge collections into Mark-sweep collections | 1310 // Some flags turn Scavenge collections into Mark-sweep collections |
| 1311 // and hence are incompatible with this test case. | 1311 // and hence are incompatible with this test case. |
| 1312 if (FLAG_gc_global || FLAG_stress_compaction) return; | 1312 if (FLAG_gc_global || FLAG_stress_compaction) return; |
| 1313 | 1313 |
| 1314 static const int kNumTestContexts = 10; | 1314 static const int kNumTestContexts = 10; |
| 1315 | 1315 |
| 1316 Isolate* isolate = CcTest::i_isolate(); | 1316 Isolate* isolate = CcTest::i_isolate(); |
| 1317 Heap* heap = isolate->heap(); | 1317 Heap* heap = isolate->heap(); |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1447 count++; | 1447 count++; |
| 1448 if (count == n) isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags); | 1448 if (count == n) isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags); |
| 1449 object = Handle<Object>( | 1449 object = Handle<Object>( |
| 1450 Object::cast(JSFunction::cast(*object)->next_function_link()), | 1450 Object::cast(JSFunction::cast(*object)->next_function_link()), |
| 1451 isolate); | 1451 isolate); |
| 1452 } | 1452 } |
| 1453 return count; | 1453 return count; |
| 1454 } | 1454 } |
| 1455 | 1455 |
| 1456 | 1456 |
| 1457 TEST(TestInternalWeakListsTraverseWithGC) { | 1457 TEST_TRACK_ALLOCATIONS(TestInternalWeakListsTraverseWithGC) { |
| 1458 v8::V8::Initialize(); | 1458 v8::V8::Initialize(); |
| 1459 Isolate* isolate = CcTest::i_isolate(); | 1459 Isolate* isolate = CcTest::i_isolate(); |
| 1460 | 1460 |
| 1461 static const int kNumTestContexts = 10; | 1461 static const int kNumTestContexts = 10; |
| 1462 | 1462 |
| 1463 HandleScope scope(isolate); | 1463 HandleScope scope(isolate); |
| 1464 v8::Handle<v8::Context> ctx[kNumTestContexts]; | 1464 v8::Handle<v8::Context> ctx[kNumTestContexts]; |
| 1465 | 1465 |
| 1466 CHECK_EQ(0, CountNativeContexts()); | 1466 CHECK_EQ(0, CountNativeContexts()); |
| 1467 | 1467 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1498 CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctions(ctx[0])); | 1498 CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctions(ctx[0])); |
| 1499 CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctionsWithGC(ctx[0], 2)); | 1499 CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctionsWithGC(ctx[0], 2)); |
| 1500 CompileRun("f5()"); | 1500 CompileRun("f5()"); |
| 1501 CHECK_EQ(opt ? 5 : 0, CountOptimizedUserFunctions(ctx[0])); | 1501 CHECK_EQ(opt ? 5 : 0, CountOptimizedUserFunctions(ctx[0])); |
| 1502 CHECK_EQ(opt ? 5 : 0, CountOptimizedUserFunctionsWithGC(ctx[0], 4)); | 1502 CHECK_EQ(opt ? 5 : 0, CountOptimizedUserFunctionsWithGC(ctx[0], 4)); |
| 1503 | 1503 |
| 1504 ctx[0]->Exit(); | 1504 ctx[0]->Exit(); |
| 1505 } | 1505 } |
| 1506 | 1506 |
| 1507 | 1507 |
| 1508 TEST(TestSizeOfObjects) { | 1508 TEST_TRACK_ALLOCATIONS(TestSizeOfObjects) { |
| 1509 v8::V8::Initialize(); | 1509 v8::V8::Initialize(); |
| 1510 | 1510 |
| 1511 // Get initial heap size after several full GCs, which will stabilize | 1511 // Get initial heap size after several full GCs, which will stabilize |
| 1512 // the heap size and return with sweeping finished completely. | 1512 // the heap size and return with sweeping finished completely. |
| 1513 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); | 1513 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); |
| 1514 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); | 1514 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); |
| 1515 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); | 1515 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); |
| 1516 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); | 1516 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); |
| 1517 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); | 1517 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); |
| 1518 CHECK(CcTest::heap()->old_pointer_space()->IsLazySweepingComplete()); | 1518 CHECK(CcTest::heap()->old_pointer_space()->IsLazySweepingComplete()); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1539 CHECK_EQ(initial_size, static_cast<int>(CcTest::heap()->SizeOfObjects())); | 1539 CHECK_EQ(initial_size, static_cast<int>(CcTest::heap()->SizeOfObjects())); |
| 1540 | 1540 |
| 1541 // Advancing the sweeper step-wise should not change the heap size. | 1541 // Advancing the sweeper step-wise should not change the heap size. |
| 1542 while (!CcTest::heap()->old_pointer_space()->IsLazySweepingComplete()) { | 1542 while (!CcTest::heap()->old_pointer_space()->IsLazySweepingComplete()) { |
| 1543 CcTest::heap()->old_pointer_space()->AdvanceSweeper(KB); | 1543 CcTest::heap()->old_pointer_space()->AdvanceSweeper(KB); |
| 1544 CHECK_EQ(initial_size, static_cast<int>(CcTest::heap()->SizeOfObjects())); | 1544 CHECK_EQ(initial_size, static_cast<int>(CcTest::heap()->SizeOfObjects())); |
| 1545 } | 1545 } |
| 1546 } | 1546 } |
| 1547 | 1547 |
| 1548 | 1548 |
| 1549 TEST(TestSizeOfObjectsVsHeapIteratorPrecision) { | 1549 TEST_TRACK_ALLOCATIONS(TestSizeOfObjectsVsHeapIteratorPrecision) { |
| 1550 CcTest::InitializeVM(); | 1550 CcTest::InitializeVM(); |
| 1551 CcTest::heap()->EnsureHeapIsIterable(); | 1551 CcTest::heap()->EnsureHeapIsIterable(); |
| 1552 intptr_t size_of_objects_1 = CcTest::heap()->SizeOfObjects(); | 1552 intptr_t size_of_objects_1 = CcTest::heap()->SizeOfObjects(); |
| 1553 HeapIterator iterator(CcTest::heap()); | 1553 HeapIterator iterator(CcTest::heap()); |
| 1554 intptr_t size_of_objects_2 = 0; | 1554 intptr_t size_of_objects_2 = 0; |
| 1555 for (HeapObject* obj = iterator.next(); | 1555 for (HeapObject* obj = iterator.next(); |
| 1556 obj != NULL; | 1556 obj != NULL; |
| 1557 obj = iterator.next()) { | 1557 obj = iterator.next()) { |
| 1558 if (!obj->IsFreeSpace()) { | 1558 if (!obj->IsFreeSpace()) { |
| 1559 size_of_objects_2 += obj->Size(); | 1559 size_of_objects_2 += obj->Size(); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1590 HandleScope scope(isolate); | 1590 HandleScope scope(isolate); |
| 1591 AlwaysAllocateScope always_allocate; | 1591 AlwaysAllocateScope always_allocate; |
| 1592 intptr_t available = new_space->EffectiveCapacity() - new_space->Size(); | 1592 intptr_t available = new_space->EffectiveCapacity() - new_space->Size(); |
| 1593 intptr_t number_of_fillers = (available / FixedArray::SizeFor(32)) - 1; | 1593 intptr_t number_of_fillers = (available / FixedArray::SizeFor(32)) - 1; |
| 1594 for (intptr_t i = 0; i < number_of_fillers; i++) { | 1594 for (intptr_t i = 0; i < number_of_fillers; i++) { |
| 1595 CHECK(heap->InNewSpace(*factory->NewFixedArray(32, NOT_TENURED))); | 1595 CHECK(heap->InNewSpace(*factory->NewFixedArray(32, NOT_TENURED))); |
| 1596 } | 1596 } |
| 1597 } | 1597 } |
| 1598 | 1598 |
| 1599 | 1599 |
| 1600 TEST(GrowAndShrinkNewSpace) { | 1600 TEST_TRACK_ALLOCATIONS(GrowAndShrinkNewSpace) { |
| 1601 CcTest::InitializeVM(); | 1601 CcTest::InitializeVM(); |
| 1602 Heap* heap = CcTest::heap(); | 1602 Heap* heap = CcTest::heap(); |
| 1603 NewSpace* new_space = heap->new_space(); | 1603 NewSpace* new_space = heap->new_space(); |
| 1604 | 1604 |
| 1605 if (heap->ReservedSemiSpaceSize() == heap->InitialSemiSpaceSize() || | 1605 if (heap->ReservedSemiSpaceSize() == heap->InitialSemiSpaceSize() || |
| 1606 heap->MaxSemiSpaceSize() == heap->InitialSemiSpaceSize()) { | 1606 heap->MaxSemiSpaceSize() == heap->InitialSemiSpaceSize()) { |
| 1607 // The max size cannot exceed the reserved size, since semispaces must be | 1607 // The max size cannot exceed the reserved size, since semispaces must be |
| 1608 // always within the reserved space. We can't test new space growing and | 1608 // always within the reserved space. We can't test new space growing and |
| 1609 // shrinking if the reserved size is the same as the minimum (initial) size. | 1609 // shrinking if the reserved size is the same as the minimum (initial) size. |
| 1610 return; | 1610 return; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1641 // Consecutive shrinking should not affect space capacity. | 1641 // Consecutive shrinking should not affect space capacity. |
| 1642 old_capacity = new_space->Capacity(); | 1642 old_capacity = new_space->Capacity(); |
| 1643 new_space->Shrink(); | 1643 new_space->Shrink(); |
| 1644 new_space->Shrink(); | 1644 new_space->Shrink(); |
| 1645 new_space->Shrink(); | 1645 new_space->Shrink(); |
| 1646 new_capacity = new_space->Capacity(); | 1646 new_capacity = new_space->Capacity(); |
| 1647 CHECK(old_capacity == new_capacity); | 1647 CHECK(old_capacity == new_capacity); |
| 1648 } | 1648 } |
| 1649 | 1649 |
| 1650 | 1650 |
| 1651 TEST(CollectingAllAvailableGarbageShrinksNewSpace) { | 1651 TEST_TRACK_ALLOCATIONS(CollectingAllAvailableGarbageShrinksNewSpace) { |
| 1652 CcTest::InitializeVM(); | 1652 CcTest::InitializeVM(); |
| 1653 Heap* heap = CcTest::heap(); | 1653 Heap* heap = CcTest::heap(); |
| 1654 if (heap->ReservedSemiSpaceSize() == heap->InitialSemiSpaceSize() || | 1654 if (heap->ReservedSemiSpaceSize() == heap->InitialSemiSpaceSize() || |
| 1655 heap->MaxSemiSpaceSize() == heap->InitialSemiSpaceSize()) { | 1655 heap->MaxSemiSpaceSize() == heap->InitialSemiSpaceSize()) { |
| 1656 // The max size cannot exceed the reserved size, since semispaces must be | 1656 // The max size cannot exceed the reserved size, since semispaces must be |
| 1657 // always within the reserved space. We can't test new space growing and | 1657 // always within the reserved space. We can't test new space growing and |
| 1658 // shrinking if the reserved size is the same as the minimum (initial) size. | 1658 // shrinking if the reserved size is the same as the minimum (initial) size. |
| 1659 return; | 1659 return; |
| 1660 } | 1660 } |
| 1661 | 1661 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1678 HeapIterator iterator(CcTest::heap()); | 1678 HeapIterator iterator(CcTest::heap()); |
| 1679 for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) { | 1679 for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) { |
| 1680 if (obj->IsGlobalObject()) count++; | 1680 if (obj->IsGlobalObject()) count++; |
| 1681 } | 1681 } |
| 1682 return count; | 1682 return count; |
| 1683 } | 1683 } |
| 1684 | 1684 |
| 1685 | 1685 |
| 1686 // Test that we don't embed maps from foreign contexts into | 1686 // Test that we don't embed maps from foreign contexts into |
| 1687 // optimized code. | 1687 // optimized code. |
| 1688 TEST(LeakNativeContextViaMap) { | 1688 TEST_TRACK_ALLOCATIONS(LeakNativeContextViaMap) { |
| 1689 i::FLAG_allow_natives_syntax = true; | 1689 i::FLAG_allow_natives_syntax = true; |
| 1690 v8::Isolate* isolate = CcTest::isolate(); | 1690 v8::Isolate* isolate = CcTest::isolate(); |
| 1691 v8::HandleScope outer_scope(isolate); | 1691 v8::HandleScope outer_scope(isolate); |
| 1692 v8::Persistent<v8::Context> ctx1p; | 1692 v8::Persistent<v8::Context> ctx1p; |
| 1693 v8::Persistent<v8::Context> ctx2p; | 1693 v8::Persistent<v8::Context> ctx2p; |
| 1694 { | 1694 { |
| 1695 v8::HandleScope scope(isolate); | 1695 v8::HandleScope scope(isolate); |
| 1696 ctx1p.Reset(isolate, v8::Context::New(isolate)); | 1696 ctx1p.Reset(isolate, v8::Context::New(isolate)); |
| 1697 ctx2p.Reset(isolate, v8::Context::New(isolate)); | 1697 ctx2p.Reset(isolate, v8::Context::New(isolate)); |
| 1698 v8::Local<v8::Context>::New(isolate, ctx1p)->Enter(); | 1698 v8::Local<v8::Context>::New(isolate, ctx1p)->Enter(); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1724 CcTest::heap()->CollectAllAvailableGarbage(); | 1724 CcTest::heap()->CollectAllAvailableGarbage(); |
| 1725 CHECK_EQ(2, NumberOfGlobalObjects()); | 1725 CHECK_EQ(2, NumberOfGlobalObjects()); |
| 1726 ctx2p.Dispose(); | 1726 ctx2p.Dispose(); |
| 1727 CcTest::heap()->CollectAllAvailableGarbage(); | 1727 CcTest::heap()->CollectAllAvailableGarbage(); |
| 1728 CHECK_EQ(0, NumberOfGlobalObjects()); | 1728 CHECK_EQ(0, NumberOfGlobalObjects()); |
| 1729 } | 1729 } |
| 1730 | 1730 |
| 1731 | 1731 |
| 1732 // Test that we don't embed functions from foreign contexts into | 1732 // Test that we don't embed functions from foreign contexts into |
| 1733 // optimized code. | 1733 // optimized code. |
| 1734 TEST(LeakNativeContextViaFunction) { | 1734 TEST_TRACK_ALLOCATIONS(LeakNativeContextViaFunction) { |
| 1735 i::FLAG_allow_natives_syntax = true; | 1735 i::FLAG_allow_natives_syntax = true; |
| 1736 v8::Isolate* isolate = CcTest::isolate(); | 1736 v8::Isolate* isolate = CcTest::isolate(); |
| 1737 v8::HandleScope outer_scope(isolate); | 1737 v8::HandleScope outer_scope(isolate); |
| 1738 v8::Persistent<v8::Context> ctx1p; | 1738 v8::Persistent<v8::Context> ctx1p; |
| 1739 v8::Persistent<v8::Context> ctx2p; | 1739 v8::Persistent<v8::Context> ctx2p; |
| 1740 { | 1740 { |
| 1741 v8::HandleScope scope(isolate); | 1741 v8::HandleScope scope(isolate); |
| 1742 ctx1p.Reset(isolate, v8::Context::New(isolate)); | 1742 ctx1p.Reset(isolate, v8::Context::New(isolate)); |
| 1743 ctx2p.Reset(isolate, v8::Context::New(isolate)); | 1743 ctx2p.Reset(isolate, v8::Context::New(isolate)); |
| 1744 v8::Local<v8::Context>::New(isolate, ctx1p)->Enter(); | 1744 v8::Local<v8::Context>::New(isolate, ctx1p)->Enter(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1768 v8::V8::ContextDisposedNotification(); | 1768 v8::V8::ContextDisposedNotification(); |
| 1769 } | 1769 } |
| 1770 CcTest::heap()->CollectAllAvailableGarbage(); | 1770 CcTest::heap()->CollectAllAvailableGarbage(); |
| 1771 CHECK_EQ(2, NumberOfGlobalObjects()); | 1771 CHECK_EQ(2, NumberOfGlobalObjects()); |
| 1772 ctx2p.Dispose(); | 1772 ctx2p.Dispose(); |
| 1773 CcTest::heap()->CollectAllAvailableGarbage(); | 1773 CcTest::heap()->CollectAllAvailableGarbage(); |
| 1774 CHECK_EQ(0, NumberOfGlobalObjects()); | 1774 CHECK_EQ(0, NumberOfGlobalObjects()); |
| 1775 } | 1775 } |
| 1776 | 1776 |
| 1777 | 1777 |
| 1778 TEST(LeakNativeContextViaMapKeyed) { | 1778 TEST_TRACK_ALLOCATIONS(LeakNativeContextViaMapKeyed) { |
| 1779 i::FLAG_allow_natives_syntax = true; | 1779 i::FLAG_allow_natives_syntax = true; |
| 1780 v8::Isolate* isolate = CcTest::isolate(); | 1780 v8::Isolate* isolate = CcTest::isolate(); |
| 1781 v8::HandleScope outer_scope(isolate); | 1781 v8::HandleScope outer_scope(isolate); |
| 1782 v8::Persistent<v8::Context> ctx1p; | 1782 v8::Persistent<v8::Context> ctx1p; |
| 1783 v8::Persistent<v8::Context> ctx2p; | 1783 v8::Persistent<v8::Context> ctx2p; |
| 1784 { | 1784 { |
| 1785 v8::HandleScope scope(isolate); | 1785 v8::HandleScope scope(isolate); |
| 1786 ctx1p.Reset(isolate, v8::Context::New(isolate)); | 1786 ctx1p.Reset(isolate, v8::Context::New(isolate)); |
| 1787 ctx2p.Reset(isolate, v8::Context::New(isolate)); | 1787 ctx2p.Reset(isolate, v8::Context::New(isolate)); |
| 1788 v8::Local<v8::Context>::New(isolate, ctx1p)->Enter(); | 1788 v8::Local<v8::Context>::New(isolate, ctx1p)->Enter(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1812 v8::V8::ContextDisposedNotification(); | 1812 v8::V8::ContextDisposedNotification(); |
| 1813 } | 1813 } |
| 1814 CcTest::heap()->CollectAllAvailableGarbage(); | 1814 CcTest::heap()->CollectAllAvailableGarbage(); |
| 1815 CHECK_EQ(2, NumberOfGlobalObjects()); | 1815 CHECK_EQ(2, NumberOfGlobalObjects()); |
| 1816 ctx2p.Dispose(); | 1816 ctx2p.Dispose(); |
| 1817 CcTest::heap()->CollectAllAvailableGarbage(); | 1817 CcTest::heap()->CollectAllAvailableGarbage(); |
| 1818 CHECK_EQ(0, NumberOfGlobalObjects()); | 1818 CHECK_EQ(0, NumberOfGlobalObjects()); |
| 1819 } | 1819 } |
| 1820 | 1820 |
| 1821 | 1821 |
| 1822 TEST(LeakNativeContextViaMapProto) { | 1822 TEST_TRACK_ALLOCATIONS(LeakNativeContextViaMapProto) { |
| 1823 i::FLAG_allow_natives_syntax = true; | 1823 i::FLAG_allow_natives_syntax = true; |
| 1824 v8::Isolate* isolate = CcTest::isolate(); | 1824 v8::Isolate* isolate = CcTest::isolate(); |
| 1825 v8::HandleScope outer_scope(isolate); | 1825 v8::HandleScope outer_scope(isolate); |
| 1826 v8::Persistent<v8::Context> ctx1p; | 1826 v8::Persistent<v8::Context> ctx1p; |
| 1827 v8::Persistent<v8::Context> ctx2p; | 1827 v8::Persistent<v8::Context> ctx2p; |
| 1828 { | 1828 { |
| 1829 v8::HandleScope scope(isolate); | 1829 v8::HandleScope scope(isolate); |
| 1830 ctx1p.Reset(isolate, v8::Context::New(isolate)); | 1830 ctx1p.Reset(isolate, v8::Context::New(isolate)); |
| 1831 ctx2p.Reset(isolate, v8::Context::New(isolate)); | 1831 ctx2p.Reset(isolate, v8::Context::New(isolate)); |
| 1832 v8::Local<v8::Context>::New(isolate, ctx1p)->Enter(); | 1832 v8::Local<v8::Context>::New(isolate, ctx1p)->Enter(); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1860 v8::V8::ContextDisposedNotification(); | 1860 v8::V8::ContextDisposedNotification(); |
| 1861 } | 1861 } |
| 1862 CcTest::heap()->CollectAllAvailableGarbage(); | 1862 CcTest::heap()->CollectAllAvailableGarbage(); |
| 1863 CHECK_EQ(2, NumberOfGlobalObjects()); | 1863 CHECK_EQ(2, NumberOfGlobalObjects()); |
| 1864 ctx2p.Dispose(); | 1864 ctx2p.Dispose(); |
| 1865 CcTest::heap()->CollectAllAvailableGarbage(); | 1865 CcTest::heap()->CollectAllAvailableGarbage(); |
| 1866 CHECK_EQ(0, NumberOfGlobalObjects()); | 1866 CHECK_EQ(0, NumberOfGlobalObjects()); |
| 1867 } | 1867 } |
| 1868 | 1868 |
| 1869 | 1869 |
| 1870 TEST(InstanceOfStubWriteBarrier) { | 1870 TEST_TRACK_ALLOCATIONS(InstanceOfStubWriteBarrier) { |
| 1871 i::FLAG_allow_natives_syntax = true; | 1871 i::FLAG_allow_natives_syntax = true; |
| 1872 #ifdef VERIFY_HEAP | 1872 #ifdef VERIFY_HEAP |
| 1873 i::FLAG_verify_heap = true; | 1873 i::FLAG_verify_heap = true; |
| 1874 #endif | 1874 #endif |
| 1875 | 1875 |
| 1876 CcTest::InitializeVM(); | 1876 CcTest::InitializeVM(); |
| 1877 if (!CcTest::i_isolate()->use_crankshaft()) return; | 1877 if (!CcTest::i_isolate()->use_crankshaft()) return; |
| 1878 if (i::FLAG_force_marking_deque_overflows) return; | 1878 if (i::FLAG_force_marking_deque_overflows) return; |
| 1879 v8::HandleScope outer_scope(CcTest::isolate()); | 1879 v8::HandleScope outer_scope(CcTest::isolate()); |
| 1880 | 1880 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1916 v8::Handle<v8::Function> g = | 1916 v8::Handle<v8::Function> g = |
| 1917 v8::Handle<v8::Function>::Cast(global->Get(v8_str("g"))); | 1917 v8::Handle<v8::Function>::Cast(global->Get(v8_str("g"))); |
| 1918 g->Call(global, 0, NULL); | 1918 g->Call(global, 0, NULL); |
| 1919 } | 1919 } |
| 1920 | 1920 |
| 1921 CcTest::heap()->incremental_marking()->set_should_hurry(true); | 1921 CcTest::heap()->incremental_marking()->set_should_hurry(true); |
| 1922 CcTest::heap()->CollectGarbage(OLD_POINTER_SPACE); | 1922 CcTest::heap()->CollectGarbage(OLD_POINTER_SPACE); |
| 1923 } | 1923 } |
| 1924 | 1924 |
| 1925 | 1925 |
| 1926 TEST(PrototypeTransitionClearing) { | 1926 TEST_TRACK_ALLOCATIONS(PrototypeTransitionClearing) { |
| 1927 CcTest::InitializeVM(); | 1927 CcTest::InitializeVM(); |
| 1928 Isolate* isolate = CcTest::i_isolate(); | 1928 Isolate* isolate = CcTest::i_isolate(); |
| 1929 Factory* factory = isolate->factory(); | 1929 Factory* factory = isolate->factory(); |
| 1930 v8::HandleScope scope(CcTest::isolate()); | 1930 v8::HandleScope scope(CcTest::isolate()); |
| 1931 | 1931 |
| 1932 CompileRun( | 1932 CompileRun( |
| 1933 "var base = {};" | 1933 "var base = {};" |
| 1934 "var live = [];" | 1934 "var live = [];" |
| 1935 "for (var i = 0; i < 10; i++) {" | 1935 "for (var i = 0; i < 10; i++) {" |
| 1936 " var object = {};" | 1936 " var object = {};" |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1976 CHECK(!space->LastPage()->Contains( | 1976 CHECK(!space->LastPage()->Contains( |
| 1977 map->GetPrototypeTransitions()->address())); | 1977 map->GetPrototypeTransitions()->address())); |
| 1978 CHECK(space->LastPage()->Contains(prototype->address())); | 1978 CHECK(space->LastPage()->Contains(prototype->address())); |
| 1979 JSObject::SetPrototype(baseObject, prototype, false); | 1979 JSObject::SetPrototype(baseObject, prototype, false); |
| 1980 CHECK(Map::GetPrototypeTransition(map, prototype)->IsMap()); | 1980 CHECK(Map::GetPrototypeTransition(map, prototype)->IsMap()); |
| 1981 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); | 1981 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); |
| 1982 CHECK(Map::GetPrototypeTransition(map, prototype)->IsMap()); | 1982 CHECK(Map::GetPrototypeTransition(map, prototype)->IsMap()); |
| 1983 } | 1983 } |
| 1984 | 1984 |
| 1985 | 1985 |
| 1986 TEST(ResetSharedFunctionInfoCountersDuringIncrementalMarking) { | 1986 TEST_TRACK_ALLOCATIONS(ResetSharedFunctionInfoCountersDuringIncrementalMarking)
{ |
| 1987 i::FLAG_stress_compaction = false; | 1987 i::FLAG_stress_compaction = false; |
| 1988 i::FLAG_allow_natives_syntax = true; | 1988 i::FLAG_allow_natives_syntax = true; |
| 1989 #ifdef VERIFY_HEAP | 1989 #ifdef VERIFY_HEAP |
| 1990 i::FLAG_verify_heap = true; | 1990 i::FLAG_verify_heap = true; |
| 1991 #endif | 1991 #endif |
| 1992 | 1992 |
| 1993 CcTest::InitializeVM(); | 1993 CcTest::InitializeVM(); |
| 1994 if (!CcTest::i_isolate()->use_crankshaft()) return; | 1994 if (!CcTest::i_isolate()->use_crankshaft()) return; |
| 1995 v8::HandleScope outer_scope(CcTest::isolate()); | 1995 v8::HandleScope outer_scope(CcTest::isolate()); |
| 1996 | 1996 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2033 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags, | 2033 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags, |
| 2034 "Test finalizing incremental mark-sweep"); | 2034 "Test finalizing incremental mark-sweep"); |
| 2035 } | 2035 } |
| 2036 | 2036 |
| 2037 CHECK_EQ(CcTest::heap()->global_ic_age(), f->shared()->ic_age()); | 2037 CHECK_EQ(CcTest::heap()->global_ic_age(), f->shared()->ic_age()); |
| 2038 CHECK_EQ(0, f->shared()->opt_count()); | 2038 CHECK_EQ(0, f->shared()->opt_count()); |
| 2039 CHECK_EQ(0, f->shared()->code()->profiler_ticks()); | 2039 CHECK_EQ(0, f->shared()->code()->profiler_ticks()); |
| 2040 } | 2040 } |
| 2041 | 2041 |
| 2042 | 2042 |
| 2043 TEST(ResetSharedFunctionInfoCountersDuringMarkSweep) { | 2043 TEST_TRACK_ALLOCATIONS(ResetSharedFunctionInfoCountersDuringMarkSweep) { |
| 2044 i::FLAG_stress_compaction = false; | 2044 i::FLAG_stress_compaction = false; |
| 2045 i::FLAG_allow_natives_syntax = true; | 2045 i::FLAG_allow_natives_syntax = true; |
| 2046 #ifdef VERIFY_HEAP | 2046 #ifdef VERIFY_HEAP |
| 2047 i::FLAG_verify_heap = true; | 2047 i::FLAG_verify_heap = true; |
| 2048 #endif | 2048 #endif |
| 2049 | 2049 |
| 2050 CcTest::InitializeVM(); | 2050 CcTest::InitializeVM(); |
| 2051 if (!CcTest::i_isolate()->use_crankshaft()) return; | 2051 if (!CcTest::i_isolate()->use_crankshaft()) return; |
| 2052 v8::HandleScope outer_scope(CcTest::isolate()); | 2052 v8::HandleScope outer_scope(CcTest::isolate()); |
| 2053 | 2053 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 2077 v8::V8::ContextDisposedNotification(); | 2077 v8::V8::ContextDisposedNotification(); |
| 2078 v8::V8::IdleNotification(kLongIdlePauseInMs); | 2078 v8::V8::IdleNotification(kLongIdlePauseInMs); |
| 2079 | 2079 |
| 2080 CHECK_EQ(CcTest::heap()->global_ic_age(), f->shared()->ic_age()); | 2080 CHECK_EQ(CcTest::heap()->global_ic_age(), f->shared()->ic_age()); |
| 2081 CHECK_EQ(0, f->shared()->opt_count()); | 2081 CHECK_EQ(0, f->shared()->opt_count()); |
| 2082 CHECK_EQ(0, f->shared()->code()->profiler_ticks()); | 2082 CHECK_EQ(0, f->shared()->code()->profiler_ticks()); |
| 2083 } | 2083 } |
| 2084 | 2084 |
| 2085 | 2085 |
| 2086 // Test that HAllocateObject will always return an object in new-space. | 2086 // Test that HAllocateObject will always return an object in new-space. |
| 2087 TEST(OptimizedAllocationAlwaysInNewSpace) { | 2087 TEST_TRACK_ALLOCATIONS(OptimizedAllocationAlwaysInNewSpace) { |
| 2088 i::FLAG_allow_natives_syntax = true; | 2088 i::FLAG_allow_natives_syntax = true; |
| 2089 CcTest::InitializeVM(); | 2089 CcTest::InitializeVM(); |
| 2090 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; | 2090 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; |
| 2091 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; | 2091 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; |
| 2092 v8::HandleScope scope(CcTest::isolate()); | 2092 v8::HandleScope scope(CcTest::isolate()); |
| 2093 | 2093 |
| 2094 SimulateFullSpace(CcTest::heap()->new_space()); | 2094 SimulateFullSpace(CcTest::heap()->new_space()); |
| 2095 AlwaysAllocateScope always_allocate; | 2095 AlwaysAllocateScope always_allocate; |
| 2096 v8::Local<v8::Value> res = CompileRun( | 2096 v8::Local<v8::Value> res = CompileRun( |
| 2097 "function c(x) {" | 2097 "function c(x) {" |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2178 | 2178 |
| 2179 CHECK(CcTest::heap()->InOldPointerSpace(o->RawFastPropertyAt(0))); | 2179 CHECK(CcTest::heap()->InOldPointerSpace(o->RawFastPropertyAt(0))); |
| 2180 CHECK(CcTest::heap()->InOldPointerSpace(o->RawFastPropertyAt(1))); | 2180 CHECK(CcTest::heap()->InOldPointerSpace(o->RawFastPropertyAt(1))); |
| 2181 CHECK(CcTest::heap()->InOldDataSpace(o->RawFastPropertyAt(2))); | 2181 CHECK(CcTest::heap()->InOldDataSpace(o->RawFastPropertyAt(2))); |
| 2182 CHECK(CcTest::heap()->InOldDataSpace(o->RawFastPropertyAt(3))); | 2182 CHECK(CcTest::heap()->InOldDataSpace(o->RawFastPropertyAt(3))); |
| 2183 CHECK(CcTest::heap()->InOldPointerSpace(o->RawFastPropertyAt(4))); | 2183 CHECK(CcTest::heap()->InOldPointerSpace(o->RawFastPropertyAt(4))); |
| 2184 CHECK(CcTest::heap()->InOldDataSpace(o->RawFastPropertyAt(5))); | 2184 CHECK(CcTest::heap()->InOldDataSpace(o->RawFastPropertyAt(5))); |
| 2185 } | 2185 } |
| 2186 | 2186 |
| 2187 | 2187 |
| 2188 TEST(OptimizedPretenuringObjectArrayLiterals) { | 2188 TEST_TRACK_ALLOCATIONS(OptimizedPretenuringObjectArrayLiterals) { |
| 2189 i::FLAG_allow_natives_syntax = true; | 2189 i::FLAG_allow_natives_syntax = true; |
| 2190 CcTest::InitializeVM(); | 2190 CcTest::InitializeVM(); |
| 2191 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; | 2191 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; |
| 2192 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; | 2192 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; |
| 2193 v8::HandleScope scope(CcTest::isolate()); | 2193 v8::HandleScope scope(CcTest::isolate()); |
| 2194 CcTest::heap()->SetNewSpaceHighPromotionModeActive(true); | 2194 CcTest::heap()->SetNewSpaceHighPromotionModeActive(true); |
| 2195 | 2195 |
| 2196 v8::Local<v8::Value> res = CompileRun( | 2196 v8::Local<v8::Value> res = CompileRun( |
| 2197 "function f() {" | 2197 "function f() {" |
| 2198 " var numbers = [{}, {}, {}];" | 2198 " var numbers = [{}, {}, {}];" |
| 2199 " return numbers;" | 2199 " return numbers;" |
| 2200 "};" | 2200 "};" |
| 2201 "f(); f(); f();" | 2201 "f(); f(); f();" |
| 2202 "%OptimizeFunctionOnNextCall(f);" | 2202 "%OptimizeFunctionOnNextCall(f);" |
| 2203 "f();"); | 2203 "f();"); |
| 2204 | 2204 |
| 2205 Handle<JSObject> o = | 2205 Handle<JSObject> o = |
| 2206 v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res)); | 2206 v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res)); |
| 2207 | 2207 |
| 2208 CHECK(CcTest::heap()->InOldPointerSpace(o->elements())); | 2208 CHECK(CcTest::heap()->InOldPointerSpace(o->elements())); |
| 2209 CHECK(CcTest::heap()->InOldPointerSpace(*o)); | 2209 CHECK(CcTest::heap()->InOldPointerSpace(*o)); |
| 2210 } | 2210 } |
| 2211 | 2211 |
| 2212 | 2212 |
| 2213 TEST(OptimizedPretenuringMixedInObjectProperties) { | 2213 TEST_TRACK_ALLOCATIONS(OptimizedPretenuringMixedInObjectProperties) { |
| 2214 i::FLAG_allow_natives_syntax = true; | 2214 i::FLAG_allow_natives_syntax = true; |
| 2215 CcTest::InitializeVM(); | 2215 CcTest::InitializeVM(); |
| 2216 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; | 2216 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; |
| 2217 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; | 2217 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; |
| 2218 v8::HandleScope scope(CcTest::isolate()); | 2218 v8::HandleScope scope(CcTest::isolate()); |
| 2219 CcTest::heap()->SetNewSpaceHighPromotionModeActive(true); | 2219 CcTest::heap()->SetNewSpaceHighPromotionModeActive(true); |
| 2220 | 2220 |
| 2221 v8::Local<v8::Value> res = CompileRun( | 2221 v8::Local<v8::Value> res = CompileRun( |
| 2222 "function f() {" | 2222 "function f() {" |
| 2223 " var numbers = {a: {c: 2.2, d: {}}, b: 1.1};" | 2223 " var numbers = {a: {c: 2.2, d: {}}, b: 1.1};" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2234 CHECK(CcTest::heap()->InOldPointerSpace(o->RawFastPropertyAt(0))); | 2234 CHECK(CcTest::heap()->InOldPointerSpace(o->RawFastPropertyAt(0))); |
| 2235 CHECK(CcTest::heap()->InOldDataSpace(o->RawFastPropertyAt(1))); | 2235 CHECK(CcTest::heap()->InOldDataSpace(o->RawFastPropertyAt(1))); |
| 2236 | 2236 |
| 2237 JSObject* inner_object = reinterpret_cast<JSObject*>(o->RawFastPropertyAt(0)); | 2237 JSObject* inner_object = reinterpret_cast<JSObject*>(o->RawFastPropertyAt(0)); |
| 2238 CHECK(CcTest::heap()->InOldPointerSpace(inner_object)); | 2238 CHECK(CcTest::heap()->InOldPointerSpace(inner_object)); |
| 2239 CHECK(CcTest::heap()->InOldDataSpace(inner_object->RawFastPropertyAt(0))); | 2239 CHECK(CcTest::heap()->InOldDataSpace(inner_object->RawFastPropertyAt(0))); |
| 2240 CHECK(CcTest::heap()->InOldPointerSpace(inner_object->RawFastPropertyAt(1))); | 2240 CHECK(CcTest::heap()->InOldPointerSpace(inner_object->RawFastPropertyAt(1))); |
| 2241 } | 2241 } |
| 2242 | 2242 |
| 2243 | 2243 |
| 2244 TEST(OptimizedPretenuringDoubleArrayProperties) { | 2244 TEST_TRACK_ALLOCATIONS(OptimizedPretenuringDoubleArrayProperties) { |
| 2245 i::FLAG_allow_natives_syntax = true; | 2245 i::FLAG_allow_natives_syntax = true; |
| 2246 CcTest::InitializeVM(); | 2246 CcTest::InitializeVM(); |
| 2247 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; | 2247 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; |
| 2248 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; | 2248 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; |
| 2249 v8::HandleScope scope(CcTest::isolate()); | 2249 v8::HandleScope scope(CcTest::isolate()); |
| 2250 CcTest::heap()->SetNewSpaceHighPromotionModeActive(true); | 2250 CcTest::heap()->SetNewSpaceHighPromotionModeActive(true); |
| 2251 | 2251 |
| 2252 v8::Local<v8::Value> res = CompileRun( | 2252 v8::Local<v8::Value> res = CompileRun( |
| 2253 "function f() {" | 2253 "function f() {" |
| 2254 " var numbers = {a: 1.1, b: 2.2};" | 2254 " var numbers = {a: 1.1, b: 2.2};" |
| 2255 " return numbers;" | 2255 " return numbers;" |
| 2256 "};" | 2256 "};" |
| 2257 "f(); f(); f();" | 2257 "f(); f(); f();" |
| 2258 "%OptimizeFunctionOnNextCall(f);" | 2258 "%OptimizeFunctionOnNextCall(f);" |
| 2259 "f();"); | 2259 "f();"); |
| 2260 | 2260 |
| 2261 Handle<JSObject> o = | 2261 Handle<JSObject> o = |
| 2262 v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res)); | 2262 v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res)); |
| 2263 | 2263 |
| 2264 CHECK(CcTest::heap()->InOldPointerSpace(*o)); | 2264 CHECK(CcTest::heap()->InOldPointerSpace(*o)); |
| 2265 CHECK(CcTest::heap()->InOldDataSpace(o->properties())); | 2265 CHECK(CcTest::heap()->InOldDataSpace(o->properties())); |
| 2266 } | 2266 } |
| 2267 | 2267 |
| 2268 | 2268 |
| 2269 TEST(OptimizedPretenuringdoubleArrayLiterals) { | 2269 TEST_TRACK_ALLOCATIONS(OptimizedPretenuringdoubleArrayLiterals) { |
| 2270 i::FLAG_allow_natives_syntax = true; | 2270 i::FLAG_allow_natives_syntax = true; |
| 2271 CcTest::InitializeVM(); | 2271 CcTest::InitializeVM(); |
| 2272 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; | 2272 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; |
| 2273 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; | 2273 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; |
| 2274 v8::HandleScope scope(CcTest::isolate()); | 2274 v8::HandleScope scope(CcTest::isolate()); |
| 2275 CcTest::heap()->SetNewSpaceHighPromotionModeActive(true); | 2275 CcTest::heap()->SetNewSpaceHighPromotionModeActive(true); |
| 2276 | 2276 |
| 2277 v8::Local<v8::Value> res = CompileRun( | 2277 v8::Local<v8::Value> res = CompileRun( |
| 2278 "function f() {" | 2278 "function f() {" |
| 2279 " var numbers = [1.1, 2.2, 3.3];" | 2279 " var numbers = [1.1, 2.2, 3.3];" |
| 2280 " return numbers;" | 2280 " return numbers;" |
| 2281 "};" | 2281 "};" |
| 2282 "f(); f(); f();" | 2282 "f(); f(); f();" |
| 2283 "%OptimizeFunctionOnNextCall(f);" | 2283 "%OptimizeFunctionOnNextCall(f);" |
| 2284 "f();"); | 2284 "f();"); |
| 2285 | 2285 |
| 2286 Handle<JSObject> o = | 2286 Handle<JSObject> o = |
| 2287 v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res)); | 2287 v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res)); |
| 2288 | 2288 |
| 2289 CHECK(CcTest::heap()->InOldDataSpace(o->elements())); | 2289 CHECK(CcTest::heap()->InOldDataSpace(o->elements())); |
| 2290 CHECK(CcTest::heap()->InOldPointerSpace(*o)); | 2290 CHECK(CcTest::heap()->InOldPointerSpace(*o)); |
| 2291 } | 2291 } |
| 2292 | 2292 |
| 2293 | 2293 |
| 2294 TEST(OptimizedPretenuringNestedMixedArrayLiterals) { | 2294 TEST_TRACK_ALLOCATIONS(OptimizedPretenuringNestedMixedArrayLiterals) { |
| 2295 i::FLAG_allow_natives_syntax = true; | 2295 i::FLAG_allow_natives_syntax = true; |
| 2296 CcTest::InitializeVM(); | 2296 CcTest::InitializeVM(); |
| 2297 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; | 2297 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; |
| 2298 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; | 2298 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; |
| 2299 v8::HandleScope scope(CcTest::isolate()); | 2299 v8::HandleScope scope(CcTest::isolate()); |
| 2300 CcTest::heap()->SetNewSpaceHighPromotionModeActive(true); | 2300 CcTest::heap()->SetNewSpaceHighPromotionModeActive(true); |
| 2301 | 2301 |
| 2302 v8::Local<v8::Value> res = CompileRun( | 2302 v8::Local<v8::Value> res = CompileRun( |
| 2303 "function f() {" | 2303 "function f() {" |
| 2304 " var numbers = [[{}, {}, {}],[1.1, 2.2, 3.3]];" | 2304 " var numbers = [[{}, {}, {}],[1.1, 2.2, 3.3]];" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2318 Handle<JSObject> o = | 2318 Handle<JSObject> o = |
| 2319 v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res)); | 2319 v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res)); |
| 2320 CHECK(CcTest::heap()->InOldPointerSpace(*o)); | 2320 CHECK(CcTest::heap()->InOldPointerSpace(*o)); |
| 2321 CHECK(CcTest::heap()->InOldPointerSpace(*int_array_handle)); | 2321 CHECK(CcTest::heap()->InOldPointerSpace(*int_array_handle)); |
| 2322 CHECK(CcTest::heap()->InOldPointerSpace(int_array_handle->elements())); | 2322 CHECK(CcTest::heap()->InOldPointerSpace(int_array_handle->elements())); |
| 2323 CHECK(CcTest::heap()->InOldPointerSpace(*double_array_handle)); | 2323 CHECK(CcTest::heap()->InOldPointerSpace(*double_array_handle)); |
| 2324 CHECK(CcTest::heap()->InOldDataSpace(double_array_handle->elements())); | 2324 CHECK(CcTest::heap()->InOldDataSpace(double_array_handle->elements())); |
| 2325 } | 2325 } |
| 2326 | 2326 |
| 2327 | 2327 |
| 2328 TEST(OptimizedPretenuringNestedObjectLiterals) { | 2328 TEST_TRACK_ALLOCATIONS(OptimizedPretenuringNestedObjectLiterals) { |
| 2329 i::FLAG_allow_natives_syntax = true; | 2329 i::FLAG_allow_natives_syntax = true; |
| 2330 CcTest::InitializeVM(); | 2330 CcTest::InitializeVM(); |
| 2331 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; | 2331 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; |
| 2332 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; | 2332 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; |
| 2333 v8::HandleScope scope(CcTest::isolate()); | 2333 v8::HandleScope scope(CcTest::isolate()); |
| 2334 CcTest::heap()->SetNewSpaceHighPromotionModeActive(true); | 2334 CcTest::heap()->SetNewSpaceHighPromotionModeActive(true); |
| 2335 | 2335 |
| 2336 v8::Local<v8::Value> res = CompileRun( | 2336 v8::Local<v8::Value> res = CompileRun( |
| 2337 "function f() {" | 2337 "function f() {" |
| 2338 " var numbers = [[{}, {}, {}],[{}, {}, {}]];" | 2338 " var numbers = [[{}, {}, {}],[{}, {}, {}]];" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2352 Handle<JSObject> o = | 2352 Handle<JSObject> o = |
| 2353 v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res)); | 2353 v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res)); |
| 2354 CHECK(CcTest::heap()->InOldPointerSpace(*o)); | 2354 CHECK(CcTest::heap()->InOldPointerSpace(*o)); |
| 2355 CHECK(CcTest::heap()->InOldPointerSpace(*int_array_handle_1)); | 2355 CHECK(CcTest::heap()->InOldPointerSpace(*int_array_handle_1)); |
| 2356 CHECK(CcTest::heap()->InOldPointerSpace(int_array_handle_1->elements())); | 2356 CHECK(CcTest::heap()->InOldPointerSpace(int_array_handle_1->elements())); |
| 2357 CHECK(CcTest::heap()->InOldPointerSpace(*int_array_handle_2)); | 2357 CHECK(CcTest::heap()->InOldPointerSpace(*int_array_handle_2)); |
| 2358 CHECK(CcTest::heap()->InOldPointerSpace(int_array_handle_2->elements())); | 2358 CHECK(CcTest::heap()->InOldPointerSpace(int_array_handle_2->elements())); |
| 2359 } | 2359 } |
| 2360 | 2360 |
| 2361 | 2361 |
| 2362 TEST(OptimizedPretenuringNestedDoubleLiterals) { | 2362 TEST_TRACK_ALLOCATIONS(OptimizedPretenuringNestedDoubleLiterals) { |
| 2363 i::FLAG_allow_natives_syntax = true; | 2363 i::FLAG_allow_natives_syntax = true; |
| 2364 CcTest::InitializeVM(); | 2364 CcTest::InitializeVM(); |
| 2365 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; | 2365 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; |
| 2366 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; | 2366 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; |
| 2367 v8::HandleScope scope(CcTest::isolate()); | 2367 v8::HandleScope scope(CcTest::isolate()); |
| 2368 CcTest::heap()->SetNewSpaceHighPromotionModeActive(true); | 2368 CcTest::heap()->SetNewSpaceHighPromotionModeActive(true); |
| 2369 | 2369 |
| 2370 v8::Local<v8::Value> res = CompileRun( | 2370 v8::Local<v8::Value> res = CompileRun( |
| 2371 "function f() {" | 2371 "function f() {" |
| 2372 " var numbers = [[1.1, 1.2, 1.3],[2.1, 2.2, 2.3]];" | 2372 " var numbers = [[1.1, 1.2, 1.3],[2.1, 2.2, 2.3]];" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 2389 v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res)); | 2389 v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res)); |
| 2390 CHECK(CcTest::heap()->InOldPointerSpace(*o)); | 2390 CHECK(CcTest::heap()->InOldPointerSpace(*o)); |
| 2391 CHECK(CcTest::heap()->InOldPointerSpace(*double_array_handle_1)); | 2391 CHECK(CcTest::heap()->InOldPointerSpace(*double_array_handle_1)); |
| 2392 CHECK(CcTest::heap()->InOldDataSpace(double_array_handle_1->elements())); | 2392 CHECK(CcTest::heap()->InOldDataSpace(double_array_handle_1->elements())); |
| 2393 CHECK(CcTest::heap()->InOldPointerSpace(*double_array_handle_2)); | 2393 CHECK(CcTest::heap()->InOldPointerSpace(*double_array_handle_2)); |
| 2394 CHECK(CcTest::heap()->InOldDataSpace(double_array_handle_2->elements())); | 2394 CHECK(CcTest::heap()->InOldDataSpace(double_array_handle_2->elements())); |
| 2395 } | 2395 } |
| 2396 | 2396 |
| 2397 | 2397 |
| 2398 // Test regular array literals allocation. | 2398 // Test regular array literals allocation. |
| 2399 TEST(OptimizedAllocationArrayLiterals) { | 2399 TEST_TRACK_ALLOCATIONS(OptimizedAllocationArrayLiterals) { |
| 2400 i::FLAG_allow_natives_syntax = true; | 2400 i::FLAG_allow_natives_syntax = true; |
| 2401 CcTest::InitializeVM(); | 2401 CcTest::InitializeVM(); |
| 2402 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; | 2402 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; |
| 2403 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; | 2403 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; |
| 2404 v8::HandleScope scope(CcTest::isolate()); | 2404 v8::HandleScope scope(CcTest::isolate()); |
| 2405 | 2405 |
| 2406 v8::Local<v8::Value> res = CompileRun( | 2406 v8::Local<v8::Value> res = CompileRun( |
| 2407 "function f() {" | 2407 "function f() {" |
| 2408 " var numbers = new Array(1, 2, 3);" | 2408 " var numbers = new Array(1, 2, 3);" |
| 2409 " numbers[0] = 3.14;" | 2409 " numbers[0] = 3.14;" |
| 2410 " return numbers;" | 2410 " return numbers;" |
| 2411 "};" | 2411 "};" |
| 2412 "f(); f(); f();" | 2412 "f(); f(); f();" |
| 2413 "%OptimizeFunctionOnNextCall(f);" | 2413 "%OptimizeFunctionOnNextCall(f);" |
| 2414 "f();"); | 2414 "f();"); |
| 2415 CHECK_EQ(static_cast<int>(3.14), | 2415 CHECK_EQ(static_cast<int>(3.14), |
| 2416 v8::Object::Cast(*res)->Get(v8_str("0"))->Int32Value()); | 2416 v8::Object::Cast(*res)->Get(v8_str("0"))->Int32Value()); |
| 2417 | 2417 |
| 2418 Handle<JSObject> o = | 2418 Handle<JSObject> o = |
| 2419 v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res)); | 2419 v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(res)); |
| 2420 | 2420 |
| 2421 CHECK(CcTest::heap()->InNewSpace(o->elements())); | 2421 CHECK(CcTest::heap()->InNewSpace(o->elements())); |
| 2422 } | 2422 } |
| 2423 | 2423 |
| 2424 | 2424 |
| 2425 TEST(OptimizedPretenuringCallNew) { | 2425 TEST_TRACK_ALLOCATIONS(OptimizedPretenuringCallNew) { |
| 2426 i::FLAG_allow_natives_syntax = true; | 2426 i::FLAG_allow_natives_syntax = true; |
| 2427 i::FLAG_pretenuring_call_new = true; | 2427 i::FLAG_pretenuring_call_new = true; |
| 2428 CcTest::InitializeVM(); | 2428 CcTest::InitializeVM(); |
| 2429 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; | 2429 if (!CcTest::i_isolate()->use_crankshaft() || i::FLAG_always_opt) return; |
| 2430 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; | 2430 if (i::FLAG_gc_global || i::FLAG_stress_compaction) return; |
| 2431 v8::HandleScope scope(CcTest::isolate()); | 2431 v8::HandleScope scope(CcTest::isolate()); |
| 2432 CcTest::heap()->SetNewSpaceHighPromotionModeActive(true); | 2432 CcTest::heap()->SetNewSpaceHighPromotionModeActive(true); |
| 2433 | 2433 |
| 2434 AlwaysAllocateScope always_allocate; | 2434 AlwaysAllocateScope always_allocate; |
| 2435 v8::Local<v8::Value> res = CompileRun( | 2435 v8::Local<v8::Value> res = CompileRun( |
| (...skipping 11 matching lines...) Expand all Loading... |
| 2447 } | 2447 } |
| 2448 | 2448 |
| 2449 | 2449 |
| 2450 static int CountMapTransitions(Map* map) { | 2450 static int CountMapTransitions(Map* map) { |
| 2451 return map->transitions()->number_of_transitions(); | 2451 return map->transitions()->number_of_transitions(); |
| 2452 } | 2452 } |
| 2453 | 2453 |
| 2454 | 2454 |
| 2455 // Test that map transitions are cleared and maps are collected with | 2455 // Test that map transitions are cleared and maps are collected with |
| 2456 // incremental marking as well. | 2456 // incremental marking as well. |
| 2457 TEST(Regress1465) { | 2457 TEST_TRACK_ALLOCATIONS(Regress1465) { |
| 2458 i::FLAG_stress_compaction = false; | 2458 i::FLAG_stress_compaction = false; |
| 2459 i::FLAG_allow_natives_syntax = true; | 2459 i::FLAG_allow_natives_syntax = true; |
| 2460 i::FLAG_trace_incremental_marking = true; | 2460 i::FLAG_trace_incremental_marking = true; |
| 2461 CcTest::InitializeVM(); | 2461 CcTest::InitializeVM(); |
| 2462 v8::HandleScope scope(CcTest::isolate()); | 2462 v8::HandleScope scope(CcTest::isolate()); |
| 2463 static const int transitions_count = 256; | 2463 static const int transitions_count = 256; |
| 2464 | 2464 |
| 2465 { | 2465 { |
| 2466 AlwaysAllocateScope always_allocate; | 2466 AlwaysAllocateScope always_allocate; |
| 2467 for (int i = 0; i < transitions_count; i++) { | 2467 for (int i = 0; i < transitions_count; i++) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2486 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); | 2486 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); |
| 2487 | 2487 |
| 2488 // Count number of live transitions after marking. Note that one transition | 2488 // Count number of live transitions after marking. Note that one transition |
| 2489 // is left, because 'o' still holds an instance of one transition target. | 2489 // is left, because 'o' still holds an instance of one transition target. |
| 2490 int transitions_after = CountMapTransitions(root->map()); | 2490 int transitions_after = CountMapTransitions(root->map()); |
| 2491 CompileRun("%DebugPrint(root);"); | 2491 CompileRun("%DebugPrint(root);"); |
| 2492 CHECK_EQ(1, transitions_after); | 2492 CHECK_EQ(1, transitions_after); |
| 2493 } | 2493 } |
| 2494 | 2494 |
| 2495 | 2495 |
| 2496 TEST(Regress2143a) { | 2496 TEST_TRACK_ALLOCATIONS(Regress2143a) { |
| 2497 i::FLAG_collect_maps = true; | 2497 i::FLAG_collect_maps = true; |
| 2498 i::FLAG_incremental_marking = true; | 2498 i::FLAG_incremental_marking = true; |
| 2499 CcTest::InitializeVM(); | 2499 CcTest::InitializeVM(); |
| 2500 v8::HandleScope scope(CcTest::isolate()); | 2500 v8::HandleScope scope(CcTest::isolate()); |
| 2501 | 2501 |
| 2502 // Prepare a map transition from the root object together with a yet | 2502 // Prepare a map transition from the root object together with a yet |
| 2503 // untransitioned root object. | 2503 // untransitioned root object. |
| 2504 CompileRun("var root = new Object;" | 2504 CompileRun("var root = new Object;" |
| 2505 "root.foo = 0;" | 2505 "root.foo = 0;" |
| 2506 "root = new Object;"); | 2506 "root = new Object;"); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 2526 v8::Utils::OpenHandle( | 2526 v8::Utils::OpenHandle( |
| 2527 *v8::Handle<v8::Object>::Cast( | 2527 *v8::Handle<v8::Object>::Cast( |
| 2528 v8::Context::GetCurrent()->Global()->Get(v8_str("root")))); | 2528 v8::Context::GetCurrent()->Global()->Get(v8_str("root")))); |
| 2529 | 2529 |
| 2530 // The root object should be in a sane state. | 2530 // The root object should be in a sane state. |
| 2531 CHECK(root->IsJSObject()); | 2531 CHECK(root->IsJSObject()); |
| 2532 CHECK(root->map()->IsMap()); | 2532 CHECK(root->map()->IsMap()); |
| 2533 } | 2533 } |
| 2534 | 2534 |
| 2535 | 2535 |
| 2536 TEST(Regress2143b) { | 2536 TEST_TRACK_ALLOCATIONS(Regress2143b) { |
| 2537 i::FLAG_collect_maps = true; | 2537 i::FLAG_collect_maps = true; |
| 2538 i::FLAG_incremental_marking = true; | 2538 i::FLAG_incremental_marking = true; |
| 2539 i::FLAG_allow_natives_syntax = true; | 2539 i::FLAG_allow_natives_syntax = true; |
| 2540 CcTest::InitializeVM(); | 2540 CcTest::InitializeVM(); |
| 2541 v8::HandleScope scope(CcTest::isolate()); | 2541 v8::HandleScope scope(CcTest::isolate()); |
| 2542 | 2542 |
| 2543 // Prepare a map transition from the root object together with a yet | 2543 // Prepare a map transition from the root object together with a yet |
| 2544 // untransitioned root object. | 2544 // untransitioned root object. |
| 2545 CompileRun("var root = new Object;" | 2545 CompileRun("var root = new Object;" |
| 2546 "root.foo = 0;" | 2546 "root.foo = 0;" |
| (...skipping 23 matching lines...) Expand all Loading... |
| 2570 v8::Utils::OpenHandle( | 2570 v8::Utils::OpenHandle( |
| 2571 *v8::Handle<v8::Object>::Cast( | 2571 *v8::Handle<v8::Object>::Cast( |
| 2572 v8::Context::GetCurrent()->Global()->Get(v8_str("root")))); | 2572 v8::Context::GetCurrent()->Global()->Get(v8_str("root")))); |
| 2573 | 2573 |
| 2574 // The root object should be in a sane state. | 2574 // The root object should be in a sane state. |
| 2575 CHECK(root->IsJSObject()); | 2575 CHECK(root->IsJSObject()); |
| 2576 CHECK(root->map()->IsMap()); | 2576 CHECK(root->map()->IsMap()); |
| 2577 } | 2577 } |
| 2578 | 2578 |
| 2579 | 2579 |
| 2580 TEST(ReleaseOverReservedPages) { | 2580 TEST_TRACK_ALLOCATIONS(ReleaseOverReservedPages) { |
| 2581 i::FLAG_trace_gc = true; | 2581 i::FLAG_trace_gc = true; |
| 2582 // The optimizer can allocate stuff, messing up the test. | 2582 // The optimizer can allocate stuff, messing up the test. |
| 2583 i::FLAG_crankshaft = false; | 2583 i::FLAG_crankshaft = false; |
| 2584 i::FLAG_always_opt = false; | 2584 i::FLAG_always_opt = false; |
| 2585 CcTest::InitializeVM(); | 2585 CcTest::InitializeVM(); |
| 2586 Isolate* isolate = CcTest::i_isolate(); | 2586 Isolate* isolate = CcTest::i_isolate(); |
| 2587 Factory* factory = isolate->factory(); | 2587 Factory* factory = isolate->factory(); |
| 2588 Heap* heap = isolate->heap(); | 2588 Heap* heap = isolate->heap(); |
| 2589 v8::HandleScope scope(CcTest::isolate()); | 2589 v8::HandleScope scope(CcTest::isolate()); |
| 2590 static const int number_of_test_pages = 20; | 2590 static const int number_of_test_pages = 20; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 2616 // where there are 2 pages left instead of 1, then we should increase the | 2616 // where there are 2 pages left instead of 1, then we should increase the |
| 2617 // size of the first page a little in SizeOfFirstPage in spaces.cc. The | 2617 // size of the first page a little in SizeOfFirstPage in spaces.cc. The |
| 2618 // first page should be small in order to reduce memory used when the VM | 2618 // first page should be small in order to reduce memory used when the VM |
| 2619 // boots, but if the 20 small arrays don't fit on the first page then that's | 2619 // boots, but if the 20 small arrays don't fit on the first page then that's |
| 2620 // an indication that it is too small. | 2620 // an indication that it is too small. |
| 2621 heap->CollectAllAvailableGarbage("triggered really hard"); | 2621 heap->CollectAllAvailableGarbage("triggered really hard"); |
| 2622 CHECK_EQ(1, old_pointer_space->CountTotalPages()); | 2622 CHECK_EQ(1, old_pointer_space->CountTotalPages()); |
| 2623 } | 2623 } |
| 2624 | 2624 |
| 2625 | 2625 |
| 2626 TEST(Regress2237) { | 2626 TEST_TRACK_ALLOCATIONS(Regress2237) { |
| 2627 i::FLAG_stress_compaction = false; | 2627 i::FLAG_stress_compaction = false; |
| 2628 CcTest::InitializeVM(); | 2628 CcTest::InitializeVM(); |
| 2629 Isolate* isolate = CcTest::i_isolate(); | 2629 Isolate* isolate = CcTest::i_isolate(); |
| 2630 Factory* factory = isolate->factory(); | 2630 Factory* factory = isolate->factory(); |
| 2631 v8::HandleScope scope(CcTest::isolate()); | 2631 v8::HandleScope scope(CcTest::isolate()); |
| 2632 Handle<String> slice(CcTest::heap()->empty_string()); | 2632 Handle<String> slice(CcTest::heap()->empty_string()); |
| 2633 | 2633 |
| 2634 { | 2634 { |
| 2635 // Generate a parent that lives in new-space. | 2635 // Generate a parent that lives in new-space. |
| 2636 v8::HandleScope inner_scope(CcTest::isolate()); | 2636 v8::HandleScope inner_scope(CcTest::isolate()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 2649 *slice.location() = *t.location(); | 2649 *slice.location() = *t.location(); |
| 2650 } | 2650 } |
| 2651 | 2651 |
| 2652 CHECK(SlicedString::cast(*slice)->parent()->IsSeqOneByteString()); | 2652 CHECK(SlicedString::cast(*slice)->parent()->IsSeqOneByteString()); |
| 2653 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); | 2653 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); |
| 2654 CHECK(SlicedString::cast(*slice)->parent()->IsSeqOneByteString()); | 2654 CHECK(SlicedString::cast(*slice)->parent()->IsSeqOneByteString()); |
| 2655 } | 2655 } |
| 2656 | 2656 |
| 2657 | 2657 |
| 2658 #ifdef OBJECT_PRINT | 2658 #ifdef OBJECT_PRINT |
| 2659 TEST(PrintSharedFunctionInfo) { | 2659 TEST_TRACK_ALLOCATIONS(PrintSharedFunctionInfo) { |
| 2660 CcTest::InitializeVM(); | 2660 CcTest::InitializeVM(); |
| 2661 v8::HandleScope scope(CcTest::isolate()); | 2661 v8::HandleScope scope(CcTest::isolate()); |
| 2662 const char* source = "f = function() { return 987654321; }\n" | 2662 const char* source = "f = function() { return 987654321; }\n" |
| 2663 "g = function() { return 123456789; }\n"; | 2663 "g = function() { return 123456789; }\n"; |
| 2664 CompileRun(source); | 2664 CompileRun(source); |
| 2665 Handle<JSFunction> g = | 2665 Handle<JSFunction> g = |
| 2666 v8::Utils::OpenHandle( | 2666 v8::Utils::OpenHandle( |
| 2667 *v8::Handle<v8::Function>::Cast( | 2667 *v8::Handle<v8::Function>::Cast( |
| 2668 v8::Context::GetCurrent()->Global()->Get(v8_str("g")))); | 2668 v8::Context::GetCurrent()->Global()->Get(v8_str("g")))); |
| 2669 | 2669 |
| 2670 DisallowHeapAllocation no_allocation; | 2670 DisallowHeapAllocation no_allocation; |
| 2671 g->shared()->PrintLn(); | 2671 g->shared()->PrintLn(); |
| 2672 } | 2672 } |
| 2673 #endif // OBJECT_PRINT | 2673 #endif // OBJECT_PRINT |
| 2674 | 2674 |
| 2675 | 2675 |
| 2676 TEST(Regress2211) { | 2676 TEST_TRACK_ALLOCATIONS(Regress2211) { |
| 2677 CcTest::InitializeVM(); | 2677 CcTest::InitializeVM(); |
| 2678 v8::HandleScope scope(CcTest::isolate()); | 2678 v8::HandleScope scope(CcTest::isolate()); |
| 2679 | 2679 |
| 2680 v8::Handle<v8::String> value = v8_str("val string"); | 2680 v8::Handle<v8::String> value = v8_str("val string"); |
| 2681 Smi* hash = Smi::FromInt(321); | 2681 Smi* hash = Smi::FromInt(321); |
| 2682 Heap* heap = CcTest::heap(); | 2682 Heap* heap = CcTest::heap(); |
| 2683 | 2683 |
| 2684 for (int i = 0; i < 2; i++) { | 2684 for (int i = 0; i < 2; i++) { |
| 2685 // Store identity hash first and common hidden property second. | 2685 // Store identity hash first and common hidden property second. |
| 2686 v8::Handle<v8::Object> obj = v8::Object::New(); | 2686 v8::Handle<v8::Object> obj = v8::Object::New(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2701 // Check size. | 2701 // Check size. |
| 2702 DescriptorArray* descriptors = internal_obj->map()->instance_descriptors(); | 2702 DescriptorArray* descriptors = internal_obj->map()->instance_descriptors(); |
| 2703 ObjectHashTable* hashtable = ObjectHashTable::cast( | 2703 ObjectHashTable* hashtable = ObjectHashTable::cast( |
| 2704 internal_obj->RawFastPropertyAt(descriptors->GetFieldIndex(0))); | 2704 internal_obj->RawFastPropertyAt(descriptors->GetFieldIndex(0))); |
| 2705 // HashTable header (5) and 4 initial entries (8). | 2705 // HashTable header (5) and 4 initial entries (8). |
| 2706 CHECK_LE(hashtable->SizeFor(hashtable->length()), 13 * kPointerSize); | 2706 CHECK_LE(hashtable->SizeFor(hashtable->length()), 13 * kPointerSize); |
| 2707 } | 2707 } |
| 2708 } | 2708 } |
| 2709 | 2709 |
| 2710 | 2710 |
| 2711 TEST(IncrementalMarkingClearsTypeFeedbackCells) { | 2711 TEST_TRACK_ALLOCATIONS(IncrementalMarkingClearsTypeFeedbackCells) { |
| 2712 if (i::FLAG_always_opt) return; | 2712 if (i::FLAG_always_opt) return; |
| 2713 CcTest::InitializeVM(); | 2713 CcTest::InitializeVM(); |
| 2714 v8::HandleScope scope(CcTest::isolate()); | 2714 v8::HandleScope scope(CcTest::isolate()); |
| 2715 v8::Local<v8::Value> fun1, fun2; | 2715 v8::Local<v8::Value> fun1, fun2; |
| 2716 | 2716 |
| 2717 { | 2717 { |
| 2718 LocalContext env; | 2718 LocalContext env; |
| 2719 CompileRun("function fun() {};"); | 2719 CompileRun("function fun() {};"); |
| 2720 fun1 = env->Global()->Get(v8_str("fun")); | 2720 fun1 = env->Global()->Get(v8_str("fun")); |
| 2721 } | 2721 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2760 RelocInfo* info = it.rinfo(); | 2760 RelocInfo* info = it.rinfo(); |
| 2761 Code* target = Code::GetCodeFromTargetAddress(info->target_address()); | 2761 Code* target = Code::GetCodeFromTargetAddress(info->target_address()); |
| 2762 if (target->is_inline_cache_stub() && target->kind() == kind) { | 2762 if (target->is_inline_cache_stub() && target->kind() == kind) { |
| 2763 return target; | 2763 return target; |
| 2764 } | 2764 } |
| 2765 } | 2765 } |
| 2766 return NULL; | 2766 return NULL; |
| 2767 } | 2767 } |
| 2768 | 2768 |
| 2769 | 2769 |
| 2770 TEST(IncrementalMarkingPreservesMonomorhpicIC) { | 2770 TEST_TRACK_ALLOCATIONS(IncrementalMarkingPreservesMonomorhpicIC) { |
| 2771 if (i::FLAG_always_opt) return; | 2771 if (i::FLAG_always_opt) return; |
| 2772 CcTest::InitializeVM(); | 2772 CcTest::InitializeVM(); |
| 2773 v8::HandleScope scope(CcTest::isolate()); | 2773 v8::HandleScope scope(CcTest::isolate()); |
| 2774 | 2774 |
| 2775 // Prepare function f that contains a monomorphic IC for object | 2775 // Prepare function f that contains a monomorphic IC for object |
| 2776 // originating from the same native context. | 2776 // originating from the same native context. |
| 2777 CompileRun("function fun() { this.x = 1; }; var obj = new fun();" | 2777 CompileRun("function fun() { this.x = 1; }; var obj = new fun();" |
| 2778 "function f(o) { return o.x; } f(obj); f(obj);"); | 2778 "function f(o) { return o.x; } f(obj); f(obj);"); |
| 2779 Handle<JSFunction> f = | 2779 Handle<JSFunction> f = |
| 2780 v8::Utils::OpenHandle( | 2780 v8::Utils::OpenHandle( |
| 2781 *v8::Handle<v8::Function>::Cast( | 2781 *v8::Handle<v8::Function>::Cast( |
| 2782 v8::Context::GetCurrent()->Global()->Get(v8_str("f")))); | 2782 v8::Context::GetCurrent()->Global()->Get(v8_str("f")))); |
| 2783 | 2783 |
| 2784 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC); | 2784 Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC); |
| 2785 CHECK(ic_before->ic_state() == MONOMORPHIC); | 2785 CHECK(ic_before->ic_state() == MONOMORPHIC); |
| 2786 | 2786 |
| 2787 SimulateIncrementalMarking(); | 2787 SimulateIncrementalMarking(); |
| 2788 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); | 2788 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); |
| 2789 | 2789 |
| 2790 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); | 2790 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); |
| 2791 CHECK(ic_after->ic_state() == MONOMORPHIC); | 2791 CHECK(ic_after->ic_state() == MONOMORPHIC); |
| 2792 } | 2792 } |
| 2793 | 2793 |
| 2794 | 2794 |
| 2795 TEST(IncrementalMarkingClearsMonomorhpicIC) { | 2795 TEST_TRACK_ALLOCATIONS(IncrementalMarkingClearsMonomorhpicIC) { |
| 2796 if (i::FLAG_always_opt) return; | 2796 if (i::FLAG_always_opt) return; |
| 2797 CcTest::InitializeVM(); | 2797 CcTest::InitializeVM(); |
| 2798 v8::HandleScope scope(CcTest::isolate()); | 2798 v8::HandleScope scope(CcTest::isolate()); |
| 2799 v8::Local<v8::Value> obj1; | 2799 v8::Local<v8::Value> obj1; |
| 2800 | 2800 |
| 2801 { | 2801 { |
| 2802 LocalContext env; | 2802 LocalContext env; |
| 2803 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); | 2803 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); |
| 2804 obj1 = env->Global()->Get(v8_str("obj")); | 2804 obj1 = env->Global()->Get(v8_str("obj")); |
| 2805 } | 2805 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2819 // Fire context dispose notification. | 2819 // Fire context dispose notification. |
| 2820 v8::V8::ContextDisposedNotification(); | 2820 v8::V8::ContextDisposedNotification(); |
| 2821 SimulateIncrementalMarking(); | 2821 SimulateIncrementalMarking(); |
| 2822 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); | 2822 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); |
| 2823 | 2823 |
| 2824 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); | 2824 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); |
| 2825 CHECK(ic_after->ic_state() == UNINITIALIZED); | 2825 CHECK(ic_after->ic_state() == UNINITIALIZED); |
| 2826 } | 2826 } |
| 2827 | 2827 |
| 2828 | 2828 |
| 2829 TEST(IncrementalMarkingClearsPolymorhpicIC) { | 2829 TEST_TRACK_ALLOCATIONS(IncrementalMarkingClearsPolymorhpicIC) { |
| 2830 if (i::FLAG_always_opt) return; | 2830 if (i::FLAG_always_opt) return; |
| 2831 CcTest::InitializeVM(); | 2831 CcTest::InitializeVM(); |
| 2832 v8::HandleScope scope(CcTest::isolate()); | 2832 v8::HandleScope scope(CcTest::isolate()); |
| 2833 v8::Local<v8::Value> obj1, obj2; | 2833 v8::Local<v8::Value> obj1, obj2; |
| 2834 | 2834 |
| 2835 { | 2835 { |
| 2836 LocalContext env; | 2836 LocalContext env; |
| 2837 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); | 2837 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); |
| 2838 obj1 = env->Global()->Get(v8_str("obj")); | 2838 obj1 = env->Global()->Get(v8_str("obj")); |
| 2839 } | 2839 } |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2954 // supposed to (untypically) write to the receiver, not the holder. This is | 2954 // supposed to (untypically) write to the receiver, not the holder. This is |
| 2955 // to emulate the behavior of a data property. | 2955 // to emulate the behavior of a data property. |
| 2956 | 2956 |
| 2957 ReleaseStackTraceDataTest(source1, getter); | 2957 ReleaseStackTraceDataTest(source1, getter); |
| 2958 ReleaseStackTraceDataTest(source2, getter); | 2958 ReleaseStackTraceDataTest(source2, getter); |
| 2959 ReleaseStackTraceDataTest(source3, getter); | 2959 ReleaseStackTraceDataTest(source3, getter); |
| 2960 ReleaseStackTraceDataTest(source4, getter); | 2960 ReleaseStackTraceDataTest(source4, getter); |
| 2961 } | 2961 } |
| 2962 | 2962 |
| 2963 | 2963 |
| 2964 TEST(Regression144230) { | 2964 TEST_TRACK_ALLOCATIONS(Regression144230) { |
| 2965 i::FLAG_stress_compaction = false; | 2965 i::FLAG_stress_compaction = false; |
| 2966 CcTest::InitializeVM(); | 2966 CcTest::InitializeVM(); |
| 2967 Isolate* isolate = CcTest::i_isolate(); | 2967 Isolate* isolate = CcTest::i_isolate(); |
| 2968 Heap* heap = isolate->heap(); | 2968 Heap* heap = isolate->heap(); |
| 2969 HandleScope scope(isolate); | 2969 HandleScope scope(isolate); |
| 2970 | 2970 |
| 2971 // First make sure that the uninitialized CallIC stub is on a single page | 2971 // First make sure that the uninitialized CallIC stub is on a single page |
| 2972 // that will later be selected as an evacuation candidate. | 2972 // that will later be selected as an evacuation candidate. |
| 2973 { | 2973 { |
| 2974 HandleScope inner_scope(isolate); | 2974 HandleScope inner_scope(isolate); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3017 // Now we are ready to mess up the heap. | 3017 // Now we are ready to mess up the heap. |
| 3018 heap->CollectAllGarbage(Heap::kReduceMemoryFootprintMask); | 3018 heap->CollectAllGarbage(Heap::kReduceMemoryFootprintMask); |
| 3019 | 3019 |
| 3020 // Either heap verification caught the problem already or we go kaboom once | 3020 // Either heap verification caught the problem already or we go kaboom once |
| 3021 // the CallIC is executed the next time. | 3021 // the CallIC is executed the next time. |
| 3022 JSReceiver::SetProperty(global, name, call_function, NONE, kNonStrictMode); | 3022 JSReceiver::SetProperty(global, name, call_function, NONE, kNonStrictMode); |
| 3023 CompileRun("call();"); | 3023 CompileRun("call();"); |
| 3024 } | 3024 } |
| 3025 | 3025 |
| 3026 | 3026 |
| 3027 TEST(Regress159140) { | 3027 TEST_TRACK_ALLOCATIONS(Regress159140) { |
| 3028 i::FLAG_allow_natives_syntax = true; | 3028 i::FLAG_allow_natives_syntax = true; |
| 3029 i::FLAG_flush_code_incrementally = true; | 3029 i::FLAG_flush_code_incrementally = true; |
| 3030 CcTest::InitializeVM(); | 3030 CcTest::InitializeVM(); |
| 3031 Isolate* isolate = CcTest::i_isolate(); | 3031 Isolate* isolate = CcTest::i_isolate(); |
| 3032 Heap* heap = isolate->heap(); | 3032 Heap* heap = isolate->heap(); |
| 3033 HandleScope scope(isolate); | 3033 HandleScope scope(isolate); |
| 3034 | 3034 |
| 3035 // Perform one initial GC to enable code flushing. | 3035 // Perform one initial GC to enable code flushing. |
| 3036 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); | 3036 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 3037 | 3037 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3079 // finish the GC to complete code flushing. | 3079 // finish the GC to complete code flushing. |
| 3080 SimulateIncrementalMarking(); | 3080 SimulateIncrementalMarking(); |
| 3081 CompileRun("%OptimizeFunctionOnNextCall(g); g(3);"); | 3081 CompileRun("%OptimizeFunctionOnNextCall(g); g(3);"); |
| 3082 heap->CollectAllGarbage(Heap::kNoGCFlags); | 3082 heap->CollectAllGarbage(Heap::kNoGCFlags); |
| 3083 | 3083 |
| 3084 // Unoptimized code is missing and the deoptimizer will go ballistic. | 3084 // Unoptimized code is missing and the deoptimizer will go ballistic. |
| 3085 CompileRun("g('bozo');"); | 3085 CompileRun("g('bozo');"); |
| 3086 } | 3086 } |
| 3087 | 3087 |
| 3088 | 3088 |
| 3089 TEST(Regress165495) { | 3089 TEST_TRACK_ALLOCATIONS(Regress165495) { |
| 3090 i::FLAG_allow_natives_syntax = true; | 3090 i::FLAG_allow_natives_syntax = true; |
| 3091 i::FLAG_flush_code_incrementally = true; | 3091 i::FLAG_flush_code_incrementally = true; |
| 3092 CcTest::InitializeVM(); | 3092 CcTest::InitializeVM(); |
| 3093 Isolate* isolate = CcTest::i_isolate(); | 3093 Isolate* isolate = CcTest::i_isolate(); |
| 3094 Heap* heap = isolate->heap(); | 3094 Heap* heap = isolate->heap(); |
| 3095 HandleScope scope(isolate); | 3095 HandleScope scope(isolate); |
| 3096 | 3096 |
| 3097 // Perform one initial GC to enable code flushing. | 3097 // Perform one initial GC to enable code flushing. |
| 3098 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); | 3098 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 3099 | 3099 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 3126 // even though it still is cached in the optimized code map. | 3126 // even though it still is cached in the optimized code map. |
| 3127 SimulateIncrementalMarking(); | 3127 SimulateIncrementalMarking(); |
| 3128 heap->CollectAllGarbage(Heap::kNoGCFlags); | 3128 heap->CollectAllGarbage(Heap::kNoGCFlags); |
| 3129 | 3129 |
| 3130 // Make a new closure that will get code installed from the code map. | 3130 // Make a new closure that will get code installed from the code map. |
| 3131 // Unoptimized code is missing and the deoptimizer will go ballistic. | 3131 // Unoptimized code is missing and the deoptimizer will go ballistic. |
| 3132 CompileRun("var g = mkClosure(); g('bozo');"); | 3132 CompileRun("var g = mkClosure(); g('bozo');"); |
| 3133 } | 3133 } |
| 3134 | 3134 |
| 3135 | 3135 |
| 3136 TEST(Regress169209) { | 3136 TEST_TRACK_ALLOCATIONS(Regress169209) { |
| 3137 i::FLAG_stress_compaction = false; | 3137 i::FLAG_stress_compaction = false; |
| 3138 i::FLAG_allow_natives_syntax = true; | 3138 i::FLAG_allow_natives_syntax = true; |
| 3139 i::FLAG_flush_code_incrementally = true; | 3139 i::FLAG_flush_code_incrementally = true; |
| 3140 | 3140 |
| 3141 CcTest::InitializeVM(); | 3141 CcTest::InitializeVM(); |
| 3142 Isolate* isolate = CcTest::i_isolate(); | 3142 Isolate* isolate = CcTest::i_isolate(); |
| 3143 Heap* heap = isolate->heap(); | 3143 Heap* heap = isolate->heap(); |
| 3144 HandleScope scope(isolate); | 3144 HandleScope scope(isolate); |
| 3145 | 3145 |
| 3146 // Perform one initial GC to enable code flushing. | 3146 // Perform one initial GC to enable code flushing. |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3214 int space_remaining = static_cast<int>( | 3214 int space_remaining = static_cast<int>( |
| 3215 *space->allocation_limit_address() - *space->allocation_top_address()); | 3215 *space->allocation_limit_address() - *space->allocation_top_address()); |
| 3216 CHECK(space_remaining >= extra_bytes); | 3216 CHECK(space_remaining >= extra_bytes); |
| 3217 int new_linear_size = space_remaining - extra_bytes; | 3217 int new_linear_size = space_remaining - extra_bytes; |
| 3218 v8::internal::MaybeObject* maybe = space->AllocateRaw(new_linear_size); | 3218 v8::internal::MaybeObject* maybe = space->AllocateRaw(new_linear_size); |
| 3219 v8::internal::FreeListNode* node = v8::internal::FreeListNode::cast(maybe); | 3219 v8::internal::FreeListNode* node = v8::internal::FreeListNode::cast(maybe); |
| 3220 node->set_size(space->heap(), new_linear_size); | 3220 node->set_size(space->heap(), new_linear_size); |
| 3221 } | 3221 } |
| 3222 | 3222 |
| 3223 | 3223 |
| 3224 TEST(Regress169928) { | 3224 TEST_TRACK_ALLOCATIONS(Regress169928) { |
| 3225 i::FLAG_allow_natives_syntax = true; | 3225 i::FLAG_allow_natives_syntax = true; |
| 3226 i::FLAG_crankshaft = false; | 3226 i::FLAG_crankshaft = false; |
| 3227 CcTest::InitializeVM(); | 3227 CcTest::InitializeVM(); |
| 3228 Isolate* isolate = CcTest::i_isolate(); | 3228 Isolate* isolate = CcTest::i_isolate(); |
| 3229 Factory* factory = isolate->factory(); | 3229 Factory* factory = isolate->factory(); |
| 3230 v8::HandleScope scope(CcTest::isolate()); | 3230 v8::HandleScope scope(CcTest::isolate()); |
| 3231 | 3231 |
| 3232 // Some flags turn Scavenge collections into Mark-sweep collections | 3232 // Some flags turn Scavenge collections into Mark-sweep collections |
| 3233 // and hence are incompatible with this test case. | 3233 // and hence are incompatible with this test case. |
| 3234 if (FLAG_gc_global || FLAG_stress_compaction) return; | 3234 if (FLAG_gc_global || FLAG_stress_compaction) return; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 3245 "obj = fastliteralcase(get_standard_literal(), 1);" | 3245 "obj = fastliteralcase(get_standard_literal(), 1);" |
| 3246 "obj = fastliteralcase(get_standard_literal(), 1.5);" | 3246 "obj = fastliteralcase(get_standard_literal(), 1.5);" |
| 3247 "obj = fastliteralcase(get_standard_literal(), 2);"); | 3247 "obj = fastliteralcase(get_standard_literal(), 2);"); |
| 3248 | 3248 |
| 3249 // prepare the heap | 3249 // prepare the heap |
| 3250 v8::Local<v8::String> mote_code_string = | 3250 v8::Local<v8::String> mote_code_string = |
| 3251 v8_str("fastliteralcase(mote, 2.5);"); | 3251 v8_str("fastliteralcase(mote, 2.5);"); |
| 3252 | 3252 |
| 3253 v8::Local<v8::String> array_name = v8_str("mote"); | 3253 v8::Local<v8::String> array_name = v8_str("mote"); |
| 3254 v8::Context::GetCurrent()->Global()->Set(array_name, v8::Int32::New(0)); | 3254 v8::Context::GetCurrent()->Global()->Set(array_name, v8::Int32::New(0)); |
| 3255 | |
| 3256 // First make sure we flip spaces | 3255 // First make sure we flip spaces |
| 3257 CcTest::heap()->CollectGarbage(NEW_SPACE); | 3256 CcTest::heap()->CollectGarbage(NEW_SPACE); |
| 3258 | 3257 |
| 3259 // Allocate the object. | 3258 // Allocate the object. |
| 3260 Handle<FixedArray> array_data = factory->NewFixedArray(2, NOT_TENURED); | 3259 Handle<FixedArray> array_data = factory->NewFixedArray(2, NOT_TENURED); |
| 3261 array_data->set(0, Smi::FromInt(1)); | 3260 array_data->set(0, Smi::FromInt(1)); |
| 3262 array_data->set(1, Smi::FromInt(2)); | 3261 array_data->set(1, Smi::FromInt(2)); |
| 3263 | 3262 |
| 3264 AllocateAllButNBytes(CcTest::heap()->new_space(), | 3263 AllocateAllButNBytes(CcTest::heap()->new_space(), |
| 3265 JSArray::kSize + AllocationMemento::kSize + | 3264 JSArray::kSize + AllocationMemento::kSize + |
| (...skipping 21 matching lines...) Expand all Loading... |
| 3287 v8::Handle<v8::Object> array_obj = v8::Utils::ToLocal(array); | 3286 v8::Handle<v8::Object> array_obj = v8::Utils::ToLocal(array); |
| 3288 v8::Context::GetCurrent()->Global()->Set(array_name, array_obj); | 3287 v8::Context::GetCurrent()->Global()->Set(array_name, array_obj); |
| 3289 | 3288 |
| 3290 // This should crash with a protection violation if we are running a build | 3289 // This should crash with a protection violation if we are running a build |
| 3291 // with the bug. | 3290 // with the bug. |
| 3292 AlwaysAllocateScope aa_scope; | 3291 AlwaysAllocateScope aa_scope; |
| 3293 v8::Script::Compile(mote_code_string)->Run(); | 3292 v8::Script::Compile(mote_code_string)->Run(); |
| 3294 } | 3293 } |
| 3295 | 3294 |
| 3296 | 3295 |
| 3297 TEST(Regress168801) { | 3296 TEST_TRACK_ALLOCATIONS(Regress168801) { |
| 3298 i::FLAG_always_compact = true; | 3297 i::FLAG_always_compact = true; |
| 3299 i::FLAG_cache_optimized_code = false; | 3298 i::FLAG_cache_optimized_code = false; |
| 3300 i::FLAG_allow_natives_syntax = true; | 3299 i::FLAG_allow_natives_syntax = true; |
| 3301 i::FLAG_flush_code_incrementally = true; | 3300 i::FLAG_flush_code_incrementally = true; |
| 3302 CcTest::InitializeVM(); | 3301 CcTest::InitializeVM(); |
| 3303 Isolate* isolate = CcTest::i_isolate(); | 3302 Isolate* isolate = CcTest::i_isolate(); |
| 3304 Heap* heap = isolate->heap(); | 3303 Heap* heap = isolate->heap(); |
| 3305 HandleScope scope(isolate); | 3304 HandleScope scope(isolate); |
| 3306 | 3305 |
| 3307 // Perform one initial GC to enable code flushing. | 3306 // Perform one initial GC to enable code flushing. |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3343 HandleScope inner_scope(isolate); | 3342 HandleScope inner_scope(isolate); |
| 3344 CompileRun("%OptimizeFunctionOnNextCall(f); f(3);"); | 3343 CompileRun("%OptimizeFunctionOnNextCall(f); f(3);"); |
| 3345 } | 3344 } |
| 3346 | 3345 |
| 3347 // This cycle will bust the heap and subsequent cycles will go ballistic. | 3346 // This cycle will bust the heap and subsequent cycles will go ballistic. |
| 3348 heap->CollectAllGarbage(Heap::kNoGCFlags); | 3347 heap->CollectAllGarbage(Heap::kNoGCFlags); |
| 3349 heap->CollectAllGarbage(Heap::kNoGCFlags); | 3348 heap->CollectAllGarbage(Heap::kNoGCFlags); |
| 3350 } | 3349 } |
| 3351 | 3350 |
| 3352 | 3351 |
| 3353 TEST(Regress173458) { | 3352 TEST_TRACK_ALLOCATIONS(Regress173458) { |
| 3354 i::FLAG_always_compact = true; | 3353 i::FLAG_always_compact = true; |
| 3355 i::FLAG_cache_optimized_code = false; | 3354 i::FLAG_cache_optimized_code = false; |
| 3356 i::FLAG_allow_natives_syntax = true; | 3355 i::FLAG_allow_natives_syntax = true; |
| 3357 i::FLAG_flush_code_incrementally = true; | 3356 i::FLAG_flush_code_incrementally = true; |
| 3358 CcTest::InitializeVM(); | 3357 CcTest::InitializeVM(); |
| 3359 Isolate* isolate = CcTest::i_isolate(); | 3358 Isolate* isolate = CcTest::i_isolate(); |
| 3360 Heap* heap = isolate->heap(); | 3359 Heap* heap = isolate->heap(); |
| 3361 HandleScope scope(isolate); | 3360 HandleScope scope(isolate); |
| 3362 | 3361 |
| 3363 // Perform one initial GC to enable code flushing. | 3362 // Perform one initial GC to enable code flushing. |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3404 heap->CollectAllGarbage(Heap::kNoGCFlags); | 3403 heap->CollectAllGarbage(Heap::kNoGCFlags); |
| 3405 } | 3404 } |
| 3406 | 3405 |
| 3407 | 3406 |
| 3408 class DummyVisitor : public ObjectVisitor { | 3407 class DummyVisitor : public ObjectVisitor { |
| 3409 public: | 3408 public: |
| 3410 void VisitPointers(Object** start, Object** end) { } | 3409 void VisitPointers(Object** start, Object** end) { } |
| 3411 }; | 3410 }; |
| 3412 | 3411 |
| 3413 | 3412 |
| 3414 TEST(DeferredHandles) { | 3413 TEST_TRACK_ALLOCATIONS(DeferredHandles) { |
| 3415 CcTest::InitializeVM(); | 3414 CcTest::InitializeVM(); |
| 3416 Isolate* isolate = CcTest::i_isolate(); | 3415 Isolate* isolate = CcTest::i_isolate(); |
| 3417 Heap* heap = isolate->heap(); | 3416 Heap* heap = isolate->heap(); |
| 3418 v8::HandleScope scope(reinterpret_cast<v8::Isolate*>(isolate)); | 3417 v8::HandleScope scope(reinterpret_cast<v8::Isolate*>(isolate)); |
| 3419 v8::ImplementationUtilities::HandleScopeData* data = | 3418 v8::ImplementationUtilities::HandleScopeData* data = |
| 3420 isolate->handle_scope_data(); | 3419 isolate->handle_scope_data(); |
| 3421 Handle<Object> init(heap->empty_string(), isolate); | 3420 Handle<Object> init(heap->empty_string(), isolate); |
| 3422 while (data->next < data->limit) { | 3421 while (data->next < data->limit) { |
| 3423 Handle<Object> obj(heap->empty_string(), isolate); | 3422 Handle<Object> obj(heap->empty_string(), isolate); |
| 3424 } | 3423 } |
| 3425 // An entire block of handles has been filled. | 3424 // An entire block of handles has been filled. |
| 3426 // Next handle would require a new block. | 3425 // Next handle would require a new block. |
| 3427 ASSERT(data->next == data->limit); | 3426 ASSERT(data->next == data->limit); |
| 3428 | 3427 |
| 3429 DeferredHandleScope deferred(isolate); | 3428 DeferredHandleScope deferred(isolate); |
| 3430 DummyVisitor visitor; | 3429 DummyVisitor visitor; |
| 3431 isolate->handle_scope_implementer()->Iterate(&visitor); | 3430 isolate->handle_scope_implementer()->Iterate(&visitor); |
| 3432 deferred.Detach(); | 3431 deferred.Detach(); |
| 3433 } | 3432 } |
| 3434 | 3433 |
| 3435 | 3434 |
| 3436 TEST(IncrementalMarkingStepMakesBigProgressWithLargeObjects) { | 3435 TEST_TRACK_ALLOCATIONS(IncrementalMarkingStepMakesBigProgressWithLargeObjects) { |
| 3437 CcTest::InitializeVM(); | 3436 CcTest::InitializeVM(); |
| 3438 v8::HandleScope scope(CcTest::isolate()); | 3437 v8::HandleScope scope(CcTest::isolate()); |
| 3439 CompileRun("function f(n) {" | 3438 CompileRun("function f(n) {" |
| 3440 " var a = new Array(n);" | 3439 " var a = new Array(n);" |
| 3441 " for (var i = 0; i < n; i += 100) a[i] = i;" | 3440 " for (var i = 0; i < n; i += 100) a[i] = i;" |
| 3442 "};" | 3441 "};" |
| 3443 "f(10 * 1024 * 1024);"); | 3442 "f(10 * 1024 * 1024);"); |
| 3444 IncrementalMarking* marking = CcTest::heap()->incremental_marking(); | 3443 IncrementalMarking* marking = CcTest::heap()->incremental_marking(); |
| 3445 if (marking->IsStopped()) marking->Start(); | 3444 if (marking->IsStopped()) marking->Start(); |
| 3446 // This big step should be sufficient to mark the whole array. | 3445 // This big step should be sufficient to mark the whole array. |
| 3447 marking->Step(100 * MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD); | 3446 marking->Step(100 * MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD); |
| 3448 ASSERT(marking->IsComplete()); | 3447 ASSERT(marking->IsComplete()); |
| 3449 } | 3448 } |
| OLD | NEW |