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 1344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1355 CHECK(!function->is_compiled() || function->IsOptimized() || | 1355 CHECK(!function->is_compiled() || function->IsOptimized() || |
1356 function->IsInterpreted()); | 1356 function->IsInterpreted()); |
1357 // Call foo to get it recompiled. | 1357 // Call foo to get it recompiled. |
1358 CompileRun("foo()"); | 1358 CompileRun("foo()"); |
1359 CHECK(function->shared()->is_compiled()); | 1359 CHECK(function->shared()->is_compiled()); |
1360 CHECK(function->is_compiled()); | 1360 CHECK(function->is_compiled()); |
1361 } | 1361 } |
1362 | 1362 |
1363 | 1363 |
1364 TEST(TestCodeFlushingIncremental) { | 1364 TEST(TestCodeFlushingIncremental) { |
| 1365 if (!i::FLAG_incremental_marking) return; |
1365 // If we do not flush code this test is invalid. | 1366 // If we do not flush code this test is invalid. |
1366 if (!FLAG_flush_code) return; | 1367 if (!FLAG_flush_code) return; |
1367 i::FLAG_allow_natives_syntax = true; | 1368 i::FLAG_allow_natives_syntax = true; |
1368 i::FLAG_optimize_for_size = false; | 1369 i::FLAG_optimize_for_size = false; |
1369 CcTest::InitializeVM(); | 1370 CcTest::InitializeVM(); |
1370 Isolate* isolate = CcTest::i_isolate(); | 1371 Isolate* isolate = CcTest::i_isolate(); |
1371 Factory* factory = isolate->factory(); | 1372 Factory* factory = isolate->factory(); |
1372 v8::HandleScope scope(CcTest::isolate()); | 1373 v8::HandleScope scope(CcTest::isolate()); |
1373 const char* source = "function foo() {" | 1374 const char* source = "function foo() {" |
1374 " var x = 42;" | 1375 " var x = 42;" |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1427 } | 1428 } |
1428 | 1429 |
1429 // Simulate one final GC to make sure the candidate queue is sane. | 1430 // Simulate one final GC to make sure the candidate queue is sane. |
1430 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); | 1431 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
1431 CHECK(function->shared()->is_compiled() || !function->IsOptimized()); | 1432 CHECK(function->shared()->is_compiled() || !function->IsOptimized()); |
1432 CHECK(function->is_compiled() || !function->IsOptimized()); | 1433 CHECK(function->is_compiled() || !function->IsOptimized()); |
1433 } | 1434 } |
1434 | 1435 |
1435 | 1436 |
1436 TEST(TestCodeFlushingIncrementalScavenge) { | 1437 TEST(TestCodeFlushingIncrementalScavenge) { |
| 1438 if (!FLAG_incremental_marking) return; |
1437 // If we do not flush code this test is invalid. | 1439 // If we do not flush code this test is invalid. |
1438 if (!FLAG_flush_code) return; | 1440 if (!FLAG_flush_code) return; |
1439 i::FLAG_allow_natives_syntax = true; | 1441 i::FLAG_allow_natives_syntax = true; |
1440 i::FLAG_optimize_for_size = false; | 1442 i::FLAG_optimize_for_size = false; |
1441 CcTest::InitializeVM(); | 1443 CcTest::InitializeVM(); |
1442 Isolate* isolate = CcTest::i_isolate(); | 1444 Isolate* isolate = CcTest::i_isolate(); |
1443 Factory* factory = isolate->factory(); | 1445 Factory* factory = isolate->factory(); |
1444 v8::HandleScope scope(CcTest::isolate()); | 1446 v8::HandleScope scope(CcTest::isolate()); |
1445 const char* source = "var foo = function() {" | 1447 const char* source = "var foo = function() {" |
1446 " var x = 42;" | 1448 " var x = 42;" |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1498 // Simulate one final GC to make sure the candidate queue is sane. | 1500 // Simulate one final GC to make sure the candidate queue is sane. |
1499 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); | 1501 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
1500 CHECK(!function->shared()->is_compiled() || function->IsOptimized() || | 1502 CHECK(!function->shared()->is_compiled() || function->IsOptimized() || |
1501 function->IsInterpreted()); | 1503 function->IsInterpreted()); |
1502 CHECK(!function->is_compiled() || function->IsOptimized() || | 1504 CHECK(!function->is_compiled() || function->IsOptimized() || |
1503 function->IsInterpreted()); | 1505 function->IsInterpreted()); |
1504 } | 1506 } |
1505 | 1507 |
1506 | 1508 |
1507 TEST(TestCodeFlushingIncrementalAbort) { | 1509 TEST(TestCodeFlushingIncrementalAbort) { |
| 1510 if (!i::FLAG_incremental_marking) return; |
1508 // If we do not flush code this test is invalid. | 1511 // If we do not flush code this test is invalid. |
1509 if (!FLAG_flush_code) return; | 1512 if (!FLAG_flush_code) return; |
1510 i::FLAG_allow_natives_syntax = true; | 1513 i::FLAG_allow_natives_syntax = true; |
1511 i::FLAG_optimize_for_size = false; | 1514 i::FLAG_optimize_for_size = false; |
1512 CcTest::InitializeVM(); | 1515 CcTest::InitializeVM(); |
1513 Isolate* isolate = CcTest::i_isolate(); | 1516 Isolate* isolate = CcTest::i_isolate(); |
1514 Factory* factory = isolate->factory(); | 1517 Factory* factory = isolate->factory(); |
1515 Heap* heap = isolate->heap(); | 1518 Heap* heap = isolate->heap(); |
1516 v8::HandleScope scope(CcTest::isolate()); | 1519 v8::HandleScope scope(CcTest::isolate()); |
1517 const char* source = "function foo() {" | 1520 const char* source = "function foo() {" |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1564 CompileRun("%OptimizeFunctionOnNextCall(foo); foo();"); | 1567 CompileRun("%OptimizeFunctionOnNextCall(foo); foo();"); |
1565 } | 1568 } |
1566 | 1569 |
1567 // Simulate one final GC to make sure the candidate queue is sane. | 1570 // Simulate one final GC to make sure the candidate queue is sane. |
1568 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); | 1571 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
1569 CHECK(function->shared()->is_compiled() || !function->IsOptimized()); | 1572 CHECK(function->shared()->is_compiled() || !function->IsOptimized()); |
1570 CHECK(function->is_compiled() || !function->IsOptimized()); | 1573 CHECK(function->is_compiled() || !function->IsOptimized()); |
1571 } | 1574 } |
1572 | 1575 |
1573 TEST(TestUseOfIncrementalBarrierOnCompileLazy) { | 1576 TEST(TestUseOfIncrementalBarrierOnCompileLazy) { |
| 1577 if (!i::FLAG_incremental_marking) return; |
1574 // Turn off always_opt because it interferes with running the built-in for | 1578 // Turn off always_opt because it interferes with running the built-in for |
1575 // the last call to g(). | 1579 // the last call to g(). |
1576 i::FLAG_always_opt = false; | 1580 i::FLAG_always_opt = false; |
1577 i::FLAG_allow_natives_syntax = true; | 1581 i::FLAG_allow_natives_syntax = true; |
1578 CcTest::InitializeVM(); | 1582 CcTest::InitializeVM(); |
1579 Isolate* isolate = CcTest::i_isolate(); | 1583 Isolate* isolate = CcTest::i_isolate(); |
1580 Factory* factory = isolate->factory(); | 1584 Factory* factory = isolate->factory(); |
1581 Heap* heap = isolate->heap(); | 1585 Heap* heap = isolate->heap(); |
1582 v8::HandleScope scope(CcTest::isolate()); | 1586 v8::HandleScope scope(CcTest::isolate()); |
1583 | 1587 |
(...skipping 1017 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2601 } | 2605 } |
2602 CcTest::CollectAllAvailableGarbage(); | 2606 CcTest::CollectAllAvailableGarbage(); |
2603 CHECK_EQ(1, NumberOfGlobalObjects()); | 2607 CHECK_EQ(1, NumberOfGlobalObjects()); |
2604 ctx2p.Reset(); | 2608 ctx2p.Reset(); |
2605 CcTest::CollectAllAvailableGarbage(); | 2609 CcTest::CollectAllAvailableGarbage(); |
2606 CHECK_EQ(0, NumberOfGlobalObjects()); | 2610 CHECK_EQ(0, NumberOfGlobalObjects()); |
2607 } | 2611 } |
2608 | 2612 |
2609 | 2613 |
2610 TEST(InstanceOfStubWriteBarrier) { | 2614 TEST(InstanceOfStubWriteBarrier) { |
| 2615 if (!i::FLAG_incremental_marking) return; |
2611 i::FLAG_allow_natives_syntax = true; | 2616 i::FLAG_allow_natives_syntax = true; |
2612 #ifdef VERIFY_HEAP | 2617 #ifdef VERIFY_HEAP |
2613 i::FLAG_verify_heap = true; | 2618 i::FLAG_verify_heap = true; |
2614 #endif | 2619 #endif |
2615 | 2620 |
2616 CcTest::InitializeVM(); | 2621 CcTest::InitializeVM(); |
2617 if (!CcTest::i_isolate()->use_crankshaft()) return; | 2622 if (!CcTest::i_isolate()->use_crankshaft()) return; |
2618 if (i::FLAG_force_marking_deque_overflows) return; | 2623 if (i::FLAG_force_marking_deque_overflows) return; |
2619 v8::HandleScope outer_scope(CcTest::isolate()); | 2624 v8::HandleScope outer_scope(CcTest::isolate()); |
2620 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); | 2625 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2667 namespace { | 2672 namespace { |
2668 | 2673 |
2669 int GetProfilerTicks(SharedFunctionInfo* shared) { | 2674 int GetProfilerTicks(SharedFunctionInfo* shared) { |
2670 return FLAG_ignition || FLAG_turbo ? shared->profiler_ticks() | 2675 return FLAG_ignition || FLAG_turbo ? shared->profiler_ticks() |
2671 : shared->code()->profiler_ticks(); | 2676 : shared->code()->profiler_ticks(); |
2672 } | 2677 } |
2673 | 2678 |
2674 } // namespace | 2679 } // namespace |
2675 | 2680 |
2676 TEST(ResetSharedFunctionInfoCountersDuringIncrementalMarking) { | 2681 TEST(ResetSharedFunctionInfoCountersDuringIncrementalMarking) { |
| 2682 if (!i::FLAG_incremental_marking) return; |
2677 i::FLAG_stress_compaction = false; | 2683 i::FLAG_stress_compaction = false; |
2678 i::FLAG_allow_natives_syntax = true; | 2684 i::FLAG_allow_natives_syntax = true; |
2679 #ifdef VERIFY_HEAP | 2685 #ifdef VERIFY_HEAP |
2680 i::FLAG_verify_heap = true; | 2686 i::FLAG_verify_heap = true; |
2681 #endif | 2687 #endif |
2682 | 2688 |
2683 CcTest::InitializeVM(); | 2689 CcTest::InitializeVM(); |
2684 if (!CcTest::i_isolate()->use_crankshaft()) return; | 2690 if (!CcTest::i_isolate()->use_crankshaft()) return; |
2685 v8::HandleScope outer_scope(CcTest::isolate()); | 2691 v8::HandleScope outer_scope(CcTest::isolate()); |
2686 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); | 2692 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2758 CcTest::isolate()->ContextDisposedNotification(); | 2764 CcTest::isolate()->ContextDisposedNotification(); |
2759 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); | 2765 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
2760 | 2766 |
2761 CHECK_EQ(CcTest::heap()->global_ic_age(), f->shared()->ic_age()); | 2767 CHECK_EQ(CcTest::heap()->global_ic_age(), f->shared()->ic_age()); |
2762 CHECK_EQ(0, f->shared()->opt_count()); | 2768 CHECK_EQ(0, f->shared()->opt_count()); |
2763 CHECK_EQ(0, GetProfilerTicks(f->shared())); | 2769 CHECK_EQ(0, GetProfilerTicks(f->shared())); |
2764 } | 2770 } |
2765 | 2771 |
2766 | 2772 |
2767 HEAP_TEST(GCFlags) { | 2773 HEAP_TEST(GCFlags) { |
| 2774 if (!i::FLAG_incremental_marking) return; |
2768 CcTest::InitializeVM(); | 2775 CcTest::InitializeVM(); |
2769 Heap* heap = CcTest::heap(); | 2776 Heap* heap = CcTest::heap(); |
2770 | 2777 |
2771 heap->set_current_gc_flags(Heap::kNoGCFlags); | 2778 heap->set_current_gc_flags(Heap::kNoGCFlags); |
2772 CHECK_EQ(Heap::kNoGCFlags, heap->current_gc_flags_); | 2779 CHECK_EQ(Heap::kNoGCFlags, heap->current_gc_flags_); |
2773 | 2780 |
2774 // Set the flags to check whether we appropriately resets them after the GC. | 2781 // Set the flags to check whether we appropriately resets them after the GC. |
2775 heap->set_current_gc_flags(Heap::kAbortIncrementalMarkingMask); | 2782 heap->set_current_gc_flags(Heap::kAbortIncrementalMarkingMask); |
2776 CcTest::CollectAllGarbage(Heap::kReduceMemoryFootprintMask); | 2783 CcTest::CollectAllGarbage(Heap::kReduceMemoryFootprintMask); |
2777 CHECK_EQ(Heap::kNoGCFlags, heap->current_gc_flags_); | 2784 CHECK_EQ(Heap::kNoGCFlags, heap->current_gc_flags_); |
(...skipping 12 matching lines...) Expand all Loading... |
2790 CcTest::CollectGarbage(NEW_SPACE); | 2797 CcTest::CollectGarbage(NEW_SPACE); |
2791 // NewSpace scavenges should not overwrite the flags. | 2798 // NewSpace scavenges should not overwrite the flags. |
2792 CHECK_NE(0, heap->current_gc_flags_ & Heap::kReduceMemoryFootprintMask); | 2799 CHECK_NE(0, heap->current_gc_flags_ & Heap::kReduceMemoryFootprintMask); |
2793 | 2800 |
2794 CcTest::CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); | 2801 CcTest::CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
2795 CHECK_EQ(Heap::kNoGCFlags, heap->current_gc_flags_); | 2802 CHECK_EQ(Heap::kNoGCFlags, heap->current_gc_flags_); |
2796 } | 2803 } |
2797 | 2804 |
2798 | 2805 |
2799 TEST(IdleNotificationFinishMarking) { | 2806 TEST(IdleNotificationFinishMarking) { |
| 2807 if (!i::FLAG_incremental_marking) return; |
2800 i::FLAG_allow_natives_syntax = true; | 2808 i::FLAG_allow_natives_syntax = true; |
2801 CcTest::InitializeVM(); | 2809 CcTest::InitializeVM(); |
2802 const int initial_gc_count = CcTest::heap()->gc_count(); | 2810 const int initial_gc_count = CcTest::heap()->gc_count(); |
2803 heap::SimulateFullSpace(CcTest::heap()->old_space()); | 2811 heap::SimulateFullSpace(CcTest::heap()->old_space()); |
2804 IncrementalMarking* marking = CcTest::heap()->incremental_marking(); | 2812 IncrementalMarking* marking = CcTest::heap()->incremental_marking(); |
2805 marking->Stop(); | 2813 marking->Stop(); |
2806 CcTest::heap()->StartIncrementalMarking(i::Heap::kNoGCFlags, | 2814 CcTest::heap()->StartIncrementalMarking(i::Heap::kNoGCFlags, |
2807 i::GarbageCollectionReason::kTesting); | 2815 i::GarbageCollectionReason::kTesting); |
2808 | 2816 |
2809 CHECK_EQ(CcTest::heap()->gc_count(), initial_gc_count); | 2817 CHECK_EQ(CcTest::heap()->gc_count(), initial_gc_count); |
(...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3289 | 3297 |
3290 | 3298 |
3291 static int CountMapTransitions(Map* map) { | 3299 static int CountMapTransitions(Map* map) { |
3292 return TransitionArray::NumberOfTransitions(map->raw_transitions()); | 3300 return TransitionArray::NumberOfTransitions(map->raw_transitions()); |
3293 } | 3301 } |
3294 | 3302 |
3295 | 3303 |
3296 // Test that map transitions are cleared and maps are collected with | 3304 // Test that map transitions are cleared and maps are collected with |
3297 // incremental marking as well. | 3305 // incremental marking as well. |
3298 TEST(Regress1465) { | 3306 TEST(Regress1465) { |
| 3307 if (!i::FLAG_incremental_marking) return; |
3299 i::FLAG_stress_compaction = false; | 3308 i::FLAG_stress_compaction = false; |
3300 i::FLAG_allow_natives_syntax = true; | 3309 i::FLAG_allow_natives_syntax = true; |
3301 i::FLAG_trace_incremental_marking = true; | 3310 i::FLAG_trace_incremental_marking = true; |
3302 i::FLAG_retain_maps_for_n_gc = 0; | 3311 i::FLAG_retain_maps_for_n_gc = 0; |
3303 CcTest::InitializeVM(); | 3312 CcTest::InitializeVM(); |
3304 v8::HandleScope scope(CcTest::isolate()); | 3313 v8::HandleScope scope(CcTest::isolate()); |
3305 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); | 3314 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); |
3306 static const int transitions_count = 256; | 3315 static const int transitions_count = 256; |
3307 | 3316 |
3308 CompileRun("function F() {}"); | 3317 CompileRun("function F() {}"); |
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3664 CcTest::global()->Get(ctx, v8_str("g")).ToLocalChecked()))); | 3673 CcTest::global()->Get(ctx, v8_str("g")).ToLocalChecked()))); |
3665 | 3674 |
3666 OFStream os(stdout); | 3675 OFStream os(stdout); |
3667 g->shared()->Print(os); | 3676 g->shared()->Print(os); |
3668 os << std::endl; | 3677 os << std::endl; |
3669 } | 3678 } |
3670 #endif // OBJECT_PRINT | 3679 #endif // OBJECT_PRINT |
3671 | 3680 |
3672 | 3681 |
3673 TEST(IncrementalMarkingPreservesMonomorphicCallIC) { | 3682 TEST(IncrementalMarkingPreservesMonomorphicCallIC) { |
| 3683 if (!FLAG_incremental_marking) return; |
3674 if (i::FLAG_always_opt) return; | 3684 if (i::FLAG_always_opt) return; |
3675 CcTest::InitializeVM(); | 3685 CcTest::InitializeVM(); |
3676 v8::HandleScope scope(CcTest::isolate()); | 3686 v8::HandleScope scope(CcTest::isolate()); |
3677 v8::Local<v8::Value> fun1, fun2; | 3687 v8::Local<v8::Value> fun1, fun2; |
3678 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); | 3688 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); |
3679 { | 3689 { |
3680 CompileRun("function fun() {};"); | 3690 CompileRun("function fun() {};"); |
3681 fun1 = CcTest::global()->Get(ctx, v8_str("fun")).ToLocalChecked(); | 3691 fun1 = CcTest::global()->Get(ctx, v8_str("fun")).ToLocalChecked(); |
3682 } | 3692 } |
3683 | 3693 |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3739 LoadICNexus nexus(vector, slot); | 3749 LoadICNexus nexus(vector, slot); |
3740 CHECK(nexus.StateFromFeedback() == desired_state); | 3750 CHECK(nexus.StateFromFeedback() == desired_state); |
3741 } else { | 3751 } else { |
3742 CHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, vector->GetKind(slot)); | 3752 CHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, vector->GetKind(slot)); |
3743 KeyedLoadICNexus nexus(vector, slot); | 3753 KeyedLoadICNexus nexus(vector, slot); |
3744 CHECK(nexus.StateFromFeedback() == desired_state); | 3754 CHECK(nexus.StateFromFeedback() == desired_state); |
3745 } | 3755 } |
3746 } | 3756 } |
3747 | 3757 |
3748 TEST(IncrementalMarkingPreservesMonomorphicConstructor) { | 3758 TEST(IncrementalMarkingPreservesMonomorphicConstructor) { |
| 3759 if (!i::FLAG_incremental_marking) return; |
3749 if (i::FLAG_always_opt) return; | 3760 if (i::FLAG_always_opt) return; |
3750 CcTest::InitializeVM(); | 3761 CcTest::InitializeVM(); |
3751 v8::HandleScope scope(CcTest::isolate()); | 3762 v8::HandleScope scope(CcTest::isolate()); |
3752 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); | 3763 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); |
3753 // Prepare function f that contains a monomorphic IC for object | 3764 // Prepare function f that contains a monomorphic IC for object |
3754 // originating from the same native context. | 3765 // originating from the same native context. |
3755 CompileRun( | 3766 CompileRun( |
3756 "function fun() { this.x = 1; };" | 3767 "function fun() { this.x = 1; };" |
3757 "function f(o) { return new o(); } f(fun); f(fun);"); | 3768 "function f(o) { return new o(); } f(fun); f(fun);"); |
3758 Handle<JSFunction> f = Handle<JSFunction>::cast( | 3769 Handle<JSFunction> f = Handle<JSFunction>::cast( |
3759 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast( | 3770 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast( |
3760 CcTest::global()->Get(ctx, v8_str("f")).ToLocalChecked()))); | 3771 CcTest::global()->Get(ctx, v8_str("f")).ToLocalChecked()))); |
3761 | 3772 |
3762 Handle<TypeFeedbackVector> vector(f->feedback_vector()); | 3773 Handle<TypeFeedbackVector> vector(f->feedback_vector()); |
3763 CHECK(vector->Get(FeedbackVectorSlot(0))->IsWeakCell()); | 3774 CHECK(vector->Get(FeedbackVectorSlot(0))->IsWeakCell()); |
3764 | 3775 |
3765 heap::SimulateIncrementalMarking(CcTest::heap()); | 3776 heap::SimulateIncrementalMarking(CcTest::heap()); |
3766 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); | 3777 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
3767 | 3778 |
3768 CHECK(vector->Get(FeedbackVectorSlot(0))->IsWeakCell()); | 3779 CHECK(vector->Get(FeedbackVectorSlot(0))->IsWeakCell()); |
3769 } | 3780 } |
3770 | 3781 |
3771 TEST(IncrementalMarkingPreservesMonomorphicIC) { | 3782 TEST(IncrementalMarkingPreservesMonomorphicIC) { |
| 3783 if (!i::FLAG_incremental_marking) return; |
3772 if (i::FLAG_always_opt) return; | 3784 if (i::FLAG_always_opt) return; |
3773 CcTest::InitializeVM(); | 3785 CcTest::InitializeVM(); |
3774 v8::HandleScope scope(CcTest::isolate()); | 3786 v8::HandleScope scope(CcTest::isolate()); |
3775 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); | 3787 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); |
3776 // Prepare function f that contains a monomorphic IC for object | 3788 // Prepare function f that contains a monomorphic IC for object |
3777 // originating from the same native context. | 3789 // originating from the same native context. |
3778 CompileRun("function fun() { this.x = 1; }; var obj = new fun();" | 3790 CompileRun("function fun() { this.x = 1; }; var obj = new fun();" |
3779 "function f(o) { return o.x; } f(obj); f(obj);"); | 3791 "function f(o) { return o.x; } f(obj); f(obj);"); |
3780 Handle<JSFunction> f = Handle<JSFunction>::cast( | 3792 Handle<JSFunction> f = Handle<JSFunction>::cast( |
3781 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast( | 3793 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast( |
3782 CcTest::global()->Get(ctx, v8_str("f")).ToLocalChecked()))); | 3794 CcTest::global()->Get(ctx, v8_str("f")).ToLocalChecked()))); |
3783 | 3795 |
3784 CheckVectorIC(f, 0, MONOMORPHIC); | 3796 CheckVectorIC(f, 0, MONOMORPHIC); |
3785 | 3797 |
3786 heap::SimulateIncrementalMarking(CcTest::heap()); | 3798 heap::SimulateIncrementalMarking(CcTest::heap()); |
3787 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); | 3799 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
3788 | 3800 |
3789 CheckVectorIC(f, 0, MONOMORPHIC); | 3801 CheckVectorIC(f, 0, MONOMORPHIC); |
3790 } | 3802 } |
3791 | 3803 |
3792 TEST(IncrementalMarkingPreservesPolymorphicIC) { | 3804 TEST(IncrementalMarkingPreservesPolymorphicIC) { |
| 3805 if (!i::FLAG_incremental_marking) return; |
3793 if (i::FLAG_always_opt) return; | 3806 if (i::FLAG_always_opt) return; |
3794 CcTest::InitializeVM(); | 3807 CcTest::InitializeVM(); |
3795 v8::HandleScope scope(CcTest::isolate()); | 3808 v8::HandleScope scope(CcTest::isolate()); |
3796 v8::Local<v8::Value> obj1, obj2; | 3809 v8::Local<v8::Value> obj1, obj2; |
3797 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); | 3810 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); |
3798 | 3811 |
3799 { | 3812 { |
3800 LocalContext env; | 3813 LocalContext env; |
3801 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); | 3814 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); |
3802 obj1 = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked(); | 3815 obj1 = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked(); |
(...skipping 17 matching lines...) Expand all Loading... |
3820 CheckVectorIC(f, 0, POLYMORPHIC); | 3833 CheckVectorIC(f, 0, POLYMORPHIC); |
3821 | 3834 |
3822 // Fire context dispose notification. | 3835 // Fire context dispose notification. |
3823 heap::SimulateIncrementalMarking(CcTest::heap()); | 3836 heap::SimulateIncrementalMarking(CcTest::heap()); |
3824 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); | 3837 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
3825 | 3838 |
3826 CheckVectorIC(f, 0, POLYMORPHIC); | 3839 CheckVectorIC(f, 0, POLYMORPHIC); |
3827 } | 3840 } |
3828 | 3841 |
3829 TEST(ContextDisposeDoesntClearPolymorphicIC) { | 3842 TEST(ContextDisposeDoesntClearPolymorphicIC) { |
| 3843 if (!i::FLAG_incremental_marking) return; |
3830 if (i::FLAG_always_opt) return; | 3844 if (i::FLAG_always_opt) return; |
3831 CcTest::InitializeVM(); | 3845 CcTest::InitializeVM(); |
3832 v8::HandleScope scope(CcTest::isolate()); | 3846 v8::HandleScope scope(CcTest::isolate()); |
3833 v8::Local<v8::Value> obj1, obj2; | 3847 v8::Local<v8::Value> obj1, obj2; |
3834 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); | 3848 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); |
3835 | 3849 |
3836 { | 3850 { |
3837 LocalContext env; | 3851 LocalContext env; |
3838 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); | 3852 CompileRun("function fun() { this.x = 1; }; var obj = new fun();"); |
3839 obj1 = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked(); | 3853 obj1 = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked(); |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3975 ReleaseStackTraceDataTest(isolate, source1, getter); | 3989 ReleaseStackTraceDataTest(isolate, source1, getter); |
3976 ReleaseStackTraceDataTest(isolate, source2, getter); | 3990 ReleaseStackTraceDataTest(isolate, source2, getter); |
3977 ReleaseStackTraceDataTest(isolate, source3, getter); | 3991 ReleaseStackTraceDataTest(isolate, source3, getter); |
3978 ReleaseStackTraceDataTest(isolate, source4, getter); | 3992 ReleaseStackTraceDataTest(isolate, source4, getter); |
3979 } | 3993 } |
3980 isolate->Dispose(); | 3994 isolate->Dispose(); |
3981 } | 3995 } |
3982 | 3996 |
3983 | 3997 |
3984 TEST(Regress159140) { | 3998 TEST(Regress159140) { |
| 3999 if (!i::FLAG_incremental_marking) return; |
3985 i::FLAG_allow_natives_syntax = true; | 4000 i::FLAG_allow_natives_syntax = true; |
3986 CcTest::InitializeVM(); | 4001 CcTest::InitializeVM(); |
3987 Isolate* isolate = CcTest::i_isolate(); | 4002 Isolate* isolate = CcTest::i_isolate(); |
3988 LocalContext env; | 4003 LocalContext env; |
3989 Heap* heap = isolate->heap(); | 4004 Heap* heap = isolate->heap(); |
3990 HandleScope scope(isolate); | 4005 HandleScope scope(isolate); |
3991 | 4006 |
3992 // Perform one initial GC to enable code flushing. | 4007 // Perform one initial GC to enable code flushing. |
3993 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); | 4008 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
3994 | 4009 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4035 heap::SimulateIncrementalMarking(heap); | 4050 heap::SimulateIncrementalMarking(heap); |
4036 CompileRun("%OptimizeFunctionOnNextCall(g); g(3);"); | 4051 CompileRun("%OptimizeFunctionOnNextCall(g); g(3);"); |
4037 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); | 4052 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
4038 | 4053 |
4039 // Unoptimized code is missing and the deoptimizer will go ballistic. | 4054 // Unoptimized code is missing and the deoptimizer will go ballistic. |
4040 CompileRun("g('bozo');"); | 4055 CompileRun("g('bozo');"); |
4041 } | 4056 } |
4042 | 4057 |
4043 | 4058 |
4044 TEST(Regress165495) { | 4059 TEST(Regress165495) { |
| 4060 if (!i::FLAG_incremental_marking) return; |
4045 i::FLAG_allow_natives_syntax = true; | 4061 i::FLAG_allow_natives_syntax = true; |
4046 CcTest::InitializeVM(); | 4062 CcTest::InitializeVM(); |
4047 Isolate* isolate = CcTest::i_isolate(); | 4063 Isolate* isolate = CcTest::i_isolate(); |
4048 Heap* heap = isolate->heap(); | 4064 Heap* heap = isolate->heap(); |
4049 HandleScope scope(isolate); | 4065 HandleScope scope(isolate); |
4050 | 4066 |
4051 // Perform one initial GC to enable code flushing. | 4067 // Perform one initial GC to enable code flushing. |
4052 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); | 4068 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
4053 | 4069 |
4054 // Prepare an optimized closure that the optimized code map will get | 4070 // Prepare an optimized closure that the optimized code map will get |
(...skipping 26 matching lines...) Expand all Loading... |
4081 heap::SimulateIncrementalMarking(heap); | 4097 heap::SimulateIncrementalMarking(heap); |
4082 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); | 4098 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
4083 | 4099 |
4084 // Make a new closure that will get code installed from the code map. | 4100 // Make a new closure that will get code installed from the code map. |
4085 // Unoptimized code is missing and the deoptimizer will go ballistic. | 4101 // Unoptimized code is missing and the deoptimizer will go ballistic. |
4086 CompileRun("var g = mkClosure(); g('bozo');"); | 4102 CompileRun("var g = mkClosure(); g('bozo');"); |
4087 } | 4103 } |
4088 | 4104 |
4089 | 4105 |
4090 TEST(Regress169209) { | 4106 TEST(Regress169209) { |
| 4107 if (!i::FLAG_incremental_marking) return; |
4091 i::FLAG_always_opt = false; | 4108 i::FLAG_always_opt = false; |
4092 i::FLAG_stress_compaction = false; | 4109 i::FLAG_stress_compaction = false; |
4093 i::FLAG_allow_natives_syntax = true; | 4110 i::FLAG_allow_natives_syntax = true; |
4094 | 4111 |
4095 CcTest::InitializeVM(); | 4112 CcTest::InitializeVM(); |
4096 Isolate* isolate = CcTest::i_isolate(); | 4113 Isolate* isolate = CcTest::i_isolate(); |
4097 Heap* heap = isolate->heap(); | 4114 Heap* heap = isolate->heap(); |
4098 HandleScope scope(isolate); | 4115 HandleScope scope(isolate); |
4099 | 4116 |
4100 // Perform one initial GC to enable code flushing. | 4117 // Perform one initial GC to enable code flushing. |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4297 FLAG_gc_interval = 1000; | 4314 FLAG_gc_interval = 1000; |
4298 for (int i = 0; i < 10; ++i) { | 4315 for (int i = 0; i < 10; ++i) { |
4299 BailoutId id = BailoutId(i); | 4316 BailoutId id = BailoutId(i); |
4300 SharedFunctionInfo::AddToOptimizedCodeMap(shared, context, code, lit, id); | 4317 SharedFunctionInfo::AddToOptimizedCodeMap(shared, context, code, lit, id); |
4301 } | 4318 } |
4302 } | 4319 } |
4303 #endif // DEBUG | 4320 #endif // DEBUG |
4304 | 4321 |
4305 | 4322 |
4306 TEST(Regress514122) { | 4323 TEST(Regress514122) { |
| 4324 if (!i::FLAG_incremental_marking) return; |
4307 i::FLAG_flush_optimized_code_cache = false; | 4325 i::FLAG_flush_optimized_code_cache = false; |
4308 i::FLAG_allow_natives_syntax = true; | 4326 i::FLAG_allow_natives_syntax = true; |
4309 CcTest::InitializeVM(); | 4327 CcTest::InitializeVM(); |
4310 Isolate* isolate = CcTest::i_isolate(); | 4328 Isolate* isolate = CcTest::i_isolate(); |
4311 LocalContext env; | 4329 LocalContext env; |
4312 Heap* heap = isolate->heap(); | 4330 Heap* heap = isolate->heap(); |
4313 HandleScope scope(isolate); | 4331 HandleScope scope(isolate); |
4314 | 4332 |
4315 // Perfrom one initial GC to enable code flushing. | 4333 // Perfrom one initial GC to enable code flushing. |
4316 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); | 4334 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4558 // though the optimized code for 'f' is reachable via the optimized code map. | 4576 // though the optimized code for 'f' is reachable via the optimized code map. |
4559 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); | 4577 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
4560 | 4578 |
4561 // Make a new closure that will get code installed from the code map. | 4579 // Make a new closure that will get code installed from the code map. |
4562 // Unoptimized code is missing and the deoptimizer will go ballistic. | 4580 // Unoptimized code is missing and the deoptimizer will go ballistic. |
4563 CompileRun("var h = mkClosure(); h('bozo');"); | 4581 CompileRun("var h = mkClosure(); h('bozo');"); |
4564 } | 4582 } |
4565 | 4583 |
4566 | 4584 |
4567 TEST(LargeObjectSlotRecording) { | 4585 TEST(LargeObjectSlotRecording) { |
| 4586 if (!i::FLAG_incremental_marking) return; |
4568 FLAG_manual_evacuation_candidates_selection = true; | 4587 FLAG_manual_evacuation_candidates_selection = true; |
4569 CcTest::InitializeVM(); | 4588 CcTest::InitializeVM(); |
4570 Isolate* isolate = CcTest::i_isolate(); | 4589 Isolate* isolate = CcTest::i_isolate(); |
4571 Heap* heap = isolate->heap(); | 4590 Heap* heap = isolate->heap(); |
4572 HandleScope scope(isolate); | 4591 HandleScope scope(isolate); |
4573 | 4592 |
4574 // Create an object on an evacuation candidate. | 4593 // Create an object on an evacuation candidate. |
4575 heap::SimulateFullSpace(heap->old_space()); | 4594 heap::SimulateFullSpace(heap->old_space()); |
4576 Handle<FixedArray> lit = isolate->factory()->NewFixedArray(4, TENURED); | 4595 Handle<FixedArray> lit = isolate->factory()->NewFixedArray(4, TENURED); |
4577 Page* evac_page = Page::FromAddress(lit->address()); | 4596 Page* evac_page = Page::FromAddress(lit->address()); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4630 CHECK(data->next == data->limit); | 4649 CHECK(data->next == data->limit); |
4631 | 4650 |
4632 DeferredHandleScope deferred(isolate); | 4651 DeferredHandleScope deferred(isolate); |
4633 DummyVisitor visitor; | 4652 DummyVisitor visitor; |
4634 isolate->handle_scope_implementer()->Iterate(&visitor); | 4653 isolate->handle_scope_implementer()->Iterate(&visitor); |
4635 delete deferred.Detach(); | 4654 delete deferred.Detach(); |
4636 } | 4655 } |
4637 | 4656 |
4638 | 4657 |
4639 TEST(IncrementalMarkingStepMakesBigProgressWithLargeObjects) { | 4658 TEST(IncrementalMarkingStepMakesBigProgressWithLargeObjects) { |
| 4659 if (!FLAG_incremental_marking) return; |
4640 CcTest::InitializeVM(); | 4660 CcTest::InitializeVM(); |
4641 v8::HandleScope scope(CcTest::isolate()); | 4661 v8::HandleScope scope(CcTest::isolate()); |
4642 CompileRun("function f(n) {" | 4662 CompileRun("function f(n) {" |
4643 " var a = new Array(n);" | 4663 " var a = new Array(n);" |
4644 " for (var i = 0; i < n; i += 100) a[i] = i;" | 4664 " for (var i = 0; i < n; i += 100) a[i] = i;" |
4645 "};" | 4665 "};" |
4646 "f(10 * 1024 * 1024);"); | 4666 "f(10 * 1024 * 1024);"); |
4647 IncrementalMarking* marking = CcTest::heap()->incremental_marking(); | 4667 IncrementalMarking* marking = CcTest::heap()->incremental_marking(); |
4648 if (marking->IsStopped()) { | 4668 if (marking->IsStopped()) { |
4649 CcTest::heap()->StartIncrementalMarking( | 4669 CcTest::heap()->StartIncrementalMarking( |
(...skipping 791 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5441 CcTest::CollectGarbage(NEW_SPACE); | 5461 CcTest::CollectGarbage(NEW_SPACE); |
5442 CHECK(weak_cell1->value()->IsFixedArray()); | 5462 CHECK(weak_cell1->value()->IsFixedArray()); |
5443 CHECK_EQ(*survivor, weak_cell2->value()); | 5463 CHECK_EQ(*survivor, weak_cell2->value()); |
5444 CcTest::CollectAllAvailableGarbage(); | 5464 CcTest::CollectAllAvailableGarbage(); |
5445 CHECK(weak_cell1->cleared()); | 5465 CHECK(weak_cell1->cleared()); |
5446 CHECK_EQ(*survivor, weak_cell2->value()); | 5466 CHECK_EQ(*survivor, weak_cell2->value()); |
5447 } | 5467 } |
5448 | 5468 |
5449 | 5469 |
5450 TEST(WeakCellsWithIncrementalMarking) { | 5470 TEST(WeakCellsWithIncrementalMarking) { |
| 5471 if (!FLAG_incremental_marking) return; |
5451 CcTest::InitializeVM(); | 5472 CcTest::InitializeVM(); |
5452 Isolate* isolate = CcTest::i_isolate(); | 5473 Isolate* isolate = CcTest::i_isolate(); |
5453 v8::internal::Heap* heap = CcTest::heap(); | 5474 v8::internal::Heap* heap = CcTest::heap(); |
5454 v8::internal::Factory* factory = isolate->factory(); | 5475 v8::internal::Factory* factory = isolate->factory(); |
5455 | 5476 |
5456 const int N = 16; | 5477 const int N = 16; |
5457 HandleScope outer_scope(isolate); | 5478 HandleScope outer_scope(isolate); |
5458 Handle<FixedArray> survivor = factory->NewFixedArray(1, NOT_TENURED); | 5479 Handle<FixedArray> survivor = factory->NewFixedArray(1, NOT_TENURED); |
5459 Handle<WeakCell> weak_cells[N]; | 5480 Handle<WeakCell> weak_cells[N]; |
5460 | 5481 |
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5712 | 5733 |
5713 // This scavenge will corrupt memory if the promotion queue is not | 5734 // This scavenge will corrupt memory if the promotion queue is not |
5714 // evacuated. | 5735 // evacuated. |
5715 heap->CollectGarbage(NEW_SPACE, i::GarbageCollectionReason::kTesting); | 5736 heap->CollectGarbage(NEW_SPACE, i::GarbageCollectionReason::kTesting); |
5716 } | 5737 } |
5717 isolate->Dispose(); | 5738 isolate->Dispose(); |
5718 } | 5739 } |
5719 | 5740 |
5720 | 5741 |
5721 TEST(Regress388880) { | 5742 TEST(Regress388880) { |
| 5743 if (!FLAG_incremental_marking) return; |
5722 i::FLAG_expose_gc = true; | 5744 i::FLAG_expose_gc = true; |
5723 CcTest::InitializeVM(); | 5745 CcTest::InitializeVM(); |
5724 v8::HandleScope scope(CcTest::isolate()); | 5746 v8::HandleScope scope(CcTest::isolate()); |
5725 Isolate* isolate = CcTest::i_isolate(); | 5747 Isolate* isolate = CcTest::i_isolate(); |
5726 Factory* factory = isolate->factory(); | 5748 Factory* factory = isolate->factory(); |
5727 Heap* heap = isolate->heap(); | 5749 Heap* heap = isolate->heap(); |
5728 | 5750 |
5729 Handle<Map> map1 = Map::Create(isolate, 1); | 5751 Handle<Map> map1 = Map::Create(isolate, 1); |
5730 Handle<String> name = factory->NewStringFromStaticChars("foo"); | 5752 Handle<String> name = factory->NewStringFromStaticChars("foo"); |
5731 name = factory->InternalizeString(name); | 5753 name = factory->InternalizeString(name); |
(...skipping 27 matching lines...) Expand all Loading... |
5759 i::GarbageCollectionReason::kTesting); | 5781 i::GarbageCollectionReason::kTesting); |
5760 CHECK(marking->IsMarking()); | 5782 CHECK(marking->IsMarking()); |
5761 | 5783 |
5762 // Now everything is set up for crashing in JSObject::MigrateFastToFast() | 5784 // Now everything is set up for crashing in JSObject::MigrateFastToFast() |
5763 // when it calls heap->AdjustLiveBytes(...). | 5785 // when it calls heap->AdjustLiveBytes(...). |
5764 JSObject::MigrateToMap(o, map2); | 5786 JSObject::MigrateToMap(o, map2); |
5765 } | 5787 } |
5766 | 5788 |
5767 | 5789 |
5768 TEST(Regress3631) { | 5790 TEST(Regress3631) { |
| 5791 if (!FLAG_incremental_marking) return; |
5769 i::FLAG_expose_gc = true; | 5792 i::FLAG_expose_gc = true; |
5770 CcTest::InitializeVM(); | 5793 CcTest::InitializeVM(); |
5771 v8::HandleScope scope(CcTest::isolate()); | 5794 v8::HandleScope scope(CcTest::isolate()); |
5772 Isolate* isolate = CcTest::i_isolate(); | 5795 Isolate* isolate = CcTest::i_isolate(); |
5773 Heap* heap = isolate->heap(); | 5796 Heap* heap = isolate->heap(); |
5774 IncrementalMarking* marking = CcTest::heap()->incremental_marking(); | 5797 IncrementalMarking* marking = CcTest::heap()->incremental_marking(); |
5775 v8::Local<v8::Value> result = CompileRun( | 5798 v8::Local<v8::Value> result = CompileRun( |
5776 "var weak_map = new WeakMap();" | 5799 "var weak_map = new WeakMap();" |
5777 "var future_keys = [];" | 5800 "var future_keys = [];" |
5778 "for (var i = 0; i < 50; i++) {" | 5801 "for (var i = 0; i < 50; i++) {" |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5892 CcTest::CollectGarbage(OLD_SPACE); | 5915 CcTest::CollectGarbage(OLD_SPACE); |
5893 } | 5916 } |
5894 CHECK(!weak_cell->cleared()); | 5917 CHECK(!weak_cell->cleared()); |
5895 heap::SimulateIncrementalMarking(heap); | 5918 heap::SimulateIncrementalMarking(heap); |
5896 CcTest::CollectGarbage(OLD_SPACE); | 5919 CcTest::CollectGarbage(OLD_SPACE); |
5897 CHECK(weak_cell->cleared()); | 5920 CHECK(weak_cell->cleared()); |
5898 } | 5921 } |
5899 | 5922 |
5900 | 5923 |
5901 TEST(MapRetaining) { | 5924 TEST(MapRetaining) { |
| 5925 if (!FLAG_incremental_marking) return; |
5902 CcTest::InitializeVM(); | 5926 CcTest::InitializeVM(); |
5903 v8::HandleScope scope(CcTest::isolate()); | 5927 v8::HandleScope scope(CcTest::isolate()); |
5904 CheckMapRetainingFor(FLAG_retain_maps_for_n_gc); | 5928 CheckMapRetainingFor(FLAG_retain_maps_for_n_gc); |
5905 CheckMapRetainingFor(0); | 5929 CheckMapRetainingFor(0); |
5906 CheckMapRetainingFor(1); | 5930 CheckMapRetainingFor(1); |
5907 CheckMapRetainingFor(7); | 5931 CheckMapRetainingFor(7); |
5908 } | 5932 } |
5909 | 5933 |
5910 | 5934 |
5911 TEST(RegressArrayListGC) { | 5935 TEST(RegressArrayListGC) { |
(...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6392 } | 6416 } |
6393 | 6417 |
6394 | 6418 |
6395 template <typename T> | 6419 template <typename T> |
6396 static UniqueId MakeUniqueId(const Persistent<T>& p) { | 6420 static UniqueId MakeUniqueId(const Persistent<T>& p) { |
6397 return UniqueId(reinterpret_cast<uintptr_t>(*v8::Utils::OpenPersistent(p))); | 6421 return UniqueId(reinterpret_cast<uintptr_t>(*v8::Utils::OpenPersistent(p))); |
6398 } | 6422 } |
6399 | 6423 |
6400 | 6424 |
6401 TEST(Regress519319) { | 6425 TEST(Regress519319) { |
| 6426 if (!FLAG_incremental_marking) return; |
6402 CcTest::InitializeVM(); | 6427 CcTest::InitializeVM(); |
6403 v8::Isolate* isolate = CcTest::isolate(); | 6428 v8::Isolate* isolate = CcTest::isolate(); |
6404 v8::HandleScope scope(isolate); | 6429 v8::HandleScope scope(isolate); |
6405 Heap* heap = CcTest::heap(); | 6430 Heap* heap = CcTest::heap(); |
6406 LocalContext context; | 6431 LocalContext context; |
6407 | 6432 |
6408 v8::Persistent<Value> parent; | 6433 v8::Persistent<Value> parent; |
6409 v8::Persistent<Value> child; | 6434 v8::Persistent<Value> child; |
6410 | 6435 |
6411 parent.Reset(isolate, v8::Object::New(isolate)); | 6436 parent.Reset(isolate, v8::Object::New(isolate)); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6460 for (int j = 0; j < M; j++) { | 6485 for (int j = 0; j < M; j++) { |
6461 byte_array->set(j, 0x31); | 6486 byte_array->set(j, 0x31); |
6462 } | 6487 } |
6463 } | 6488 } |
6464 // Re-enable old space expansion to avoid OOM crash. | 6489 // Re-enable old space expansion to avoid OOM crash. |
6465 heap->set_force_oom(false); | 6490 heap->set_force_oom(false); |
6466 CcTest::CollectGarbage(NEW_SPACE); | 6491 CcTest::CollectGarbage(NEW_SPACE); |
6467 } | 6492 } |
6468 | 6493 |
6469 HEAP_TEST(Regress589413) { | 6494 HEAP_TEST(Regress589413) { |
| 6495 if (!FLAG_incremental_marking) return; |
6470 FLAG_stress_compaction = true; | 6496 FLAG_stress_compaction = true; |
6471 FLAG_manual_evacuation_candidates_selection = true; | 6497 FLAG_manual_evacuation_candidates_selection = true; |
6472 FLAG_parallel_compaction = false; | 6498 FLAG_parallel_compaction = false; |
6473 FLAG_concurrent_sweeping = false; | 6499 FLAG_concurrent_sweeping = false; |
6474 CcTest::InitializeVM(); | 6500 CcTest::InitializeVM(); |
6475 v8::HandleScope scope(CcTest::isolate()); | 6501 v8::HandleScope scope(CcTest::isolate()); |
6476 Heap* heap = CcTest::heap(); | 6502 Heap* heap = CcTest::heap(); |
6477 // Get the heap in clean state. | 6503 // Get the heap in clean state. |
6478 CcTest::CollectGarbage(OLD_SPACE); | 6504 CcTest::CollectGarbage(OLD_SPACE); |
6479 CcTest::CollectGarbage(OLD_SPACE); | 6505 CcTest::CollectGarbage(OLD_SPACE); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6535 for (size_t j = 0; j < arrays.size(); j++) { | 6561 for (size_t j = 0; j < arrays.size(); j++) { |
6536 heap->RightTrimFixedArray<Heap::CONCURRENT_TO_SWEEPER>(arrays[j], N - 1); | 6562 heap->RightTrimFixedArray<Heap::CONCURRENT_TO_SWEEPER>(arrays[j], N - 1); |
6537 } | 6563 } |
6538 } | 6564 } |
6539 // Force allocation from the free list. | 6565 // Force allocation from the free list. |
6540 heap->set_force_oom(true); | 6566 heap->set_force_oom(true); |
6541 CcTest::CollectGarbage(OLD_SPACE); | 6567 CcTest::CollectGarbage(OLD_SPACE); |
6542 } | 6568 } |
6543 | 6569 |
6544 TEST(Regress598319) { | 6570 TEST(Regress598319) { |
| 6571 if (!FLAG_incremental_marking) return; |
6545 // This test ensures that no white objects can cross the progress bar of large | 6572 // This test ensures that no white objects can cross the progress bar of large |
6546 // objects during incremental marking. It checks this by using Shift() during | 6573 // objects during incremental marking. It checks this by using Shift() during |
6547 // incremental marking. | 6574 // incremental marking. |
6548 CcTest::InitializeVM(); | 6575 CcTest::InitializeVM(); |
6549 v8::HandleScope scope(CcTest::isolate()); | 6576 v8::HandleScope scope(CcTest::isolate()); |
6550 Heap* heap = CcTest::heap(); | 6577 Heap* heap = CcTest::heap(); |
6551 Isolate* isolate = heap->isolate(); | 6578 Isolate* isolate = heap->isolate(); |
6552 | 6579 |
6553 const int kNumberOfObjects = kMaxRegularHeapObjectSize / kPointerSize; | 6580 const int kNumberOfObjects = kMaxRegularHeapObjectSize / kPointerSize; |
6554 | 6581 |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6651 Isolate* isolate = heap->isolate(); | 6678 Isolate* isolate = heap->isolate(); |
6652 | 6679 |
6653 intptr_t size_before = heap->SizeOfObjects(); | 6680 intptr_t size_before = heap->SizeOfObjects(); |
6654 Handle<FixedArray> array = isolate->factory()->NewFixedArray(200000); | 6681 Handle<FixedArray> array = isolate->factory()->NewFixedArray(200000); |
6655 array->Shrink(1); | 6682 array->Shrink(1); |
6656 intptr_t size_after = heap->SizeOfObjects(); | 6683 intptr_t size_after = heap->SizeOfObjects(); |
6657 CHECK_EQ(size_after, size_before + array->Size()); | 6684 CHECK_EQ(size_after, size_before + array->Size()); |
6658 } | 6685 } |
6659 | 6686 |
6660 TEST(Regress615489) { | 6687 TEST(Regress615489) { |
| 6688 if (!i::FLAG_incremental_marking) return; |
6661 FLAG_black_allocation = true; | 6689 FLAG_black_allocation = true; |
6662 CcTest::InitializeVM(); | 6690 CcTest::InitializeVM(); |
6663 v8::HandleScope scope(CcTest::isolate()); | 6691 v8::HandleScope scope(CcTest::isolate()); |
6664 Heap* heap = CcTest::heap(); | 6692 Heap* heap = CcTest::heap(); |
6665 Isolate* isolate = heap->isolate(); | 6693 Isolate* isolate = heap->isolate(); |
6666 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); | 6694 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
6667 | 6695 |
6668 i::MarkCompactCollector* collector = heap->mark_compact_collector(); | 6696 i::MarkCompactCollector* collector = heap->mark_compact_collector(); |
6669 i::IncrementalMarking* marking = heap->incremental_marking(); | 6697 i::IncrementalMarking* marking = heap->incremental_marking(); |
6670 if (collector->sweeping_in_progress()) { | 6698 if (collector->sweeping_in_progress()) { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6705 | 6733 |
6706 const char* data() const { return data_; } | 6734 const char* data() const { return data_; } |
6707 | 6735 |
6708 size_t length() const { return strlen(data_); } | 6736 size_t length() const { return strlen(data_); } |
6709 | 6737 |
6710 private: | 6738 private: |
6711 const char* data_; | 6739 const char* data_; |
6712 }; | 6740 }; |
6713 | 6741 |
6714 TEST(Regress631969) { | 6742 TEST(Regress631969) { |
| 6743 if (!FLAG_incremental_marking) return; |
6715 FLAG_manual_evacuation_candidates_selection = true; | 6744 FLAG_manual_evacuation_candidates_selection = true; |
6716 FLAG_parallel_compaction = false; | 6745 FLAG_parallel_compaction = false; |
6717 FLAG_concurrent_sweeping = false; | 6746 FLAG_concurrent_sweeping = false; |
6718 CcTest::InitializeVM(); | 6747 CcTest::InitializeVM(); |
6719 v8::HandleScope scope(CcTest::isolate()); | 6748 v8::HandleScope scope(CcTest::isolate()); |
6720 Heap* heap = CcTest::heap(); | 6749 Heap* heap = CcTest::heap(); |
6721 // Get the heap in clean state. | 6750 // Get the heap in clean state. |
6722 CcTest::CollectGarbage(OLD_SPACE); | 6751 CcTest::CollectGarbage(OLD_SPACE); |
6723 CcTest::CollectGarbage(OLD_SPACE); | 6752 CcTest::CollectGarbage(OLD_SPACE); |
6724 Isolate* isolate = CcTest::i_isolate(); | 6753 Isolate* isolate = CcTest::i_isolate(); |
(...skipping 25 matching lines...) Expand all Loading... |
6750 } | 6779 } |
6751 | 6780 |
6752 { | 6781 { |
6753 StaticOneByteResource external_string("12345678901234"); | 6782 StaticOneByteResource external_string("12345678901234"); |
6754 s3->MakeExternal(&external_string); | 6783 s3->MakeExternal(&external_string); |
6755 CcTest::CollectGarbage(OLD_SPACE); | 6784 CcTest::CollectGarbage(OLD_SPACE); |
6756 } | 6785 } |
6757 } | 6786 } |
6758 | 6787 |
6759 TEST(LeftTrimFixedArrayInBlackArea) { | 6788 TEST(LeftTrimFixedArrayInBlackArea) { |
| 6789 if (!i::FLAG_incremental_marking) return; |
6760 FLAG_black_allocation = true; | 6790 FLAG_black_allocation = true; |
6761 CcTest::InitializeVM(); | 6791 CcTest::InitializeVM(); |
6762 v8::HandleScope scope(CcTest::isolate()); | 6792 v8::HandleScope scope(CcTest::isolate()); |
6763 Heap* heap = CcTest::heap(); | 6793 Heap* heap = CcTest::heap(); |
6764 Isolate* isolate = heap->isolate(); | 6794 Isolate* isolate = heap->isolate(); |
6765 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); | 6795 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
6766 | 6796 |
6767 i::MarkCompactCollector* collector = heap->mark_compact_collector(); | 6797 i::MarkCompactCollector* collector = heap->mark_compact_collector(); |
6768 i::IncrementalMarking* marking = heap->incremental_marking(); | 6798 i::IncrementalMarking* marking = heap->incremental_marking(); |
6769 if (collector->sweeping_in_progress()) { | 6799 if (collector->sweeping_in_progress()) { |
(...skipping 18 matching lines...) Expand all Loading... |
6788 // Now left trim the allocated black area. A filler has to be installed | 6818 // Now left trim the allocated black area. A filler has to be installed |
6789 // for the trimmed area and all mark bits of the trimmed area have to be | 6819 // for the trimmed area and all mark bits of the trimmed area have to be |
6790 // cleared. | 6820 // cleared. |
6791 FixedArrayBase* trimmed = heap->LeftTrimFixedArray(*array, 10); | 6821 FixedArrayBase* trimmed = heap->LeftTrimFixedArray(*array, 10); |
6792 CHECK(Marking::IsBlack(ObjectMarking::MarkBitFrom(trimmed))); | 6822 CHECK(Marking::IsBlack(ObjectMarking::MarkBitFrom(trimmed))); |
6793 | 6823 |
6794 heap::GcAndSweep(heap, OLD_SPACE); | 6824 heap::GcAndSweep(heap, OLD_SPACE); |
6795 } | 6825 } |
6796 | 6826 |
6797 TEST(ContinuousLeftTrimFixedArrayInBlackArea) { | 6827 TEST(ContinuousLeftTrimFixedArrayInBlackArea) { |
| 6828 if (!i::FLAG_incremental_marking) return; |
6798 FLAG_black_allocation = true; | 6829 FLAG_black_allocation = true; |
6799 CcTest::InitializeVM(); | 6830 CcTest::InitializeVM(); |
6800 v8::HandleScope scope(CcTest::isolate()); | 6831 v8::HandleScope scope(CcTest::isolate()); |
6801 Heap* heap = CcTest::heap(); | 6832 Heap* heap = CcTest::heap(); |
6802 Isolate* isolate = heap->isolate(); | 6833 Isolate* isolate = heap->isolate(); |
6803 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); | 6834 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
6804 | 6835 |
6805 i::MarkCompactCollector* collector = heap->mark_compact_collector(); | 6836 i::MarkCompactCollector* collector = heap->mark_compact_collector(); |
6806 i::IncrementalMarking* marking = heap->incremental_marking(); | 6837 i::IncrementalMarking* marking = heap->incremental_marking(); |
6807 if (collector->sweeping_in_progress()) { | 6838 if (collector->sweeping_in_progress()) { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6853 CHECK(Marking::IsBlack(ObjectMarking::MarkBitFrom(trimmed))); | 6884 CHECK(Marking::IsBlack(ObjectMarking::MarkBitFrom(trimmed))); |
6854 CHECK(Marking::IsWhite(ObjectMarking::MarkBitFrom(previous))); | 6885 CHECK(Marking::IsWhite(ObjectMarking::MarkBitFrom(previous))); |
6855 previous = trimmed; | 6886 previous = trimmed; |
6856 } | 6887 } |
6857 } | 6888 } |
6858 | 6889 |
6859 heap::GcAndSweep(heap, OLD_SPACE); | 6890 heap::GcAndSweep(heap, OLD_SPACE); |
6860 } | 6891 } |
6861 | 6892 |
6862 TEST(ContinuousRightTrimFixedArrayInBlackArea) { | 6893 TEST(ContinuousRightTrimFixedArrayInBlackArea) { |
| 6894 if (!i::FLAG_incremental_marking) return; |
6863 FLAG_black_allocation = true; | 6895 FLAG_black_allocation = true; |
6864 CcTest::InitializeVM(); | 6896 CcTest::InitializeVM(); |
6865 v8::HandleScope scope(CcTest::isolate()); | 6897 v8::HandleScope scope(CcTest::isolate()); |
6866 Heap* heap = CcTest::heap(); | 6898 Heap* heap = CcTest::heap(); |
6867 Isolate* isolate = heap->isolate(); | 6899 Isolate* isolate = heap->isolate(); |
6868 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); | 6900 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
6869 | 6901 |
6870 i::MarkCompactCollector* collector = heap->mark_compact_collector(); | 6902 i::MarkCompactCollector* collector = heap->mark_compact_collector(); |
6871 i::IncrementalMarking* marking = heap->incremental_marking(); | 6903 i::IncrementalMarking* marking = heap->incremental_marking(); |
6872 if (collector->sweeping_in_progress()) { | 6904 if (collector->sweeping_in_progress()) { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6911 HeapObject* filler = HeapObject::FromAddress(previous); | 6943 HeapObject* filler = HeapObject::FromAddress(previous); |
6912 CHECK(filler->IsFiller()); | 6944 CHECK(filler->IsFiller()); |
6913 CHECK(Marking::IsWhite(ObjectMarking::MarkBitFrom(previous))); | 6945 CHECK(Marking::IsWhite(ObjectMarking::MarkBitFrom(previous))); |
6914 } | 6946 } |
6915 } | 6947 } |
6916 | 6948 |
6917 heap::GcAndSweep(heap, OLD_SPACE); | 6949 heap::GcAndSweep(heap, OLD_SPACE); |
6918 } | 6950 } |
6919 | 6951 |
6920 TEST(Regress618958) { | 6952 TEST(Regress618958) { |
| 6953 if (!i::FLAG_incremental_marking) return; |
6921 CcTest::InitializeVM(); | 6954 CcTest::InitializeVM(); |
6922 v8::HandleScope scope(CcTest::isolate()); | 6955 v8::HandleScope scope(CcTest::isolate()); |
6923 Heap* heap = CcTest::heap(); | 6956 Heap* heap = CcTest::heap(); |
6924 bool isolate_is_locked = true; | 6957 bool isolate_is_locked = true; |
6925 heap->update_external_memory(100 * MB); | 6958 heap->update_external_memory(100 * MB); |
6926 int mark_sweep_count_before = heap->ms_count(); | 6959 int mark_sweep_count_before = heap->ms_count(); |
6927 heap->MemoryPressureNotification(MemoryPressureLevel::kCritical, | 6960 heap->MemoryPressureNotification(MemoryPressureLevel::kCritical, |
6928 isolate_is_locked); | 6961 isolate_is_locked); |
6929 int mark_sweep_count_after = heap->ms_count(); | 6962 int mark_sweep_count_after = heap->ms_count(); |
6930 int mark_sweeps_performed = mark_sweep_count_after - mark_sweep_count_before; | 6963 int mark_sweeps_performed = mark_sweep_count_after - mark_sweep_count_before; |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7020 SlotSet::FREE_EMPTY_BUCKETS); | 7053 SlotSet::FREE_EMPTY_BUCKETS); |
7021 slots[chunk->area_end() - kPointerSize] = false; | 7054 slots[chunk->area_end() - kPointerSize] = false; |
7022 RememberedSet<OLD_TO_NEW>::Iterate(chunk, [&slots](Address addr) { | 7055 RememberedSet<OLD_TO_NEW>::Iterate(chunk, [&slots](Address addr) { |
7023 CHECK(slots[addr]); | 7056 CHECK(slots[addr]); |
7024 return KEEP_SLOT; | 7057 return KEEP_SLOT; |
7025 }); | 7058 }); |
7026 } | 7059 } |
7027 | 7060 |
7028 } // namespace internal | 7061 } // namespace internal |
7029 } // namespace v8 | 7062 } // namespace v8 |
OLD | NEW |