| 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 766 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 777 | 777 | 
| 778   HandleScope scope(isolate); | 778   HandleScope scope(isolate); | 
| 779   Handle<Object> marked = factory->NewStringFromStaticChars("marked"); | 779   Handle<Object> marked = factory->NewStringFromStaticChars("marked"); | 
| 780 | 780 | 
| 781   IncrementalMarking* marking = heap->incremental_marking(); | 781   IncrementalMarking* marking = heap->incremental_marking(); | 
| 782   marking->Stop(); | 782   marking->Stop(); | 
| 783   heap->StartIncrementalMarking(); | 783   heap->StartIncrementalMarking(); | 
| 784   while ( | 784   while ( | 
| 785       Marking::IsWhite(ObjectMarking::MarkBitFrom(HeapObject::cast(*marked)))) { | 785       Marking::IsWhite(ObjectMarking::MarkBitFrom(HeapObject::cast(*marked)))) { | 
| 786     marking->Step(MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD, | 786     marking->Step(MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD, | 
| 787                   IncrementalMarking::FORCE_MARKING, |  | 
| 788                   IncrementalMarking::DO_NOT_FORCE_COMPLETION); | 787                   IncrementalMarking::DO_NOT_FORCE_COMPLETION); | 
| 789   } | 788   } | 
| 790 | 789 | 
| 791   heap->CollectGarbage(NEW_SPACE); | 790   heap->CollectGarbage(NEW_SPACE); | 
| 792 | 791 | 
| 793   CHECK(!heap->InNewSpace(*marked)); | 792   CHECK(!heap->InNewSpace(*marked)); | 
| 794 } | 793 } | 
| 795 | 794 | 
| 796 TEST(BytecodeArray) { | 795 TEST(BytecodeArray) { | 
| 797   static const uint8_t kRawBytes[] = {0xc3, 0x7e, 0xa5, 0x5a}; | 796   static const uint8_t kRawBytes[] = {0xc3, 0x7e, 0xa5, 0x5a}; | 
| (...skipping 1876 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2674   i::Handle<JSFunction> f = i::Handle<JSFunction>::cast( | 2673   i::Handle<JSFunction> f = i::Handle<JSFunction>::cast( | 
| 2675       v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast( | 2674       v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast( | 
| 2676           CcTest::global()->Get(ctx, v8_str("f")).ToLocalChecked()))); | 2675           CcTest::global()->Get(ctx, v8_str("f")).ToLocalChecked()))); | 
| 2677 | 2676 | 
| 2678   CHECK(f->IsOptimized()); | 2677   CHECK(f->IsOptimized()); | 
| 2679 | 2678 | 
| 2680   while (!Marking::IsBlack(ObjectMarking::MarkBitFrom(f->code())) && | 2679   while (!Marking::IsBlack(ObjectMarking::MarkBitFrom(f->code())) && | 
| 2681          !marking->IsStopped()) { | 2680          !marking->IsStopped()) { | 
| 2682     // Discard any pending GC requests otherwise we will get GC when we enter | 2681     // Discard any pending GC requests otherwise we will get GC when we enter | 
| 2683     // code below. | 2682     // code below. | 
| 2684     marking->Step(MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD); | 2683     marking->Step(MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD, | 
|  | 2684                   IncrementalMarking::FORCE_COMPLETION); | 
| 2685   } | 2685   } | 
| 2686 | 2686 | 
| 2687   CHECK(marking->IsMarking()); | 2687   CHECK(marking->IsMarking()); | 
| 2688 | 2688 | 
| 2689   { | 2689   { | 
| 2690     v8::HandleScope scope(CcTest::isolate()); | 2690     v8::HandleScope scope(CcTest::isolate()); | 
| 2691     v8::Local<v8::Object> global = CcTest::global(); | 2691     v8::Local<v8::Object> global = CcTest::global(); | 
| 2692     v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast( | 2692     v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast( | 
| 2693         global->Get(ctx, v8_str("g")).ToLocalChecked()); | 2693         global->Get(ctx, v8_str("g")).ToLocalChecked()); | 
| 2694     g->Call(ctx, global, 0, nullptr).ToLocalChecked(); | 2694     g->Call(ctx, global, 0, nullptr).ToLocalChecked(); | 
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2837   marking->Stop(); | 2837   marking->Stop(); | 
| 2838   CcTest::heap()->StartIncrementalMarking(); | 2838   CcTest::heap()->StartIncrementalMarking(); | 
| 2839 | 2839 | 
| 2840   CHECK_EQ(CcTest::heap()->gc_count(), initial_gc_count); | 2840   CHECK_EQ(CcTest::heap()->gc_count(), initial_gc_count); | 
| 2841 | 2841 | 
| 2842   // TODO(hpayer): We cannot write proper unit test right now for heap. | 2842   // TODO(hpayer): We cannot write proper unit test right now for heap. | 
| 2843   // The ideal test would call kMaxIdleMarkingDelayCounter to test the | 2843   // The ideal test would call kMaxIdleMarkingDelayCounter to test the | 
| 2844   // marking delay counter. | 2844   // marking delay counter. | 
| 2845 | 2845 | 
| 2846   // Perform a huge incremental marking step but don't complete marking. | 2846   // Perform a huge incremental marking step but don't complete marking. | 
| 2847   intptr_t bytes_processed = 0; |  | 
| 2848   do { | 2847   do { | 
| 2849     bytes_processed = | 2848     marking->Step(1 * MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD, | 
| 2850         marking->Step(1 * MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD, | 2849                   IncrementalMarking::DO_NOT_FORCE_COMPLETION); | 
| 2851                       IncrementalMarking::FORCE_MARKING, |  | 
| 2852                       IncrementalMarking::DO_NOT_FORCE_COMPLETION); |  | 
| 2853     CHECK(!marking->IsIdleMarkingDelayCounterLimitReached()); | 2850     CHECK(!marking->IsIdleMarkingDelayCounterLimitReached()); | 
| 2854   } while (bytes_processed); | 2851   } while ( | 
|  | 2852       !CcTest::heap()->mark_compact_collector()->marking_deque()->IsEmpty()); | 
| 2855 | 2853 | 
| 2856   // The next invocations of incremental marking are not going to complete | 2854   // The next invocations of incremental marking are not going to complete | 
| 2857   // marking | 2855   // marking | 
| 2858   // since the completion threshold is not reached | 2856   // since the completion threshold is not reached | 
| 2859   for (size_t i = 0; i < IncrementalMarking::kMaxIdleMarkingDelayCounter - 2; | 2857   for (size_t i = 0; i < IncrementalMarking::kMaxIdleMarkingDelayCounter - 2; | 
| 2860        i++) { | 2858        i++) { | 
| 2861     marking->Step(1 * MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD, | 2859     marking->Step(1 * MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD, | 
| 2862                   IncrementalMarking::FORCE_MARKING, |  | 
| 2863                   IncrementalMarking::DO_NOT_FORCE_COMPLETION); | 2860                   IncrementalMarking::DO_NOT_FORCE_COMPLETION); | 
| 2864     CHECK(!marking->IsIdleMarkingDelayCounterLimitReached()); | 2861     CHECK(!marking->IsIdleMarkingDelayCounterLimitReached()); | 
| 2865   } | 2862   } | 
| 2866 | 2863 | 
| 2867   marking->SetWeakClosureWasOverApproximatedForTesting(true); | 2864   marking->SetWeakClosureWasOverApproximatedForTesting(true); | 
| 2868 | 2865 | 
| 2869   // The next idle notification has to finish incremental marking. | 2866   // The next idle notification has to finish incremental marking. | 
| 2870   const double kLongIdleTime = 1000.0; | 2867   const double kLongIdleTime = 1000.0; | 
| 2871   CcTest::isolate()->IdleNotificationDeadline( | 2868   CcTest::isolate()->IdleNotificationDeadline( | 
| 2872       (v8::base::TimeTicks::HighResolutionNow().ToInternalValue() / | 2869       (v8::base::TimeTicks::HighResolutionNow().ToInternalValue() / | 
| (...skipping 1733 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4606 | 4603 | 
| 4607   // Allocate a large object. | 4604   // Allocate a large object. | 
| 4608   int size = Max(1000000, Page::kMaxRegularHeapObjectSize + KB); | 4605   int size = Max(1000000, Page::kMaxRegularHeapObjectSize + KB); | 
| 4609   CHECK(size > Page::kMaxRegularHeapObjectSize); | 4606   CHECK(size > Page::kMaxRegularHeapObjectSize); | 
| 4610   Handle<FixedArray> lo = isolate->factory()->NewFixedArray(size, TENURED); | 4607   Handle<FixedArray> lo = isolate->factory()->NewFixedArray(size, TENURED); | 
| 4611   CHECK(heap->lo_space()->Contains(*lo)); | 4608   CHECK(heap->lo_space()->Contains(*lo)); | 
| 4612 | 4609 | 
| 4613   // Start incremental marking to active write barrier. | 4610   // Start incremental marking to active write barrier. | 
| 4614   heap::SimulateIncrementalMarking(heap, false); | 4611   heap::SimulateIncrementalMarking(heap, false); | 
| 4615   heap->incremental_marking()->AdvanceIncrementalMarking( | 4612   heap->incremental_marking()->AdvanceIncrementalMarking( | 
| 4616       10000000, IncrementalMarking::IdleStepActions()); | 4613       10000000, IncrementalMarking::NO_GC_VIA_STACK_GUARD, | 
|  | 4614       IncrementalMarking::FORCE_COMPLETION); | 
| 4617 | 4615 | 
| 4618   // Create references from the large object to the object on the evacuation | 4616   // Create references from the large object to the object on the evacuation | 
| 4619   // candidate. | 4617   // candidate. | 
| 4620   const int kStep = size / 10; | 4618   const int kStep = size / 10; | 
| 4621   for (int i = 0; i < size; i += kStep) { | 4619   for (int i = 0; i < size; i += kStep) { | 
| 4622     lo->set(i, *lit); | 4620     lo->set(i, *lit); | 
| 4623     CHECK(lo->get(i) == old_location); | 4621     CHECK(lo->get(i) == old_location); | 
| 4624   } | 4622   } | 
| 4625 | 4623 | 
| 4626   // Move the evaucation candidate object. | 4624   // Move the evaucation candidate object. | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4667   CompileRun("function f(n) {" | 4665   CompileRun("function f(n) {" | 
| 4668              "    var a = new Array(n);" | 4666              "    var a = new Array(n);" | 
| 4669              "    for (var i = 0; i < n; i += 100) a[i] = i;" | 4667              "    for (var i = 0; i < n; i += 100) a[i] = i;" | 
| 4670              "};" | 4668              "};" | 
| 4671              "f(10 * 1024 * 1024);"); | 4669              "f(10 * 1024 * 1024);"); | 
| 4672   IncrementalMarking* marking = CcTest::heap()->incremental_marking(); | 4670   IncrementalMarking* marking = CcTest::heap()->incremental_marking(); | 
| 4673   if (marking->IsStopped()) { | 4671   if (marking->IsStopped()) { | 
| 4674     CcTest::heap()->StartIncrementalMarking(); | 4672     CcTest::heap()->StartIncrementalMarking(); | 
| 4675   } | 4673   } | 
| 4676   // This big step should be sufficient to mark the whole array. | 4674   // This big step should be sufficient to mark the whole array. | 
| 4677   marking->Step(100 * MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD); | 4675   marking->Step(100 * MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD, | 
|  | 4676                 IncrementalMarking::FORCE_COMPLETION); | 
| 4678   CHECK(marking->IsComplete() || | 4677   CHECK(marking->IsComplete() || | 
| 4679         marking->IsReadyToOverApproximateWeakClosure()); | 4678         marking->IsReadyToOverApproximateWeakClosure()); | 
| 4680 } | 4679 } | 
| 4681 | 4680 | 
| 4682 | 4681 | 
| 4683 TEST(DisableInlineAllocation) { | 4682 TEST(DisableInlineAllocation) { | 
| 4684   i::FLAG_allow_natives_syntax = true; | 4683   i::FLAG_allow_natives_syntax = true; | 
| 4685   CcTest::InitializeVM(); | 4684   CcTest::InitializeVM(); | 
| 4686   v8::HandleScope scope(CcTest::isolate()); | 4685   v8::HandleScope scope(CcTest::isolate()); | 
| 4687   CompileRun("function test() {" | 4686   CompileRun("function test() {" | 
| (...skipping 801 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5489   for (int i = 0; i < N; i++) { | 5488   for (int i = 0; i < N; i++) { | 
| 5490     HandleScope inner_scope(isolate); | 5489     HandleScope inner_scope(isolate); | 
| 5491     Handle<HeapObject> value = | 5490     Handle<HeapObject> value = | 
| 5492         i == 0 ? survivor : factory->NewFixedArray(1, NOT_TENURED); | 5491         i == 0 ? survivor : factory->NewFixedArray(1, NOT_TENURED); | 
| 5493     Handle<WeakCell> weak_cell = factory->NewWeakCell(value); | 5492     Handle<WeakCell> weak_cell = factory->NewWeakCell(value); | 
| 5494     CHECK(weak_cell->value()->IsFixedArray()); | 5493     CHECK(weak_cell->value()->IsFixedArray()); | 
| 5495     IncrementalMarking* marking = heap->incremental_marking(); | 5494     IncrementalMarking* marking = heap->incremental_marking(); | 
| 5496     if (marking->IsStopped()) { | 5495     if (marking->IsStopped()) { | 
| 5497       heap->StartIncrementalMarking(); | 5496       heap->StartIncrementalMarking(); | 
| 5498     } | 5497     } | 
| 5499     marking->Step(128, IncrementalMarking::NO_GC_VIA_STACK_GUARD); | 5498     marking->Step(128, IncrementalMarking::NO_GC_VIA_STACK_GUARD, | 
|  | 5499                   IncrementalMarking::FORCE_COMPLETION); | 
| 5500     heap->CollectGarbage(NEW_SPACE); | 5500     heap->CollectGarbage(NEW_SPACE); | 
| 5501     CHECK(weak_cell->value()->IsFixedArray()); | 5501     CHECK(weak_cell->value()->IsFixedArray()); | 
| 5502     weak_cells[i] = inner_scope.CloseAndEscape(weak_cell); | 5502     weak_cells[i] = inner_scope.CloseAndEscape(weak_cell); | 
| 5503   } | 5503   } | 
| 5504   // Call collect all twice to make sure that we also cleared | 5504   // Call collect all twice to make sure that we also cleared | 
| 5505   // weak cells that were allocated on black pages. | 5505   // weak cells that were allocated on black pages. | 
| 5506   heap->CollectAllGarbage(); | 5506   heap->CollectAllGarbage(); | 
| 5507   heap->CollectAllGarbage(); | 5507   heap->CollectAllGarbage(); | 
| 5508   CHECK_EQ(*survivor, weak_cells[0]->value()); | 5508   CHECK_EQ(*survivor, weak_cells[0]->value()); | 
| 5509   for (int i = 1; i < N; i++) { | 5509   for (int i = 1; i < N; i++) { | 
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5808   if (marking->IsStopped()) { | 5808   if (marking->IsStopped()) { | 
| 5809     CcTest::heap()->StartIncrementalMarking(); | 5809     CcTest::heap()->StartIncrementalMarking(); | 
| 5810   } | 5810   } | 
| 5811   // Incrementally mark the backing store. | 5811   // Incrementally mark the backing store. | 
| 5812   Handle<JSReceiver> obj = | 5812   Handle<JSReceiver> obj = | 
| 5813       v8::Utils::OpenHandle(*v8::Local<v8::Object>::Cast(result)); | 5813       v8::Utils::OpenHandle(*v8::Local<v8::Object>::Cast(result)); | 
| 5814   Handle<JSWeakCollection> weak_map(reinterpret_cast<JSWeakCollection*>(*obj)); | 5814   Handle<JSWeakCollection> weak_map(reinterpret_cast<JSWeakCollection*>(*obj)); | 
| 5815   while (!Marking::IsBlack( | 5815   while (!Marking::IsBlack( | 
| 5816              ObjectMarking::MarkBitFrom(HeapObject::cast(weak_map->table()))) && | 5816              ObjectMarking::MarkBitFrom(HeapObject::cast(weak_map->table()))) && | 
| 5817          !marking->IsStopped()) { | 5817          !marking->IsStopped()) { | 
| 5818     marking->Step(MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD); | 5818     marking->Step(MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD, | 
|  | 5819                   IncrementalMarking::FORCE_COMPLETION); | 
| 5819   } | 5820   } | 
| 5820   // Stash the backing store in a handle. | 5821   // Stash the backing store in a handle. | 
| 5821   Handle<Object> save(weak_map->table(), isolate); | 5822   Handle<Object> save(weak_map->table(), isolate); | 
| 5822   // The following line will update the backing store. | 5823   // The following line will update the backing store. | 
| 5823   CompileRun( | 5824   CompileRun( | 
| 5824       "for (var i = 0; i < 50; i++) {" | 5825       "for (var i = 0; i < 50; i++) {" | 
| 5825       "  weak_map.set(future_keys[i], i);" | 5826       "  weak_map.set(future_keys[i], i);" | 
| 5826       "}"); | 5827       "}"); | 
| 5827   heap->incremental_marking()->set_should_hurry(true); | 5828   heap->incremental_marking()->set_should_hurry(true); | 
| 5828   heap->CollectGarbage(OLD_SPACE); | 5829   heap->CollectGarbage(OLD_SPACE); | 
| (...skipping 818 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6647 | 6648 | 
| 6648   // Check that we have not marked the interesting array during root scanning. | 6649   // Check that we have not marked the interesting array during root scanning. | 
| 6649   for (int i = 0; i < arr.get()->length(); i++) { | 6650   for (int i = 0; i < arr.get()->length(); i++) { | 
| 6650     CHECK(Marking::IsWhite( | 6651     CHECK(Marking::IsWhite( | 
| 6651         ObjectMarking::MarkBitFrom(HeapObject::cast(arr.get()->get(i))))); | 6652         ObjectMarking::MarkBitFrom(HeapObject::cast(arr.get()->get(i))))); | 
| 6652   } | 6653   } | 
| 6653 | 6654 | 
| 6654   // Now we search for a state where we are in incremental marking and have | 6655   // Now we search for a state where we are in incremental marking and have | 
| 6655   // only partially marked the large object. | 6656   // only partially marked the large object. | 
| 6656   while (!marking->IsComplete()) { | 6657   while (!marking->IsComplete()) { | 
| 6657     marking->Step(i::KB, i::IncrementalMarking::NO_GC_VIA_STACK_GUARD); | 6658     marking->Step(i::KB, i::IncrementalMarking::NO_GC_VIA_STACK_GUARD, | 
|  | 6659                   IncrementalMarking::FORCE_COMPLETION); | 
| 6658     if (page->IsFlagSet(Page::HAS_PROGRESS_BAR) && page->progress_bar() > 0) { | 6660     if (page->IsFlagSet(Page::HAS_PROGRESS_BAR) && page->progress_bar() > 0) { | 
| 6659       CHECK_NE(page->progress_bar(), arr.get()->Size()); | 6661       CHECK_NE(page->progress_bar(), arr.get()->Size()); | 
| 6660       { | 6662       { | 
| 6661         // Shift by 1, effectively moving one white object across the progress | 6663         // Shift by 1, effectively moving one white object across the progress | 
| 6662         // bar, meaning that we will miss marking it. | 6664         // bar, meaning that we will miss marking it. | 
| 6663         v8::HandleScope scope(CcTest::isolate()); | 6665         v8::HandleScope scope(CcTest::isolate()); | 
| 6664         Handle<JSArray> js_array = isolate->factory()->NewJSArrayWithElements( | 6666         Handle<JSArray> js_array = isolate->factory()->NewJSArrayWithElements( | 
| 6665             Handle<FixedArray>(arr.get())); | 6667             Handle<FixedArray>(arr.get())); | 
| 6666         js_array->GetElementsAccessor()->Shift(js_array); | 6668         js_array->GetElementsAccessor()->Shift(js_array); | 
| 6667       } | 6669       } | 
| 6668       break; | 6670       break; | 
| 6669     } | 6671     } | 
| 6670   } | 6672   } | 
| 6671 | 6673 | 
| 6672   // Finish marking with bigger steps to speed up test. | 6674   // Finish marking with bigger steps to speed up test. | 
| 6673   while (!marking->IsComplete()) { | 6675   while (!marking->IsComplete()) { | 
| 6674     marking->Step(10 * i::MB, i::IncrementalMarking::NO_GC_VIA_STACK_GUARD); | 6676     marking->Step(10 * i::MB, i::IncrementalMarking::NO_GC_VIA_STACK_GUARD, | 
|  | 6677                   IncrementalMarking::FORCE_COMPLETION); | 
| 6675     if (marking->IsReadyToOverApproximateWeakClosure()) { | 6678     if (marking->IsReadyToOverApproximateWeakClosure()) { | 
| 6676       marking->FinalizeIncrementally(); | 6679       marking->FinalizeIncrementally(); | 
| 6677     } | 6680     } | 
| 6678   } | 6681   } | 
| 6679   CHECK(marking->IsComplete()); | 6682   CHECK(marking->IsComplete()); | 
| 6680 | 6683 | 
| 6681   // All objects need to be black after marking. If a white object crossed the | 6684   // All objects need to be black after marking. If a white object crossed the | 
| 6682   // progress bar, we would fail here. | 6685   // progress bar, we would fail here. | 
| 6683   for (int i = 0; i < arr.get()->length(); i++) { | 6686   for (int i = 0; i < arr.get()->length(); i++) { | 
| 6684     CHECK(Marking::IsBlack( | 6687     CHECK(Marking::IsBlack( | 
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6717     heap->StartIncrementalMarking(); | 6720     heap->StartIncrementalMarking(); | 
| 6718   } | 6721   } | 
| 6719   CHECK(marking->IsMarking()); | 6722   CHECK(marking->IsMarking()); | 
| 6720   marking->StartBlackAllocationForTesting(); | 6723   marking->StartBlackAllocationForTesting(); | 
| 6721   { | 6724   { | 
| 6722     AlwaysAllocateScope always_allocate(CcTest::i_isolate()); | 6725     AlwaysAllocateScope always_allocate(CcTest::i_isolate()); | 
| 6723     v8::HandleScope inner(CcTest::isolate()); | 6726     v8::HandleScope inner(CcTest::isolate()); | 
| 6724     isolate->factory()->NewFixedArray(500, TENURED)->Size(); | 6727     isolate->factory()->NewFixedArray(500, TENURED)->Size(); | 
| 6725   } | 6728   } | 
| 6726   while (!marking->IsComplete()) { | 6729   while (!marking->IsComplete()) { | 
| 6727     marking->Step(i::MB, i::IncrementalMarking::NO_GC_VIA_STACK_GUARD); | 6730     marking->Step(i::MB, i::IncrementalMarking::NO_GC_VIA_STACK_GUARD, | 
|  | 6731                   IncrementalMarking::FORCE_COMPLETION); | 
| 6728     if (marking->IsReadyToOverApproximateWeakClosure()) { | 6732     if (marking->IsReadyToOverApproximateWeakClosure()) { | 
| 6729       marking->FinalizeIncrementally(); | 6733       marking->FinalizeIncrementally(); | 
| 6730     } | 6734     } | 
| 6731   } | 6735   } | 
| 6732   CHECK(marking->IsComplete()); | 6736   CHECK(marking->IsComplete()); | 
| 6733   intptr_t size_before = heap->SizeOfObjects(); | 6737   intptr_t size_before = heap->SizeOfObjects(); | 
| 6734   CcTest::heap()->CollectAllGarbage(); | 6738   CcTest::heap()->CollectAllGarbage(); | 
| 6735   intptr_t size_after = heap->SizeOfObjects(); | 6739   intptr_t size_after = heap->SizeOfObjects(); | 
| 6736   // Live size does not increase after garbage collection. | 6740   // Live size does not increase after garbage collection. | 
| 6737   CHECK_LE(size_after, size_before); | 6741   CHECK_LE(size_after, size_before); | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6776   // Allocate a cons string and promote it to a fresh page in the old space. | 6780   // Allocate a cons string and promote it to a fresh page in the old space. | 
| 6777   heap::SimulateFullSpace(heap->old_space()); | 6781   heap::SimulateFullSpace(heap->old_space()); | 
| 6778   Handle<String> s3; | 6782   Handle<String> s3; | 
| 6779   factory->NewConsString(s1, s2).ToHandle(&s3); | 6783   factory->NewConsString(s1, s2).ToHandle(&s3); | 
| 6780   heap->CollectGarbage(NEW_SPACE); | 6784   heap->CollectGarbage(NEW_SPACE); | 
| 6781   heap->CollectGarbage(NEW_SPACE); | 6785   heap->CollectGarbage(NEW_SPACE); | 
| 6782 | 6786 | 
| 6783   // Finish incremental marking. | 6787   // Finish incremental marking. | 
| 6784   IncrementalMarking* marking = heap->incremental_marking(); | 6788   IncrementalMarking* marking = heap->incremental_marking(); | 
| 6785   while (!marking->IsComplete()) { | 6789   while (!marking->IsComplete()) { | 
| 6786     marking->Step(MB, i::IncrementalMarking::NO_GC_VIA_STACK_GUARD); | 6790     marking->Step(MB, i::IncrementalMarking::NO_GC_VIA_STACK_GUARD, | 
|  | 6791                   IncrementalMarking::FORCE_COMPLETION); | 
| 6787     if (marking->IsReadyToOverApproximateWeakClosure()) { | 6792     if (marking->IsReadyToOverApproximateWeakClosure()) { | 
| 6788       marking->FinalizeIncrementally(); | 6793       marking->FinalizeIncrementally(); | 
| 6789     } | 6794     } | 
| 6790   } | 6795   } | 
| 6791 | 6796 | 
| 6792   { | 6797   { | 
| 6793     StaticOneByteResource external_string("12345678901234"); | 6798     StaticOneByteResource external_string("12345678901234"); | 
| 6794     s3->MakeExternal(&external_string); | 6799     s3->MakeExternal(&external_string); | 
| 6795     heap->CollectGarbage(OLD_SPACE); | 6800     heap->CollectGarbage(OLD_SPACE); | 
| 6796   } | 6801   } | 
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 7095       chunk, chunk->area_end() - kPointerSize, chunk->area_end()); | 7100       chunk, chunk->area_end() - kPointerSize, chunk->area_end()); | 
| 7096   slots[chunk->area_end() - kPointerSize] = false; | 7101   slots[chunk->area_end() - kPointerSize] = false; | 
| 7097   RememberedSet<OLD_TO_NEW>::Iterate(chunk, [&slots](Address addr) { | 7102   RememberedSet<OLD_TO_NEW>::Iterate(chunk, [&slots](Address addr) { | 
| 7098     CHECK(slots[addr]); | 7103     CHECK(slots[addr]); | 
| 7099     return KEEP_SLOT; | 7104     return KEEP_SLOT; | 
| 7100   }); | 7105   }); | 
| 7101 } | 7106 } | 
| 7102 | 7107 | 
| 7103 }  // namespace internal | 7108 }  // namespace internal | 
| 7104 }  // namespace v8 | 7109 }  // namespace v8 | 
| OLD | NEW | 
|---|