| 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 #include "src/heap/heap.h" | 5 #include "src/heap/heap.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/api.h" | 8 #include "src/api.h" |
| 9 #include "src/ast/scopeinfo.h" | 9 #include "src/ast/scopeinfo.h" |
| 10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
| (...skipping 927 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 938 } | 938 } |
| 939 } | 939 } |
| 940 | 940 |
| 941 | 941 |
| 942 void Heap::EnsureFillerObjectAtTop() { | 942 void Heap::EnsureFillerObjectAtTop() { |
| 943 // There may be an allocation memento behind objects in new space. Upon | 943 // There may be an allocation memento behind objects in new space. Upon |
| 944 // evacuation of a non-full new space (or if we are on the last page) there | 944 // evacuation of a non-full new space (or if we are on the last page) there |
| 945 // may be uninitialized memory behind top. We fill the remainder of the page | 945 // may be uninitialized memory behind top. We fill the remainder of the page |
| 946 // with a filler. | 946 // with a filler. |
| 947 Address to_top = new_space_.top(); | 947 Address to_top = new_space_.top(); |
| 948 NewSpacePage* page = NewSpacePage::FromAddress(to_top - kPointerSize); | 948 Page* page = Page::FromAddress(to_top - kPointerSize); |
| 949 if (page->Contains(to_top)) { | 949 if (page->Contains(to_top)) { |
| 950 int remaining_in_page = static_cast<int>(page->area_end() - to_top); | 950 int remaining_in_page = static_cast<int>(page->area_end() - to_top); |
| 951 CreateFillerObjectAt(to_top, remaining_in_page, ClearRecordedSlots::kNo); | 951 CreateFillerObjectAt(to_top, remaining_in_page, ClearRecordedSlots::kNo); |
| 952 } | 952 } |
| 953 } | 953 } |
| 954 | 954 |
| 955 | 955 |
| 956 bool Heap::CollectGarbage(GarbageCollector collector, const char* gc_reason, | 956 bool Heap::CollectGarbage(GarbageCollector collector, const char* gc_reason, |
| 957 const char* collector_reason, | 957 const char* collector_reason, |
| 958 const v8::GCCallbackFlags gc_callback_flags) { | 958 const v8::GCCallbackFlags gc_callback_flags) { |
| (...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1545 | 1545 |
| 1546 | 1546 |
| 1547 void PromotionQueue::Initialize() { | 1547 void PromotionQueue::Initialize() { |
| 1548 // The last to-space page may be used for promotion queue. On promotion | 1548 // The last to-space page may be used for promotion queue. On promotion |
| 1549 // conflict, we use the emergency stack. | 1549 // conflict, we use the emergency stack. |
| 1550 DCHECK((Page::kPageSize - MemoryChunk::kBodyOffset) % (2 * kPointerSize) == | 1550 DCHECK((Page::kPageSize - MemoryChunk::kBodyOffset) % (2 * kPointerSize) == |
| 1551 0); | 1551 0); |
| 1552 front_ = rear_ = | 1552 front_ = rear_ = |
| 1553 reinterpret_cast<struct Entry*>(heap_->new_space()->ToSpaceEnd()); | 1553 reinterpret_cast<struct Entry*>(heap_->new_space()->ToSpaceEnd()); |
| 1554 limit_ = reinterpret_cast<struct Entry*>( | 1554 limit_ = reinterpret_cast<struct Entry*>( |
| 1555 Page::FromAllocationTop(reinterpret_cast<Address>(rear_))->area_start()); | 1555 Page::FromAllocationAreaAddress(reinterpret_cast<Address>(rear_)) |
| 1556 ->area_start()); |
| 1556 emergency_stack_ = NULL; | 1557 emergency_stack_ = NULL; |
| 1557 } | 1558 } |
| 1558 | 1559 |
| 1559 | 1560 |
| 1560 void PromotionQueue::RelocateQueueHead() { | 1561 void PromotionQueue::RelocateQueueHead() { |
| 1561 DCHECK(emergency_stack_ == NULL); | 1562 DCHECK(emergency_stack_ == NULL); |
| 1562 | 1563 |
| 1563 Page* p = Page::FromAllocationTop(reinterpret_cast<Address>(rear_)); | 1564 Page* p = Page::FromAllocationAreaAddress(reinterpret_cast<Address>(rear_)); |
| 1564 struct Entry* head_start = rear_; | 1565 struct Entry* head_start = rear_; |
| 1565 struct Entry* head_end = | 1566 struct Entry* head_end = |
| 1566 Min(front_, reinterpret_cast<struct Entry*>(p->area_end())); | 1567 Min(front_, reinterpret_cast<struct Entry*>(p->area_end())); |
| 1567 | 1568 |
| 1568 int entries_count = | 1569 int entries_count = |
| 1569 static_cast<int>(head_end - head_start) / sizeof(struct Entry); | 1570 static_cast<int>(head_end - head_start) / sizeof(struct Entry); |
| 1570 | 1571 |
| 1571 emergency_stack_ = new List<Entry>(2 * entries_count); | 1572 emergency_stack_ = new List<Entry>(2 * entries_count); |
| 1572 | 1573 |
| 1573 while (head_start != head_end) { | 1574 while (head_start != head_end) { |
| (...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1902 | 1903 |
| 1903 | 1904 |
| 1904 Address Heap::DoScavenge(ObjectVisitor* scavenge_visitor, | 1905 Address Heap::DoScavenge(ObjectVisitor* scavenge_visitor, |
| 1905 Address new_space_front) { | 1906 Address new_space_front) { |
| 1906 do { | 1907 do { |
| 1907 SemiSpace::AssertValidRange(new_space_front, new_space_.top()); | 1908 SemiSpace::AssertValidRange(new_space_front, new_space_.top()); |
| 1908 // The addresses new_space_front and new_space_.top() define a | 1909 // The addresses new_space_front and new_space_.top() define a |
| 1909 // queue of unprocessed copied objects. Process them until the | 1910 // queue of unprocessed copied objects. Process them until the |
| 1910 // queue is empty. | 1911 // queue is empty. |
| 1911 while (new_space_front != new_space_.top()) { | 1912 while (new_space_front != new_space_.top()) { |
| 1912 if (!NewSpacePage::IsAtEnd(new_space_front)) { | 1913 if (!Page::IsAlignedToPageSize(new_space_front)) { |
| 1913 HeapObject* object = HeapObject::FromAddress(new_space_front); | 1914 HeapObject* object = HeapObject::FromAddress(new_space_front); |
| 1914 new_space_front += | 1915 new_space_front += |
| 1915 StaticScavengeVisitor::IterateBody(object->map(), object); | 1916 StaticScavengeVisitor::IterateBody(object->map(), object); |
| 1916 } else { | 1917 } else { |
| 1917 new_space_front = | 1918 new_space_front = Page::FromAllocationAreaAddress(new_space_front) |
| 1918 NewSpacePage::FromLimit(new_space_front)->next_page()->area_start(); | 1919 ->next_page() |
| 1920 ->area_start(); |
| 1919 } | 1921 } |
| 1920 } | 1922 } |
| 1921 | 1923 |
| 1922 // Promote and process all the to-be-promoted objects. | 1924 // Promote and process all the to-be-promoted objects. |
| 1923 { | 1925 { |
| 1924 while (!promotion_queue()->is_empty()) { | 1926 while (!promotion_queue()->is_empty()) { |
| 1925 HeapObject* target; | 1927 HeapObject* target; |
| 1926 int32_t size; | 1928 int32_t size; |
| 1927 bool was_marked_black; | 1929 bool was_marked_black; |
| 1928 promotion_queue()->remove(&target, &size, &was_marked_black); | 1930 promotion_queue()->remove(&target, &size, &was_marked_black); |
| (...skipping 2697 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4626 } | 4628 } |
| 4627 } | 4629 } |
| 4628 #endif | 4630 #endif |
| 4629 | 4631 |
| 4630 | 4632 |
| 4631 void Heap::ZapFromSpace() { | 4633 void Heap::ZapFromSpace() { |
| 4632 if (!new_space_.IsFromSpaceCommitted()) return; | 4634 if (!new_space_.IsFromSpaceCommitted()) return; |
| 4633 NewSpacePageIterator it(new_space_.FromSpaceStart(), | 4635 NewSpacePageIterator it(new_space_.FromSpaceStart(), |
| 4634 new_space_.FromSpaceEnd()); | 4636 new_space_.FromSpaceEnd()); |
| 4635 while (it.has_next()) { | 4637 while (it.has_next()) { |
| 4636 NewSpacePage* page = it.next(); | 4638 Page* page = it.next(); |
| 4637 for (Address cursor = page->area_start(), limit = page->area_end(); | 4639 for (Address cursor = page->area_start(), limit = page->area_end(); |
| 4638 cursor < limit; cursor += kPointerSize) { | 4640 cursor < limit; cursor += kPointerSize) { |
| 4639 Memory::Address_at(cursor) = kFromSpaceZapValue; | 4641 Memory::Address_at(cursor) = kFromSpaceZapValue; |
| 4640 } | 4642 } |
| 4641 } | 4643 } |
| 4642 } | 4644 } |
| 4643 | 4645 |
| 4644 void Heap::IteratePromotedObjectPointers(HeapObject* object, Address start, | 4646 void Heap::IteratePromotedObjectPointers(HeapObject* object, Address start, |
| 4645 Address end, bool record_slots, | 4647 Address end, bool record_slots, |
| 4646 ObjectSlotCallback callback) { | 4648 ObjectSlotCallback callback) { |
| (...skipping 1778 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6425 } | 6427 } |
| 6426 | 6428 |
| 6427 | 6429 |
| 6428 // static | 6430 // static |
| 6429 int Heap::GetStaticVisitorIdForMap(Map* map) { | 6431 int Heap::GetStaticVisitorIdForMap(Map* map) { |
| 6430 return StaticVisitorBase::GetVisitorId(map); | 6432 return StaticVisitorBase::GetVisitorId(map); |
| 6431 } | 6433 } |
| 6432 | 6434 |
| 6433 } // namespace internal | 6435 } // namespace internal |
| 6434 } // namespace v8 | 6436 } // namespace v8 |
| OLD | NEW |