| 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/context-slot-cache.h" | 9 #include "src/ast/context-slot-cache.h" |
| 10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
| (...skipping 1484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1495 survived_since_last_expansion_ = 0; | 1495 survived_since_last_expansion_ = 0; |
| 1496 } | 1496 } |
| 1497 } | 1497 } |
| 1498 | 1498 |
| 1499 | 1499 |
| 1500 static bool IsUnscavengedHeapObject(Heap* heap, Object** p) { | 1500 static bool IsUnscavengedHeapObject(Heap* heap, Object** p) { |
| 1501 return heap->InNewSpace(*p) && | 1501 return heap->InNewSpace(*p) && |
| 1502 !HeapObject::cast(*p)->map_word().IsForwardingAddress(); | 1502 !HeapObject::cast(*p)->map_word().IsForwardingAddress(); |
| 1503 } | 1503 } |
| 1504 | 1504 |
| 1505 | |
| 1506 static bool IsUnmodifiedHeapObject(Object** p) { | |
| 1507 Object* object = *p; | |
| 1508 if (object->IsSmi()) return false; | |
| 1509 HeapObject* heap_object = HeapObject::cast(object); | |
| 1510 if (!object->IsJSObject()) return false; | |
| 1511 JSObject* js_object = JSObject::cast(object); | |
| 1512 if (!js_object->WasConstructedFromApiFunction()) return false; | |
| 1513 JSFunction* constructor = | |
| 1514 JSFunction::cast(js_object->map()->GetConstructor()); | |
| 1515 | |
| 1516 return constructor->initial_map() == heap_object->map(); | |
| 1517 } | |
| 1518 | |
| 1519 | |
| 1520 void PromotionQueue::Initialize() { | 1505 void PromotionQueue::Initialize() { |
| 1521 // The last to-space page may be used for promotion queue. On promotion | 1506 // The last to-space page may be used for promotion queue. On promotion |
| 1522 // conflict, we use the emergency stack. | 1507 // conflict, we use the emergency stack. |
| 1523 DCHECK((Page::kPageSize - MemoryChunk::kBodyOffset) % (2 * kPointerSize) == | 1508 DCHECK((Page::kPageSize - MemoryChunk::kBodyOffset) % (2 * kPointerSize) == |
| 1524 0); | 1509 0); |
| 1525 front_ = rear_ = | 1510 front_ = rear_ = |
| 1526 reinterpret_cast<struct Entry*>(heap_->new_space()->ToSpaceEnd()); | 1511 reinterpret_cast<struct Entry*>(heap_->new_space()->ToSpaceEnd()); |
| 1527 limit_ = reinterpret_cast<struct Entry*>( | 1512 limit_ = reinterpret_cast<struct Entry*>( |
| 1528 Page::FromAllocationAreaAddress(reinterpret_cast<Address>(rear_)) | 1513 Page::FromAllocationAreaAddress(reinterpret_cast<Address>(rear_)) |
| 1529 ->area_start()); | 1514 ->area_start()); |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1684 } | 1669 } |
| 1685 | 1670 |
| 1686 { | 1671 { |
| 1687 TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_SEMISPACE); | 1672 TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_SEMISPACE); |
| 1688 new_space_front = DoScavenge(&scavenge_visitor, new_space_front); | 1673 new_space_front = DoScavenge(&scavenge_visitor, new_space_front); |
| 1689 } | 1674 } |
| 1690 | 1675 |
| 1691 isolate()->global_handles()->MarkNewSpaceWeakUnmodifiedObjectsPending( | 1676 isolate()->global_handles()->MarkNewSpaceWeakUnmodifiedObjectsPending( |
| 1692 &IsUnscavengedHeapObject); | 1677 &IsUnscavengedHeapObject); |
| 1693 | 1678 |
| 1694 isolate()->global_handles()->IterateNewSpaceWeakUnmodifiedRoots( | 1679 isolate() |
| 1695 &scavenge_visitor); | 1680 ->global_handles() |
| 1681 ->IterateNewSpaceWeakUnmodifiedRoots< |
| 1682 GlobalHandles::HANDLE_PHANTOM_NODES_VISIT_OTHERS>(&scavenge_visitor); |
| 1696 new_space_front = DoScavenge(&scavenge_visitor, new_space_front); | 1683 new_space_front = DoScavenge(&scavenge_visitor, new_space_front); |
| 1697 | 1684 |
| 1698 UpdateNewSpaceReferencesInExternalStringTable( | 1685 UpdateNewSpaceReferencesInExternalStringTable( |
| 1699 &UpdateNewSpaceReferenceInExternalStringTableEntry); | 1686 &UpdateNewSpaceReferenceInExternalStringTableEntry); |
| 1700 | 1687 |
| 1701 promotion_queue_.Destroy(); | 1688 promotion_queue_.Destroy(); |
| 1702 | 1689 |
| 1703 incremental_marking()->UpdateMarkingDequeAfterScavenge(); | 1690 incremental_marking()->UpdateMarkingDequeAfterScavenge(); |
| 1704 | 1691 |
| 1705 ScavengeWeakObjectRetainer weak_object_retainer(this); | 1692 ScavengeWeakObjectRetainer weak_object_retainer(this); |
| (...skipping 1199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2905 return false; | 2892 return false; |
| 2906 } | 2893 } |
| 2907 } | 2894 } |
| 2908 | 2895 |
| 2909 | 2896 |
| 2910 bool Heap::RootCanBeTreatedAsConstant(RootListIndex root_index) { | 2897 bool Heap::RootCanBeTreatedAsConstant(RootListIndex root_index) { |
| 2911 return !RootCanBeWrittenAfterInitialization(root_index) && | 2898 return !RootCanBeWrittenAfterInitialization(root_index) && |
| 2912 !InNewSpace(root(root_index)); | 2899 !InNewSpace(root(root_index)); |
| 2913 } | 2900 } |
| 2914 | 2901 |
| 2902 bool Heap::IsUnmodifiedHeapObject(Object** p) { |
| 2903 Object* object = *p; |
| 2904 if (object->IsSmi()) return false; |
| 2905 HeapObject* heap_object = HeapObject::cast(object); |
| 2906 if (!object->IsJSObject()) return false; |
| 2907 JSObject* js_object = JSObject::cast(object); |
| 2908 if (!js_object->WasConstructedFromApiFunction()) return false; |
| 2909 JSFunction* constructor = |
| 2910 JSFunction::cast(js_object->map()->GetConstructor()); |
| 2911 |
| 2912 return constructor->initial_map() == heap_object->map(); |
| 2913 } |
| 2915 | 2914 |
| 2916 int Heap::FullSizeNumberStringCacheLength() { | 2915 int Heap::FullSizeNumberStringCacheLength() { |
| 2917 // Compute the size of the number string cache based on the max newspace size. | 2916 // Compute the size of the number string cache based on the max newspace size. |
| 2918 // The number string cache has a minimum size based on twice the initial cache | 2917 // The number string cache has a minimum size based on twice the initial cache |
| 2919 // size to ensure that it is bigger after being made 'full size'. | 2918 // size to ensure that it is bigger after being made 'full size'. |
| 2920 size_t number_string_cache_size = max_semi_space_size_ / 512; | 2919 size_t number_string_cache_size = max_semi_space_size_ / 512; |
| 2921 number_string_cache_size = | 2920 number_string_cache_size = |
| 2922 Max(static_cast<size_t>(kInitialNumberStringCacheSize * 2), | 2921 Max(static_cast<size_t>(kInitialNumberStringCacheSize * 2), |
| 2923 Min<size_t>(0x4000u, number_string_cache_size)); | 2922 Min<size_t>(0x4000u, number_string_cache_size)); |
| 2924 // There is a string and a number per entry so the length is twice the number | 2923 // There is a string and a number per entry so the length is twice the number |
| (...skipping 3546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6471 } | 6470 } |
| 6472 | 6471 |
| 6473 | 6472 |
| 6474 // static | 6473 // static |
| 6475 int Heap::GetStaticVisitorIdForMap(Map* map) { | 6474 int Heap::GetStaticVisitorIdForMap(Map* map) { |
| 6476 return StaticVisitorBase::GetVisitorId(map); | 6475 return StaticVisitorBase::GetVisitorId(map); |
| 6477 } | 6476 } |
| 6478 | 6477 |
| 6479 } // namespace internal | 6478 } // namespace internal |
| 6480 } // namespace v8 | 6479 } // namespace v8 |
| OLD | NEW |