OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_HEAP_HEAP_INL_H_ | 5 #ifndef V8_HEAP_HEAP_INL_H_ |
6 #define V8_HEAP_HEAP_INL_H_ | 6 #define V8_HEAP_HEAP_INL_H_ |
7 | 7 |
8 #include <cmath> | 8 #include <cmath> |
9 | 9 |
10 #include "src/base/platform/platform.h" | 10 #include "src/base/platform/platform.h" |
(...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
475 bool Heap::InNewSpaceSlow(Address address) { | 475 bool Heap::InNewSpaceSlow(Address address) { |
476 return new_space_->ContainsSlow(address); | 476 return new_space_->ContainsSlow(address); |
477 } | 477 } |
478 | 478 |
479 bool Heap::InOldSpaceSlow(Address address) { | 479 bool Heap::InOldSpaceSlow(Address address) { |
480 return old_space_->ContainsSlow(address); | 480 return old_space_->ContainsSlow(address); |
481 } | 481 } |
482 | 482 |
483 template <PromotionMode promotion_mode> | 483 template <PromotionMode promotion_mode> |
484 bool Heap::ShouldBePromoted(Address old_address, int object_size) { | 484 bool Heap::ShouldBePromoted(Address old_address, int object_size) { |
| 485 Page* page = Page::FromAddress(old_address); |
| 486 Address age_mark = new_space_->age_mark(); |
| 487 |
485 if (promotion_mode == PROMOTE_MARKED) { | 488 if (promotion_mode == PROMOTE_MARKED) { |
486 MarkBit mark_bit = ObjectMarking::MarkBitFrom(old_address); | 489 MarkBit mark_bit = ObjectMarking::MarkBitFrom(old_address); |
487 if (!Marking::IsWhite(mark_bit)) { | 490 if (!Marking::IsWhite(mark_bit)) { |
488 return true; | 491 return true; |
489 } | 492 } |
490 } | 493 } |
491 | 494 |
492 return Page::FromAddress(old_address)->InIntermediateGeneration(); | 495 return page->IsFlagSet(MemoryChunk::NEW_SPACE_BELOW_AGE_MARK) && |
| 496 (!page->ContainsLimit(age_mark) || old_address < age_mark); |
493 } | 497 } |
494 | 498 |
495 PromotionMode Heap::CurrentPromotionMode() { | 499 PromotionMode Heap::CurrentPromotionMode() { |
496 if (incremental_marking()->IsMarking()) { | 500 if (incremental_marking()->IsMarking()) { |
497 return PROMOTE_MARKED; | 501 return PROMOTE_MARKED; |
498 } else { | 502 } else { |
499 return DEFAULT_PROMOTION; | 503 return DEFAULT_PROMOTION; |
500 } | 504 } |
501 } | 505 } |
502 | 506 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
583 // below (memento_address == top) ensures that this is safe. Mark the word as | 587 // below (memento_address == top) ensures that this is safe. Mark the word as |
584 // initialized to silence MemorySanitizer warnings. | 588 // initialized to silence MemorySanitizer warnings. |
585 MSAN_MEMORY_IS_INITIALIZED(&candidate_map, sizeof(candidate_map)); | 589 MSAN_MEMORY_IS_INITIALIZED(&candidate_map, sizeof(candidate_map)); |
586 if (candidate_map != allocation_memento_map()) { | 590 if (candidate_map != allocation_memento_map()) { |
587 return nullptr; | 591 return nullptr; |
588 } | 592 } |
589 | 593 |
590 // Bail out if the memento is below the age mark, which can happen when | 594 // Bail out if the memento is below the age mark, which can happen when |
591 // mementos survived because a page got moved within new space. | 595 // mementos survived because a page got moved within new space. |
592 Page* object_page = Page::FromAddress(object_address); | 596 Page* object_page = Page::FromAddress(object_address); |
593 if (object_page->InIntermediateGeneration()) { | 597 if (object_page->IsFlagSet(Page::NEW_SPACE_BELOW_AGE_MARK)) { |
594 return nullptr; | 598 Address age_mark = |
| 599 reinterpret_cast<SemiSpace*>(object_page->owner())->age_mark(); |
| 600 if (!object_page->Contains(age_mark)) { |
| 601 return nullptr; |
| 602 } |
| 603 // Do an exact check in the case where the age mark is on the same page. |
| 604 if (object_address < age_mark) { |
| 605 return nullptr; |
| 606 } |
595 } | 607 } |
596 | 608 |
597 AllocationMemento* memento_candidate = AllocationMemento::cast(candidate); | 609 AllocationMemento* memento_candidate = AllocationMemento::cast(candidate); |
598 | 610 |
599 // Depending on what the memento is used for, we might need to perform | 611 // Depending on what the memento is used for, we might need to perform |
600 // additional checks. | 612 // additional checks. |
601 Address top; | 613 Address top; |
602 switch (mode) { | 614 switch (mode) { |
603 case Heap::kForGC: | 615 case Heap::kForGC: |
604 return memento_candidate; | 616 return memento_candidate; |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
830 | 842 |
831 void VerifySmisVisitor::VisitPointers(Object** start, Object** end) { | 843 void VerifySmisVisitor::VisitPointers(Object** start, Object** end) { |
832 for (Object** current = start; current < end; current++) { | 844 for (Object** current = start; current < end; current++) { |
833 CHECK((*current)->IsSmi()); | 845 CHECK((*current)->IsSmi()); |
834 } | 846 } |
835 } | 847 } |
836 } // namespace internal | 848 } // namespace internal |
837 } // namespace v8 | 849 } // namespace v8 |
838 | 850 |
839 #endif // V8_HEAP_HEAP_INL_H_ | 851 #endif // V8_HEAP_HEAP_INL_H_ |
OLD | NEW |