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 702 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
713 | 713 |
714 TEST(DoNotPromoteWhiteObjectsOnScavenge) { | 714 TEST(DoNotPromoteWhiteObjectsOnScavenge) { |
715 CcTest::InitializeVM(); | 715 CcTest::InitializeVM(); |
716 Isolate* isolate = CcTest::i_isolate(); | 716 Isolate* isolate = CcTest::i_isolate(); |
717 Heap* heap = isolate->heap(); | 717 Heap* heap = isolate->heap(); |
718 Factory* factory = isolate->factory(); | 718 Factory* factory = isolate->factory(); |
719 | 719 |
720 HandleScope scope(isolate); | 720 HandleScope scope(isolate); |
721 Handle<Object> white = factory->NewStringFromStaticChars("white"); | 721 Handle<Object> white = factory->NewStringFromStaticChars("white"); |
722 | 722 |
723 CHECK(Marking::IsWhite(Marking::MarkBitFrom(HeapObject::cast(*white)))); | 723 CHECK(Marking::IsWhite(ObjectMarking::MarkBitFrom(HeapObject::cast(*white)))); |
724 | 724 |
725 heap->CollectGarbage(NEW_SPACE); | 725 heap->CollectGarbage(NEW_SPACE); |
726 | 726 |
727 CHECK(heap->InNewSpace(*white)); | 727 CHECK(heap->InNewSpace(*white)); |
728 } | 728 } |
729 | 729 |
730 TEST(PromoteGreyOrBlackObjectsOnScavenge) { | 730 TEST(PromoteGreyOrBlackObjectsOnScavenge) { |
731 CcTest::InitializeVM(); | 731 CcTest::InitializeVM(); |
732 Isolate* isolate = CcTest::i_isolate(); | 732 Isolate* isolate = CcTest::i_isolate(); |
733 Heap* heap = isolate->heap(); | 733 Heap* heap = isolate->heap(); |
734 Factory* factory = isolate->factory(); | 734 Factory* factory = isolate->factory(); |
735 | 735 |
736 HandleScope scope(isolate); | 736 HandleScope scope(isolate); |
737 Handle<Object> marked = factory->NewStringFromStaticChars("marked"); | 737 Handle<Object> marked = factory->NewStringFromStaticChars("marked"); |
738 | 738 |
739 IncrementalMarking* marking = heap->incremental_marking(); | 739 IncrementalMarking* marking = heap->incremental_marking(); |
740 marking->Stop(); | 740 marking->Stop(); |
741 heap->StartIncrementalMarking(); | 741 heap->StartIncrementalMarking(); |
742 while (Marking::IsWhite(Marking::MarkBitFrom(HeapObject::cast(*marked)))) { | 742 while ( |
| 743 Marking::IsWhite(ObjectMarking::MarkBitFrom(HeapObject::cast(*marked)))) { |
743 marking->Step(MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD, | 744 marking->Step(MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD, |
744 IncrementalMarking::FORCE_MARKING, | 745 IncrementalMarking::FORCE_MARKING, |
745 IncrementalMarking::DO_NOT_FORCE_COMPLETION); | 746 IncrementalMarking::DO_NOT_FORCE_COMPLETION); |
746 } | 747 } |
747 | 748 |
748 heap->CollectGarbage(NEW_SPACE); | 749 heap->CollectGarbage(NEW_SPACE); |
749 | 750 |
750 CHECK(!heap->InNewSpace(*marked)); | 751 CHECK(!heap->InNewSpace(*marked)); |
751 } | 752 } |
752 | 753 |
(...skipping 1872 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2625 IncrementalMarking* marking = CcTest::heap()->incremental_marking(); | 2626 IncrementalMarking* marking = CcTest::heap()->incremental_marking(); |
2626 marking->Stop(); | 2627 marking->Stop(); |
2627 CcTest::heap()->StartIncrementalMarking(); | 2628 CcTest::heap()->StartIncrementalMarking(); |
2628 | 2629 |
2629 i::Handle<JSFunction> f = i::Handle<JSFunction>::cast( | 2630 i::Handle<JSFunction> f = i::Handle<JSFunction>::cast( |
2630 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast( | 2631 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast( |
2631 CcTest::global()->Get(ctx, v8_str("f")).ToLocalChecked()))); | 2632 CcTest::global()->Get(ctx, v8_str("f")).ToLocalChecked()))); |
2632 | 2633 |
2633 CHECK(f->IsOptimized()); | 2634 CHECK(f->IsOptimized()); |
2634 | 2635 |
2635 while (!Marking::IsBlack(Marking::MarkBitFrom(f->code())) && | 2636 while (!Marking::IsBlack(ObjectMarking::MarkBitFrom(f->code())) && |
2636 !marking->IsStopped()) { | 2637 !marking->IsStopped()) { |
2637 // Discard any pending GC requests otherwise we will get GC when we enter | 2638 // Discard any pending GC requests otherwise we will get GC when we enter |
2638 // code below. | 2639 // code below. |
2639 marking->Step(MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD); | 2640 marking->Step(MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD); |
2640 } | 2641 } |
2641 | 2642 |
2642 CHECK(marking->IsMarking()); | 2643 CHECK(marking->IsMarking()); |
2643 | 2644 |
2644 { | 2645 { |
2645 v8::HandleScope scope(CcTest::isolate()); | 2646 v8::HandleScope scope(CcTest::isolate()); |
(...skipping 3112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5758 "}" | 5759 "}" |
5759 "weak_map"); | 5760 "weak_map"); |
5760 if (marking->IsStopped()) { | 5761 if (marking->IsStopped()) { |
5761 CcTest::heap()->StartIncrementalMarking(); | 5762 CcTest::heap()->StartIncrementalMarking(); |
5762 } | 5763 } |
5763 // Incrementally mark the backing store. | 5764 // Incrementally mark the backing store. |
5764 Handle<JSReceiver> obj = | 5765 Handle<JSReceiver> obj = |
5765 v8::Utils::OpenHandle(*v8::Local<v8::Object>::Cast(result)); | 5766 v8::Utils::OpenHandle(*v8::Local<v8::Object>::Cast(result)); |
5766 Handle<JSWeakCollection> weak_map(reinterpret_cast<JSWeakCollection*>(*obj)); | 5767 Handle<JSWeakCollection> weak_map(reinterpret_cast<JSWeakCollection*>(*obj)); |
5767 while (!Marking::IsBlack( | 5768 while (!Marking::IsBlack( |
5768 Marking::MarkBitFrom(HeapObject::cast(weak_map->table()))) && | 5769 ObjectMarking::MarkBitFrom(HeapObject::cast(weak_map->table()))) && |
5769 !marking->IsStopped()) { | 5770 !marking->IsStopped()) { |
5770 marking->Step(MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD); | 5771 marking->Step(MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD); |
5771 } | 5772 } |
5772 // Stash the backing store in a handle. | 5773 // Stash the backing store in a handle. |
5773 Handle<Object> save(weak_map->table(), isolate); | 5774 Handle<Object> save(weak_map->table(), isolate); |
5774 // The following line will update the backing store. | 5775 // The following line will update the backing store. |
5775 CompileRun( | 5776 CompileRun( |
5776 "for (var i = 0; i < 50; i++) {" | 5777 "for (var i = 0; i < 50; i++) {" |
5777 " weak_map.set(future_keys[i], i);" | 5778 " weak_map.set(future_keys[i], i);" |
5778 "}"); | 5779 "}"); |
(...skipping 894 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6673 CHECK_NOT_NULL(page); | 6674 CHECK_NOT_NULL(page); |
6674 | 6675 |
6675 // GC to cleanup state | 6676 // GC to cleanup state |
6676 heap->CollectGarbage(OLD_SPACE); | 6677 heap->CollectGarbage(OLD_SPACE); |
6677 MarkCompactCollector* collector = heap->mark_compact_collector(); | 6678 MarkCompactCollector* collector = heap->mark_compact_collector(); |
6678 if (collector->sweeping_in_progress()) { | 6679 if (collector->sweeping_in_progress()) { |
6679 collector->EnsureSweepingCompleted(); | 6680 collector->EnsureSweepingCompleted(); |
6680 } | 6681 } |
6681 | 6682 |
6682 CHECK(heap->lo_space()->Contains(arr.get())); | 6683 CHECK(heap->lo_space()->Contains(arr.get())); |
6683 CHECK(Marking::IsWhite(Marking::MarkBitFrom(arr.get()))); | 6684 CHECK(Marking::IsWhite(ObjectMarking::MarkBitFrom(arr.get()))); |
6684 for (int i = 0; i < arr.get()->length(); i++) { | 6685 for (int i = 0; i < arr.get()->length(); i++) { |
6685 CHECK(Marking::IsWhite( | 6686 CHECK(Marking::IsWhite( |
6686 Marking::MarkBitFrom(HeapObject::cast(arr.get()->get(i))))); | 6687 ObjectMarking::MarkBitFrom(HeapObject::cast(arr.get()->get(i))))); |
6687 } | 6688 } |
6688 | 6689 |
6689 // Start incremental marking. | 6690 // Start incremental marking. |
6690 IncrementalMarking* marking = heap->incremental_marking(); | 6691 IncrementalMarking* marking = heap->incremental_marking(); |
6691 CHECK(marking->IsMarking() || marking->IsStopped()); | 6692 CHECK(marking->IsMarking() || marking->IsStopped()); |
6692 if (marking->IsStopped()) { | 6693 if (marking->IsStopped()) { |
6693 heap->StartIncrementalMarking(); | 6694 heap->StartIncrementalMarking(); |
6694 } | 6695 } |
6695 CHECK(marking->IsMarking()); | 6696 CHECK(marking->IsMarking()); |
6696 | 6697 |
6697 // Check that we have not marked the interesting array during root scanning. | 6698 // Check that we have not marked the interesting array during root scanning. |
6698 for (int i = 0; i < arr.get()->length(); i++) { | 6699 for (int i = 0; i < arr.get()->length(); i++) { |
6699 CHECK(Marking::IsWhite( | 6700 CHECK(Marking::IsWhite( |
6700 Marking::MarkBitFrom(HeapObject::cast(arr.get()->get(i))))); | 6701 ObjectMarking::MarkBitFrom(HeapObject::cast(arr.get()->get(i))))); |
6701 } | 6702 } |
6702 | 6703 |
6703 // Now we search for a state where we are in incremental marking and have | 6704 // Now we search for a state where we are in incremental marking and have |
6704 // only partially marked the large object. | 6705 // only partially marked the large object. |
6705 while (!marking->IsComplete()) { | 6706 while (!marking->IsComplete()) { |
6706 marking->Step(i::KB, i::IncrementalMarking::NO_GC_VIA_STACK_GUARD); | 6707 marking->Step(i::KB, i::IncrementalMarking::NO_GC_VIA_STACK_GUARD); |
6707 if (page->IsFlagSet(Page::HAS_PROGRESS_BAR) && page->progress_bar() > 0) { | 6708 if (page->IsFlagSet(Page::HAS_PROGRESS_BAR) && page->progress_bar() > 0) { |
6708 CHECK_NE(page->progress_bar(), arr.get()->Size()); | 6709 CHECK_NE(page->progress_bar(), arr.get()->Size()); |
6709 { | 6710 { |
6710 // Shift by 1, effectively moving one white object across the progress | 6711 // Shift by 1, effectively moving one white object across the progress |
(...skipping 13 matching lines...) Expand all Loading... |
6724 if (marking->IsReadyToOverApproximateWeakClosure()) { | 6725 if (marking->IsReadyToOverApproximateWeakClosure()) { |
6725 marking->FinalizeIncrementally(); | 6726 marking->FinalizeIncrementally(); |
6726 } | 6727 } |
6727 } | 6728 } |
6728 CHECK(marking->IsComplete()); | 6729 CHECK(marking->IsComplete()); |
6729 | 6730 |
6730 // All objects need to be black after marking. If a white object crossed the | 6731 // All objects need to be black after marking. If a white object crossed the |
6731 // progress bar, we would fail here. | 6732 // progress bar, we would fail here. |
6732 for (int i = 0; i < arr.get()->length(); i++) { | 6733 for (int i = 0; i < arr.get()->length(); i++) { |
6733 CHECK(Marking::IsBlack( | 6734 CHECK(Marking::IsBlack( |
6734 Marking::MarkBitFrom(HeapObject::cast(arr.get()->get(i))))); | 6735 ObjectMarking::MarkBitFrom(HeapObject::cast(arr.get()->get(i))))); |
6735 } | 6736 } |
6736 } | 6737 } |
6737 | 6738 |
6738 TEST(Regress609761) { | 6739 TEST(Regress609761) { |
6739 CcTest::InitializeVM(); | 6740 CcTest::InitializeVM(); |
6740 v8::HandleScope scope(CcTest::isolate()); | 6741 v8::HandleScope scope(CcTest::isolate()); |
6741 Heap* heap = CcTest::heap(); | 6742 Heap* heap = CcTest::heap(); |
6742 Isolate* isolate = heap->isolate(); | 6743 Isolate* isolate = heap->isolate(); |
6743 | 6744 |
6744 intptr_t size_before = heap->SizeOfObjects(); | 6745 intptr_t size_before = heap->SizeOfObjects(); |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6884 chunk, chunk->area_end() - kPointerSize, chunk->area_end()); | 6885 chunk, chunk->area_end() - kPointerSize, chunk->area_end()); |
6885 slots[chunk->area_end() - kPointerSize] = false; | 6886 slots[chunk->area_end() - kPointerSize] = false; |
6886 RememberedSet<OLD_TO_NEW>::Iterate(chunk, [&slots](Address addr) { | 6887 RememberedSet<OLD_TO_NEW>::Iterate(chunk, [&slots](Address addr) { |
6887 CHECK(slots[addr]); | 6888 CHECK(slots[addr]); |
6888 return KEEP_SLOT; | 6889 return KEEP_SLOT; |
6889 }); | 6890 }); |
6890 } | 6891 } |
6891 | 6892 |
6892 } // namespace internal | 6893 } // namespace internal |
6893 } // namespace v8 | 6894 } // namespace v8 |
OLD | NEW |