| 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/v8.h" | 5 #include "src/v8.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/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/base/once.h" | 10 #include "src/base/once.h" |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 #if defined(V8_MAX_SEMISPACE_SIZE) | 149 #if defined(V8_MAX_SEMISPACE_SIZE) |
| 150 max_semi_space_size_ = reserved_semispace_size_ = V8_MAX_SEMISPACE_SIZE; | 150 max_semi_space_size_ = reserved_semispace_size_ = V8_MAX_SEMISPACE_SIZE; |
| 151 #endif | 151 #endif |
| 152 | 152 |
| 153 // Ensure old_generation_size_ is a multiple of kPageSize. | 153 // Ensure old_generation_size_ is a multiple of kPageSize. |
| 154 DCHECK(MB >= Page::kPageSize); | 154 DCHECK(MB >= Page::kPageSize); |
| 155 | 155 |
| 156 memset(roots_, 0, sizeof(roots_[0]) * kRootListLength); | 156 memset(roots_, 0, sizeof(roots_[0]) * kRootListLength); |
| 157 set_native_contexts_list(NULL); | 157 set_native_contexts_list(NULL); |
| 158 set_array_buffers_list(Smi::FromInt(0)); | 158 set_array_buffers_list(Smi::FromInt(0)); |
| 159 set_last_array_buffer_in_list(Smi::FromInt(0)); |
| 159 set_allocation_sites_list(Smi::FromInt(0)); | 160 set_allocation_sites_list(Smi::FromInt(0)); |
| 160 set_encountered_weak_collections(Smi::FromInt(0)); | 161 set_encountered_weak_collections(Smi::FromInt(0)); |
| 161 set_encountered_weak_cells(Smi::FromInt(0)); | 162 set_encountered_weak_cells(Smi::FromInt(0)); |
| 162 // Put a dummy entry in the remembered pages so we can find the list the | 163 // Put a dummy entry in the remembered pages so we can find the list the |
| 163 // minidump even if there are no real unmapped pages. | 164 // minidump even if there are no real unmapped pages. |
| 164 RememberUnmappedPage(NULL, false); | 165 RememberUnmappedPage(NULL, false); |
| 165 | 166 |
| 166 ClearObjectStats(true); | 167 ClearObjectStats(true); |
| 167 } | 168 } |
| 168 | 169 |
| (...skipping 1503 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1672 | 1673 |
| 1673 | 1674 |
| 1674 void Heap::ProcessYoungWeakReferences(WeakObjectRetainer* retainer) { | 1675 void Heap::ProcessYoungWeakReferences(WeakObjectRetainer* retainer) { |
| 1675 ProcessArrayBuffers(retainer, true); | 1676 ProcessArrayBuffers(retainer, true); |
| 1676 ProcessNewArrayBufferViews(retainer); | 1677 ProcessNewArrayBufferViews(retainer); |
| 1677 ProcessNativeContexts(retainer); | 1678 ProcessNativeContexts(retainer); |
| 1678 } | 1679 } |
| 1679 | 1680 |
| 1680 | 1681 |
| 1681 void Heap::ProcessNativeContexts(WeakObjectRetainer* retainer) { | 1682 void Heap::ProcessNativeContexts(WeakObjectRetainer* retainer) { |
| 1682 Object* head = | 1683 Object* head = VisitWeakList<Context>(this, native_contexts_list(), retainer, |
| 1683 VisitWeakList<Context>(this, native_contexts_list(), retainer, false); | 1684 false, NULL); |
| 1684 // Update the head of the list of contexts. | 1685 // Update the head of the list of contexts. |
| 1685 set_native_contexts_list(head); | 1686 set_native_contexts_list(head); |
| 1686 } | 1687 } |
| 1687 | 1688 |
| 1688 | 1689 |
| 1689 void Heap::ProcessArrayBuffers(WeakObjectRetainer* retainer, | 1690 void Heap::ProcessArrayBuffers(WeakObjectRetainer* retainer, |
| 1690 bool stop_after_young) { | 1691 bool stop_after_young) { |
| 1691 Object* array_buffer_obj = VisitWeakList<JSArrayBuffer>( | 1692 Object* last_array_buffer = undefined_value(); |
| 1692 this, array_buffers_list(), retainer, stop_after_young); | 1693 Object* array_buffer_obj = |
| 1694 VisitWeakList<JSArrayBuffer>(this, array_buffers_list(), retainer, |
| 1695 stop_after_young, &last_array_buffer); |
| 1693 set_array_buffers_list(array_buffer_obj); | 1696 set_array_buffers_list(array_buffer_obj); |
| 1697 set_last_array_buffer_in_list(last_array_buffer); |
| 1694 | 1698 |
| 1695 // Verify invariant that young array buffers come before old array buffers | 1699 // Verify invariant that young array buffers come before old array buffers |
| 1696 // in array buffers list if there was no promotion failure. | 1700 // in array buffers list if there was no promotion failure. |
| 1697 Object* undefined = undefined_value(); | 1701 Object* undefined = undefined_value(); |
| 1698 Object* next = array_buffers_list(); | 1702 Object* next = array_buffers_list(); |
| 1699 bool old_objects_recorded = false; | 1703 bool old_objects_recorded = false; |
| 1700 if (migration_failure()) return; | 1704 if (migration_failure()) return; |
| 1701 while (next != undefined) { | 1705 while (next != undefined) { |
| 1702 if (!old_objects_recorded) { | 1706 if (!old_objects_recorded) { |
| 1703 old_objects_recorded = !InNewSpace(next); | 1707 old_objects_recorded = !InNewSpace(next); |
| 1704 } | 1708 } |
| 1705 CHECK((InNewSpace(next) && !old_objects_recorded) || !InNewSpace(next)); | 1709 CHECK((InNewSpace(next) && !old_objects_recorded) || !InNewSpace(next)); |
| 1706 next = JSArrayBuffer::cast(next)->weak_next(); | 1710 next = JSArrayBuffer::cast(next)->weak_next(); |
| 1707 } | 1711 } |
| 1708 } | 1712 } |
| 1709 | 1713 |
| 1710 | 1714 |
| 1711 void Heap::ProcessNewArrayBufferViews(WeakObjectRetainer* retainer) { | 1715 void Heap::ProcessNewArrayBufferViews(WeakObjectRetainer* retainer) { |
| 1712 // Retain the list of new space views. | 1716 // Retain the list of new space views. |
| 1713 Object* typed_array_obj = VisitWeakList<JSArrayBufferView>( | 1717 Object* typed_array_obj = VisitWeakList<JSArrayBufferView>( |
| 1714 this, new_array_buffer_views_list_, retainer, false); | 1718 this, new_array_buffer_views_list_, retainer, false, NULL); |
| 1715 set_new_array_buffer_views_list(typed_array_obj); | 1719 set_new_array_buffer_views_list(typed_array_obj); |
| 1716 | 1720 |
| 1717 // Some objects in the list may be in old space now. Find them | 1721 // Some objects in the list may be in old space now. Find them |
| 1718 // and move them to the corresponding array buffer. | 1722 // and move them to the corresponding array buffer. |
| 1719 Object* view = VisitNewArrayBufferViewsWeakList( | 1723 Object* view = VisitNewArrayBufferViewsWeakList( |
| 1720 this, new_array_buffer_views_list_, retainer); | 1724 this, new_array_buffer_views_list_, retainer); |
| 1721 set_new_array_buffer_views_list(view); | 1725 set_new_array_buffer_views_list(view); |
| 1722 } | 1726 } |
| 1723 | 1727 |
| 1724 | 1728 |
| 1725 void Heap::TearDownArrayBuffers() { | 1729 void Heap::TearDownArrayBuffers() { |
| 1726 Object* undefined = undefined_value(); | 1730 Object* undefined = undefined_value(); |
| 1727 for (Object* o = array_buffers_list(); o != undefined;) { | 1731 for (Object* o = array_buffers_list(); o != undefined;) { |
| 1728 JSArrayBuffer* buffer = JSArrayBuffer::cast(o); | 1732 JSArrayBuffer* buffer = JSArrayBuffer::cast(o); |
| 1729 Runtime::FreeArrayBuffer(isolate(), buffer); | 1733 Runtime::FreeArrayBuffer(isolate(), buffer); |
| 1730 o = buffer->weak_next(); | 1734 o = buffer->weak_next(); |
| 1731 } | 1735 } |
| 1732 set_array_buffers_list(undefined); | 1736 set_array_buffers_list(undefined); |
| 1733 } | 1737 } |
| 1734 | 1738 |
| 1735 | 1739 |
| 1736 void Heap::ProcessAllocationSites(WeakObjectRetainer* retainer) { | 1740 void Heap::ProcessAllocationSites(WeakObjectRetainer* retainer) { |
| 1737 Object* allocation_site_obj = VisitWeakList<AllocationSite>( | 1741 Object* allocation_site_obj = VisitWeakList<AllocationSite>( |
| 1738 this, allocation_sites_list(), retainer, false); | 1742 this, allocation_sites_list(), retainer, false, NULL); |
| 1739 set_allocation_sites_list(allocation_site_obj); | 1743 set_allocation_sites_list(allocation_site_obj); |
| 1740 } | 1744 } |
| 1741 | 1745 |
| 1742 | 1746 |
| 1743 void Heap::ResetAllAllocationSitesDependentCode(PretenureFlag flag) { | 1747 void Heap::ResetAllAllocationSitesDependentCode(PretenureFlag flag) { |
| 1744 DisallowHeapAllocation no_allocation_scope; | 1748 DisallowHeapAllocation no_allocation_scope; |
| 1745 Object* cur = allocation_sites_list(); | 1749 Object* cur = allocation_sites_list(); |
| 1746 bool marked = false; | 1750 bool marked = false; |
| 1747 while (cur->IsAllocationSite()) { | 1751 while (cur->IsAllocationSite()) { |
| 1748 AllocationSite* casted = AllocationSite::cast(cur); | 1752 AllocationSite* casted = AllocationSite::cast(cur); |
| (...skipping 3588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5337 // Create initial maps. | 5341 // Create initial maps. |
| 5338 if (!CreateInitialMaps()) return false; | 5342 if (!CreateInitialMaps()) return false; |
| 5339 CreateApiObjects(); | 5343 CreateApiObjects(); |
| 5340 | 5344 |
| 5341 // Create initial objects | 5345 // Create initial objects |
| 5342 CreateInitialObjects(); | 5346 CreateInitialObjects(); |
| 5343 CHECK_EQ(0u, gc_count_); | 5347 CHECK_EQ(0u, gc_count_); |
| 5344 | 5348 |
| 5345 set_native_contexts_list(undefined_value()); | 5349 set_native_contexts_list(undefined_value()); |
| 5346 set_array_buffers_list(undefined_value()); | 5350 set_array_buffers_list(undefined_value()); |
| 5351 set_last_array_buffer_in_list(undefined_value()); |
| 5347 set_new_array_buffer_views_list(undefined_value()); | 5352 set_new_array_buffer_views_list(undefined_value()); |
| 5348 set_allocation_sites_list(undefined_value()); | 5353 set_allocation_sites_list(undefined_value()); |
| 5349 return true; | 5354 return true; |
| 5350 } | 5355 } |
| 5351 | 5356 |
| 5352 | 5357 |
| 5353 void Heap::SetStackLimits() { | 5358 void Heap::SetStackLimits() { |
| 5354 DCHECK(isolate_ != NULL); | 5359 DCHECK(isolate_ != NULL); |
| 5355 DCHECK(isolate_ == isolate()); | 5360 DCHECK(isolate_ == isolate()); |
| 5356 // On 64 bit machines, pointers are generally out of range of Smis. We write | 5361 // On 64 bit machines, pointers are generally out of range of Smis. We write |
| (...skipping 949 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6306 static_cast<int>(object_sizes_last_time_[index])); | 6311 static_cast<int>(object_sizes_last_time_[index])); |
| 6307 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) | 6312 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) |
| 6308 #undef ADJUST_LAST_TIME_OBJECT_COUNT | 6313 #undef ADJUST_LAST_TIME_OBJECT_COUNT |
| 6309 | 6314 |
| 6310 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); | 6315 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); |
| 6311 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); | 6316 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); |
| 6312 ClearObjectStats(); | 6317 ClearObjectStats(); |
| 6313 } | 6318 } |
| 6314 } | 6319 } |
| 6315 } // namespace v8::internal | 6320 } // namespace v8::internal |
| OLD | NEW |