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 773 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
784 for (int i = 0; i < kRawBytesSize; i++) { | 784 for (int i = 0; i < kRawBytesSize; i++) { |
785 CHECK_EQ(array->GetFirstBytecodeAddress()[i], kRawBytes[i]); | 785 CHECK_EQ(array->GetFirstBytecodeAddress()[i], kRawBytes[i]); |
786 CHECK_EQ(array->get(i), kRawBytes[i]); | 786 CHECK_EQ(array->get(i), kRawBytes[i]); |
787 } | 787 } |
788 | 788 |
789 FixedArray* old_constant_pool_address = *constant_pool; | 789 FixedArray* old_constant_pool_address = *constant_pool; |
790 | 790 |
791 // Perform a full garbage collection and force the constant pool to be on an | 791 // Perform a full garbage collection and force the constant pool to be on an |
792 // evacuation candidate. | 792 // evacuation candidate. |
793 Page* evac_page = Page::FromAddress(constant_pool->address()); | 793 Page* evac_page = Page::FromAddress(constant_pool->address()); |
794 evac_page->SetFlag(MemoryChunk::FORCE_EVACUATION_CANDIDATE_FOR_TESTING); | 794 heap::ForceEvacuationCandidate(evac_page); |
795 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); | 795 CcTest::CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask); |
796 | 796 |
797 // BytecodeArray should survive. | 797 // BytecodeArray should survive. |
798 CHECK_EQ(array->length(), kRawBytesSize); | 798 CHECK_EQ(array->length(), kRawBytesSize); |
799 CHECK_EQ(array->frame_size(), kFrameSize); | 799 CHECK_EQ(array->frame_size(), kFrameSize); |
800 for (int i = 0; i < kRawBytesSize; i++) { | 800 for (int i = 0; i < kRawBytesSize; i++) { |
801 CHECK_EQ(array->get(i), kRawBytes[i]); | 801 CHECK_EQ(array->get(i), kRawBytes[i]); |
802 CHECK_EQ(array->GetFirstBytecodeAddress()[i], kRawBytes[i]); | 802 CHECK_EQ(array->GetFirstBytecodeAddress()[i], kRawBytes[i]); |
803 } | 803 } |
804 | 804 |
(...skipping 3546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4351 Handle<LiteralsArray> lit = LiteralsArray::New(isolate, vector, 23); | 4351 Handle<LiteralsArray> lit = LiteralsArray::New(isolate, vector, 23); |
4352 | 4352 |
4353 evac_page = Page::FromAddress(lit->address()); | 4353 evac_page = Page::FromAddress(lit->address()); |
4354 BailoutId id = BailoutId(100); | 4354 BailoutId id = BailoutId(100); |
4355 SharedFunctionInfo::AddToOptimizedCodeMap(shared, context, code, lit, id); | 4355 SharedFunctionInfo::AddToOptimizedCodeMap(shared, context, code, lit, id); |
4356 } | 4356 } |
4357 | 4357 |
4358 // Heap is ready, force {lit_page} to become an evacuation candidate and | 4358 // Heap is ready, force {lit_page} to become an evacuation candidate and |
4359 // simulate incremental marking to enqueue optimized code map. | 4359 // simulate incremental marking to enqueue optimized code map. |
4360 FLAG_manual_evacuation_candidates_selection = true; | 4360 FLAG_manual_evacuation_candidates_selection = true; |
4361 evac_page->SetFlag(MemoryChunk::FORCE_EVACUATION_CANDIDATE_FOR_TESTING); | 4361 heap::ForceEvacuationCandidate(evac_page); |
4362 heap::SimulateIncrementalMarking(heap); | 4362 heap::SimulateIncrementalMarking(heap); |
4363 | 4363 |
4364 // No matter whether reachable or not, {boomer} is doomed. | 4364 // No matter whether reachable or not, {boomer} is doomed. |
4365 Handle<Object> boomer(shared->optimized_code_map(), isolate); | 4365 Handle<Object> boomer(shared->optimized_code_map(), isolate); |
4366 | 4366 |
4367 // Add the code several times to the optimized code map. This will leave old | 4367 // Add the code several times to the optimized code map. This will leave old |
4368 // copies of the optimized code map unreachable but still marked. | 4368 // copies of the optimized code map unreachable but still marked. |
4369 for (int i = 3; i < 6; ++i) { | 4369 for (int i = 3; i < 6; ++i) { |
4370 HandleScope inner_scope(isolate); | 4370 HandleScope inner_scope(isolate); |
4371 BailoutId id = BailoutId(i); | 4371 BailoutId id = BailoutId(i); |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4550 FLAG_manual_evacuation_candidates_selection = true; | 4550 FLAG_manual_evacuation_candidates_selection = true; |
4551 CcTest::InitializeVM(); | 4551 CcTest::InitializeVM(); |
4552 Isolate* isolate = CcTest::i_isolate(); | 4552 Isolate* isolate = CcTest::i_isolate(); |
4553 Heap* heap = isolate->heap(); | 4553 Heap* heap = isolate->heap(); |
4554 HandleScope scope(isolate); | 4554 HandleScope scope(isolate); |
4555 | 4555 |
4556 // Create an object on an evacuation candidate. | 4556 // Create an object on an evacuation candidate. |
4557 heap::SimulateFullSpace(heap->old_space()); | 4557 heap::SimulateFullSpace(heap->old_space()); |
4558 Handle<FixedArray> lit = isolate->factory()->NewFixedArray(4, TENURED); | 4558 Handle<FixedArray> lit = isolate->factory()->NewFixedArray(4, TENURED); |
4559 Page* evac_page = Page::FromAddress(lit->address()); | 4559 Page* evac_page = Page::FromAddress(lit->address()); |
4560 evac_page->SetFlag(MemoryChunk::FORCE_EVACUATION_CANDIDATE_FOR_TESTING); | 4560 heap::ForceEvacuationCandidate(evac_page); |
4561 FixedArray* old_location = *lit; | 4561 FixedArray* old_location = *lit; |
4562 | 4562 |
4563 // Allocate a large object. | 4563 // Allocate a large object. |
4564 int size = Max(1000000, kMaxRegularHeapObjectSize + KB); | 4564 int size = Max(1000000, kMaxRegularHeapObjectSize + KB); |
4565 CHECK(size > kMaxRegularHeapObjectSize); | 4565 CHECK(size > kMaxRegularHeapObjectSize); |
4566 Handle<FixedArray> lo = isolate->factory()->NewFixedArray(size, TENURED); | 4566 Handle<FixedArray> lo = isolate->factory()->NewFixedArray(size, TENURED); |
4567 CHECK(heap->lo_space()->Contains(*lo)); | 4567 CHECK(heap->lo_space()->Contains(*lo)); |
4568 | 4568 |
4569 // Start incremental marking to active write barrier. | 4569 // Start incremental marking to active write barrier. |
4570 heap::SimulateIncrementalMarking(heap, false); | 4570 heap::SimulateIncrementalMarking(heap, false); |
(...skipping 985 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5556 Heap* heap = i_isolate->heap(); | 5556 Heap* heap = i_isolate->heap(); |
5557 HandleScope handle_scope(i_isolate); | 5557 HandleScope handle_scope(i_isolate); |
5558 PagedSpace* old_space = heap->old_space(); | 5558 PagedSpace* old_space = heap->old_space(); |
5559 const int kMaxObjects = 10000; | 5559 const int kMaxObjects = 10000; |
5560 const int kFixedArrayLen = 512; | 5560 const int kFixedArrayLen = 512; |
5561 Handle<FixedArray> objects[kMaxObjects]; | 5561 Handle<FixedArray> objects[kMaxObjects]; |
5562 for (int i = 0; (i < kMaxObjects) && | 5562 for (int i = 0; (i < kMaxObjects) && |
5563 heap->CanExpandOldGeneration(old_space->AreaSize()); | 5563 heap->CanExpandOldGeneration(old_space->AreaSize()); |
5564 i++) { | 5564 i++) { |
5565 objects[i] = i_isolate->factory()->NewFixedArray(kFixedArrayLen, TENURED); | 5565 objects[i] = i_isolate->factory()->NewFixedArray(kFixedArrayLen, TENURED); |
5566 Page::FromAddress(objects[i]->address()) | 5566 heap::ForceEvacuationCandidate(Page::FromAddress(objects[i]->address())); |
5567 ->SetFlag(MemoryChunk::FORCE_EVACUATION_CANDIDATE_FOR_TESTING); | |
5568 } | 5567 } |
5569 heap::SimulateFullSpace(old_space); | 5568 heap::SimulateFullSpace(old_space); |
5570 heap->CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask, | 5569 heap->CollectAllGarbage(i::Heap::kFinalizeIncrementalMarkingMask, |
5571 i::GarbageCollectionReason::kTesting); | 5570 i::GarbageCollectionReason::kTesting); |
5572 // If we get this far, we've successfully aborted compaction. Any further | 5571 // If we get this far, we've successfully aborted compaction. Any further |
5573 // allocations might trigger OOM. | 5572 // allocations might trigger OOM. |
5574 } | 5573 } |
5575 isolate->Exit(); | 5574 isolate->Exit(); |
5576 isolate->Dispose(); | 5575 isolate->Dispose(); |
5577 } | 5576 } |
(...skipping 941 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6519 handle(array); | 6518 handle(array); |
6520 // Do not expand anymore. | 6519 // Do not expand anymore. |
6521 heap->set_force_oom(true); | 6520 heap->set_force_oom(true); |
6522 } | 6521 } |
6523 // Expand and mark the new page as evacuation candidate. | 6522 // Expand and mark the new page as evacuation candidate. |
6524 heap->set_force_oom(false); | 6523 heap->set_force_oom(false); |
6525 { | 6524 { |
6526 AlwaysAllocateScope always_allocate(isolate); | 6525 AlwaysAllocateScope always_allocate(isolate); |
6527 Handle<HeapObject> ec_obj = factory->NewFixedArray(5000, TENURED); | 6526 Handle<HeapObject> ec_obj = factory->NewFixedArray(5000, TENURED); |
6528 Page* ec_page = Page::FromAddress(ec_obj->address()); | 6527 Page* ec_page = Page::FromAddress(ec_obj->address()); |
6529 ec_page->SetFlag(MemoryChunk::FORCE_EVACUATION_CANDIDATE_FOR_TESTING); | 6528 heap::ForceEvacuationCandidate(ec_page); |
6530 // Make all arrays point to evacuation candidate so that | 6529 // Make all arrays point to evacuation candidate so that |
6531 // slots are recorded for them. | 6530 // slots are recorded for them. |
6532 for (size_t j = 0; j < arrays.size(); j++) { | 6531 for (size_t j = 0; j < arrays.size(); j++) { |
6533 array = arrays[j]; | 6532 array = arrays[j]; |
6534 for (int i = 0; i < N; i++) { | 6533 for (int i = 0; i < N; i++) { |
6535 array->set(i, *ec_obj); | 6534 array->set(i, *ec_obj); |
6536 } | 6535 } |
6537 } | 6536 } |
6538 } | 6537 } |
6539 heap::SimulateIncrementalMarking(heap); | 6538 heap::SimulateIncrementalMarking(heap); |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6726 // Get the heap in clean state. | 6725 // Get the heap in clean state. |
6727 CcTest::CollectGarbage(OLD_SPACE); | 6726 CcTest::CollectGarbage(OLD_SPACE); |
6728 CcTest::CollectGarbage(OLD_SPACE); | 6727 CcTest::CollectGarbage(OLD_SPACE); |
6729 Isolate* isolate = CcTest::i_isolate(); | 6728 Isolate* isolate = CcTest::i_isolate(); |
6730 Factory* factory = isolate->factory(); | 6729 Factory* factory = isolate->factory(); |
6731 // Allocate two strings in a fresh page and mark the page as evacuation | 6730 // Allocate two strings in a fresh page and mark the page as evacuation |
6732 // candidate. | 6731 // candidate. |
6733 heap::SimulateFullSpace(heap->old_space()); | 6732 heap::SimulateFullSpace(heap->old_space()); |
6734 Handle<String> s1 = factory->NewStringFromStaticChars("123456789", TENURED); | 6733 Handle<String> s1 = factory->NewStringFromStaticChars("123456789", TENURED); |
6735 Handle<String> s2 = factory->NewStringFromStaticChars("01234", TENURED); | 6734 Handle<String> s2 = factory->NewStringFromStaticChars("01234", TENURED); |
6736 Page::FromAddress(s1->address()) | 6735 heap::ForceEvacuationCandidate(Page::FromAddress(s1->address())); |
6737 ->SetFlag(MemoryChunk::FORCE_EVACUATION_CANDIDATE_FOR_TESTING); | |
6738 | 6736 |
6739 heap::SimulateIncrementalMarking(heap, false); | 6737 heap::SimulateIncrementalMarking(heap, false); |
6740 | 6738 |
6741 // Allocate a cons string and promote it to a fresh page in the old space. | 6739 // Allocate a cons string and promote it to a fresh page in the old space. |
6742 heap::SimulateFullSpace(heap->old_space()); | 6740 heap::SimulateFullSpace(heap->old_space()); |
6743 Handle<String> s3; | 6741 Handle<String> s3; |
6744 factory->NewConsString(s1, s2).ToHandle(&s3); | 6742 factory->NewConsString(s1, s2).ToHandle(&s3); |
6745 CcTest::CollectGarbage(NEW_SPACE); | 6743 CcTest::CollectGarbage(NEW_SPACE); |
6746 CcTest::CollectGarbage(NEW_SPACE); | 6744 CcTest::CollectGarbage(NEW_SPACE); |
6747 | 6745 |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7026 SlotSet::FREE_EMPTY_BUCKETS); | 7024 SlotSet::FREE_EMPTY_BUCKETS); |
7027 slots[chunk->area_end() - kPointerSize] = false; | 7025 slots[chunk->area_end() - kPointerSize] = false; |
7028 RememberedSet<OLD_TO_NEW>::Iterate(chunk, [&slots](Address addr) { | 7026 RememberedSet<OLD_TO_NEW>::Iterate(chunk, [&slots](Address addr) { |
7029 CHECK(slots[addr]); | 7027 CHECK(slots[addr]); |
7030 return KEEP_SLOT; | 7028 return KEEP_SLOT; |
7031 }); | 7029 }); |
7032 } | 7030 } |
7033 | 7031 |
7034 } // namespace internal | 7032 } // namespace internal |
7035 } // namespace v8 | 7033 } // namespace v8 |
OLD | NEW |