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 // the new space, then there may be uninitialized memory behind the top | 938 // the new space, then there may be uninitialized memory behind the top |
939 // pointer of the new space page. We store a filler object there to | 939 // pointer of the new space page. We store a filler object there to |
940 // identify the unused space. | 940 // identify the unused space. |
941 Address from_top = new_space_.top(); | 941 Address from_top = new_space_.top(); |
942 // Check that from_top is inside its page (i.e., not at the end). | 942 // Check that from_top is inside its page (i.e., not at the end). |
943 Address space_end = new_space_.ToSpaceEnd(); | 943 Address space_end = new_space_.ToSpaceEnd(); |
944 if (from_top < space_end) { | 944 if (from_top < space_end) { |
945 Page* page = Page::FromAddress(from_top); | 945 Page* page = Page::FromAddress(from_top); |
946 if (page->Contains(from_top)) { | 946 if (page->Contains(from_top)) { |
947 int remaining_in_page = static_cast<int>(page->area_end() - from_top); | 947 int remaining_in_page = static_cast<int>(page->area_end() - from_top); |
948 CreateFillerObjectAt(from_top, remaining_in_page); | 948 CreateFillerObjectAt(from_top, remaining_in_page, kNoRecordedSlots); |
949 } | 949 } |
950 } | 950 } |
951 } | 951 } |
952 | 952 |
953 | 953 |
954 bool Heap::CollectGarbage(GarbageCollector collector, const char* gc_reason, | 954 bool Heap::CollectGarbage(GarbageCollector collector, const char* gc_reason, |
955 const char* collector_reason, | 955 const char* collector_reason, |
956 const v8::GCCallbackFlags gc_callback_flags) { | 956 const v8::GCCallbackFlags gc_callback_flags) { |
957 // The VM is in the GC state until exiting this function. | 957 // The VM is in the GC state until exiting this function. |
958 VMState<GC> state(isolate_); | 958 VMState<GC> state(isolate_); |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1159 if (space == NEW_SPACE) { | 1159 if (space == NEW_SPACE) { |
1160 allocation = new_space()->AllocateRawUnaligned(size); | 1160 allocation = new_space()->AllocateRawUnaligned(size); |
1161 } else { | 1161 } else { |
1162 allocation = paged_space(space)->AllocateRawUnaligned(size); | 1162 allocation = paged_space(space)->AllocateRawUnaligned(size); |
1163 } | 1163 } |
1164 HeapObject* free_space = nullptr; | 1164 HeapObject* free_space = nullptr; |
1165 if (allocation.To(&free_space)) { | 1165 if (allocation.To(&free_space)) { |
1166 // Mark with a free list node, in case we have a GC before | 1166 // Mark with a free list node, in case we have a GC before |
1167 // deserializing. | 1167 // deserializing. |
1168 Address free_space_address = free_space->address(); | 1168 Address free_space_address = free_space->address(); |
1169 CreateFillerObjectAt(free_space_address, size); | 1169 CreateFillerObjectAt(free_space_address, size, kNoRecordedSlots); |
1170 DCHECK(space < Serializer::kNumberOfPreallocatedSpaces); | 1170 DCHECK(space < Serializer::kNumberOfPreallocatedSpaces); |
1171 chunk.start = free_space_address; | 1171 chunk.start = free_space_address; |
1172 chunk.end = free_space_address + size; | 1172 chunk.end = free_space_address + size; |
1173 } else { | 1173 } else { |
1174 perform_gc = true; | 1174 perform_gc = true; |
1175 break; | 1175 break; |
1176 } | 1176 } |
1177 } | 1177 } |
1178 } | 1178 } |
1179 if (perform_gc) { | 1179 if (perform_gc) { |
(...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1992 return kDoubleSize - kPointerSize; // No fill if double is always aligned. | 1992 return kDoubleSize - kPointerSize; // No fill if double is always aligned. |
1993 if (alignment == kSimd128Unaligned) { | 1993 if (alignment == kSimd128Unaligned) { |
1994 return (kSimd128Size - (static_cast<int>(offset) + kPointerSize)) & | 1994 return (kSimd128Size - (static_cast<int>(offset) + kPointerSize)) & |
1995 kSimd128AlignmentMask; | 1995 kSimd128AlignmentMask; |
1996 } | 1996 } |
1997 return 0; | 1997 return 0; |
1998 } | 1998 } |
1999 | 1999 |
2000 | 2000 |
2001 HeapObject* Heap::PrecedeWithFiller(HeapObject* object, int filler_size) { | 2001 HeapObject* Heap::PrecedeWithFiller(HeapObject* object, int filler_size) { |
2002 CreateFillerObjectAt(object->address(), filler_size); | 2002 CreateFillerObjectAt(object->address(), filler_size, kNoRecordedSlots); |
2003 return HeapObject::FromAddress(object->address() + filler_size); | 2003 return HeapObject::FromAddress(object->address() + filler_size); |
2004 } | 2004 } |
2005 | 2005 |
2006 | 2006 |
2007 HeapObject* Heap::AlignWithFiller(HeapObject* object, int object_size, | 2007 HeapObject* Heap::AlignWithFiller(HeapObject* object, int object_size, |
2008 int allocation_size, | 2008 int allocation_size, |
2009 AllocationAlignment alignment) { | 2009 AllocationAlignment alignment) { |
2010 int filler_size = allocation_size - object_size; | 2010 int filler_size = allocation_size - object_size; |
2011 DCHECK(filler_size > 0); | 2011 DCHECK(filler_size > 0); |
2012 int pre_filler = GetFillToAlign(object->address(), alignment); | 2012 int pre_filler = GetFillToAlign(object->address(), alignment); |
2013 if (pre_filler) { | 2013 if (pre_filler) { |
2014 object = PrecedeWithFiller(object, pre_filler); | 2014 object = PrecedeWithFiller(object, pre_filler); |
2015 filler_size -= pre_filler; | 2015 filler_size -= pre_filler; |
2016 } | 2016 } |
2017 if (filler_size) | 2017 if (filler_size) |
2018 CreateFillerObjectAt(object->address() + object_size, filler_size); | 2018 CreateFillerObjectAt(object->address() + object_size, filler_size, |
| 2019 kNoRecordedSlots); |
2019 return object; | 2020 return object; |
2020 } | 2021 } |
2021 | 2022 |
2022 | 2023 |
2023 HeapObject* Heap::DoubleAlignForDeserialization(HeapObject* object, int size) { | 2024 HeapObject* Heap::DoubleAlignForDeserialization(HeapObject* object, int size) { |
2024 return AlignWithFiller(object, size - kPointerSize, size, kDoubleAligned); | 2025 return AlignWithFiller(object, size - kPointerSize, size, kDoubleAligned); |
2025 } | 2026 } |
2026 | 2027 |
2027 | 2028 |
2028 void Heap::RegisterNewArrayBuffer(JSArrayBuffer* buffer) { | 2029 void Heap::RegisterNewArrayBuffer(JSArrayBuffer* buffer) { |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2126 HeapObject* obj = nullptr; | 2127 HeapObject* obj = nullptr; |
2127 { | 2128 { |
2128 AllocationAlignment align = double_align ? kDoubleAligned : kWordAligned; | 2129 AllocationAlignment align = double_align ? kDoubleAligned : kWordAligned; |
2129 AllocationResult allocation = AllocateRaw(size, space, align); | 2130 AllocationResult allocation = AllocateRaw(size, space, align); |
2130 if (!allocation.To(&obj)) return allocation; | 2131 if (!allocation.To(&obj)) return allocation; |
2131 } | 2132 } |
2132 #ifdef DEBUG | 2133 #ifdef DEBUG |
2133 MemoryChunk* chunk = MemoryChunk::FromAddress(obj->address()); | 2134 MemoryChunk* chunk = MemoryChunk::FromAddress(obj->address()); |
2134 DCHECK(chunk->owner()->identity() == space); | 2135 DCHECK(chunk->owner()->identity() == space); |
2135 #endif | 2136 #endif |
2136 CreateFillerObjectAt(obj->address(), size); | 2137 CreateFillerObjectAt(obj->address(), size, kNoRecordedSlots); |
2137 return obj; | 2138 return obj; |
2138 } | 2139 } |
2139 | 2140 |
2140 | 2141 |
2141 const Heap::StringTypeTable Heap::string_type_table[] = { | 2142 const Heap::StringTypeTable Heap::string_type_table[] = { |
2142 #define STRING_TYPE_ELEMENT(type, size, name, camel_name) \ | 2143 #define STRING_TYPE_ELEMENT(type, size, name, camel_name) \ |
2143 { type, size, k##camel_name##MapRootIndex } \ | 2144 { type, size, k##camel_name##MapRootIndex } \ |
2144 , | 2145 , |
2145 STRING_TYPE_LIST(STRING_TYPE_ELEMENT) | 2146 STRING_TYPE_LIST(STRING_TYPE_ELEMENT) |
2146 #undef STRING_TYPE_ELEMENT | 2147 #undef STRING_TYPE_ELEMENT |
(...skipping 888 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3035 instance->set_parameter_count(parameter_count); | 3036 instance->set_parameter_count(parameter_count); |
3036 instance->set_interrupt_budget(interpreter::Interpreter::InterruptBudget()); | 3037 instance->set_interrupt_budget(interpreter::Interpreter::InterruptBudget()); |
3037 instance->set_constant_pool(constant_pool); | 3038 instance->set_constant_pool(constant_pool); |
3038 instance->set_handler_table(empty_fixed_array()); | 3039 instance->set_handler_table(empty_fixed_array()); |
3039 instance->set_source_position_table(empty_byte_array()); | 3040 instance->set_source_position_table(empty_byte_array()); |
3040 CopyBytes(instance->GetFirstBytecodeAddress(), raw_bytecodes, length); | 3041 CopyBytes(instance->GetFirstBytecodeAddress(), raw_bytecodes, length); |
3041 | 3042 |
3042 return result; | 3043 return result; |
3043 } | 3044 } |
3044 | 3045 |
3045 | 3046 void Heap::CreateFillerObjectAt(Address addr, int size, |
3046 void Heap::CreateFillerObjectAt(Address addr, int size) { | 3047 RecordedSlotsMode mode) { |
3047 if (size == 0) return; | 3048 if (size == 0) return; |
3048 HeapObject* filler = HeapObject::FromAddress(addr); | 3049 HeapObject* filler = HeapObject::FromAddress(addr); |
3049 if (size == kPointerSize) { | 3050 if (size == kPointerSize) { |
3050 filler->set_map_no_write_barrier( | 3051 filler->set_map_no_write_barrier( |
3051 reinterpret_cast<Map*>(root(kOnePointerFillerMapRootIndex))); | 3052 reinterpret_cast<Map*>(root(kOnePointerFillerMapRootIndex))); |
3052 } else if (size == 2 * kPointerSize) { | 3053 } else if (size == 2 * kPointerSize) { |
3053 filler->set_map_no_write_barrier( | 3054 filler->set_map_no_write_barrier( |
3054 reinterpret_cast<Map*>(root(kTwoPointerFillerMapRootIndex))); | 3055 reinterpret_cast<Map*>(root(kTwoPointerFillerMapRootIndex))); |
3055 } else { | 3056 } else { |
3056 DCHECK_GT(size, 2 * kPointerSize); | 3057 DCHECK_GT(size, 2 * kPointerSize); |
3057 filler->set_map_no_write_barrier( | 3058 filler->set_map_no_write_barrier( |
3058 reinterpret_cast<Map*>(root(kFreeSpaceMapRootIndex))); | 3059 reinterpret_cast<Map*>(root(kFreeSpaceMapRootIndex))); |
3059 FreeSpace::cast(filler)->nobarrier_set_size(size); | 3060 FreeSpace::cast(filler)->nobarrier_set_size(size); |
3060 } | 3061 } |
| 3062 if (mode == kClearRecordedSlots) { |
| 3063 ClearRecordedSlotRange(addr, addr + size); |
| 3064 } |
3061 // At this point, we may be deserializing the heap from a snapshot, and | 3065 // At this point, we may be deserializing the heap from a snapshot, and |
3062 // none of the maps have been created yet and are NULL. | 3066 // none of the maps have been created yet and are NULL. |
3063 DCHECK((filler->map() == NULL && !deserialization_complete_) || | 3067 DCHECK((filler->map() == NULL && !deserialization_complete_) || |
3064 filler->map()->IsMap()); | 3068 filler->map()->IsMap()); |
3065 } | 3069 } |
3066 | 3070 |
3067 | 3071 |
3068 bool Heap::CanMoveObjectStart(HeapObject* object) { | 3072 bool Heap::CanMoveObjectStart(HeapObject* object) { |
3069 if (!FLAG_move_object_start) return false; | 3073 if (!FLAG_move_object_start) return false; |
3070 | 3074 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3124 | 3128 |
3125 const int len = object->length(); | 3129 const int len = object->length(); |
3126 DCHECK(elements_to_trim <= len); | 3130 DCHECK(elements_to_trim <= len); |
3127 | 3131 |
3128 // Calculate location of new array start. | 3132 // Calculate location of new array start. |
3129 Address new_start = object->address() + bytes_to_trim; | 3133 Address new_start = object->address() + bytes_to_trim; |
3130 | 3134 |
3131 // Technically in new space this write might be omitted (except for | 3135 // Technically in new space this write might be omitted (except for |
3132 // debug mode which iterates through the heap), but to play safer | 3136 // debug mode which iterates through the heap), but to play safer |
3133 // we still do it. | 3137 // we still do it. |
3134 CreateFillerObjectAt(object->address(), bytes_to_trim); | 3138 CreateFillerObjectAt(object->address(), bytes_to_trim, kClearRecordedSlots); |
3135 | 3139 |
3136 // Initialize header of the trimmed array. Since left trimming is only | 3140 // Initialize header of the trimmed array. Since left trimming is only |
3137 // performed on pages which are not concurrently swept creating a filler | 3141 // performed on pages which are not concurrently swept creating a filler |
3138 // object does not require synchronization. | 3142 // object does not require synchronization. |
3139 DCHECK(CanMoveObjectStart(object)); | 3143 DCHECK(CanMoveObjectStart(object)); |
3140 Object** former_start = HeapObject::RawField(object, 0); | 3144 Object** former_start = HeapObject::RawField(object, 0); |
3141 int new_start_index = elements_to_trim * (element_size / kPointerSize); | 3145 int new_start_index = elements_to_trim * (element_size / kPointerSize); |
3142 former_start[new_start_index] = map; | 3146 former_start[new_start_index] = map; |
3143 former_start[new_start_index + 1] = Smi::FromInt(len - elements_to_trim); | 3147 former_start[new_start_index + 1] = Smi::FromInt(len - elements_to_trim); |
3144 FixedArrayBase* new_object = | 3148 FixedArrayBase* new_object = |
3145 FixedArrayBase::cast(HeapObject::FromAddress(new_start)); | 3149 FixedArrayBase::cast(HeapObject::FromAddress(new_start)); |
3146 | 3150 |
3147 // Maintain consistency of live bytes during incremental marking | 3151 // Maintain consistency of live bytes during incremental marking |
3148 Marking::TransferMark(this, object->address(), new_start); | 3152 Marking::TransferMark(this, object->address(), new_start); |
3149 if (mark_compact_collector()->sweeping_in_progress()) { | |
3150 // Array trimming during sweeping can add invalid slots in free list. | |
3151 ClearRecordedSlotRange(object, former_start, | |
3152 HeapObject::RawField(new_object, 0)); | |
3153 } | |
3154 AdjustLiveBytes(new_object, -bytes_to_trim, Heap::CONCURRENT_TO_SWEEPER); | 3153 AdjustLiveBytes(new_object, -bytes_to_trim, Heap::CONCURRENT_TO_SWEEPER); |
3155 | 3154 |
3156 // Notify the heap profiler of change in object layout. | 3155 // Notify the heap profiler of change in object layout. |
3157 OnMoveEvent(new_object, object, new_object->Size()); | 3156 OnMoveEvent(new_object, object, new_object->Size()); |
3158 return new_object; | 3157 return new_object; |
3159 } | 3158 } |
3160 | 3159 |
3161 | 3160 |
3162 // Force instantiation of templatized method. | 3161 // Force instantiation of templatized method. |
3163 template void Heap::RightTrimFixedArray<Heap::SEQUENTIAL_TO_SWEEPER>( | 3162 template void Heap::RightTrimFixedArray<Heap::SEQUENTIAL_TO_SWEEPER>( |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3203 Address old_end = object->address() + object->Size(); | 3202 Address old_end = object->address() + object->Size(); |
3204 Address new_end = old_end - bytes_to_trim; | 3203 Address new_end = old_end - bytes_to_trim; |
3205 | 3204 |
3206 // Technically in new space this write might be omitted (except for | 3205 // Technically in new space this write might be omitted (except for |
3207 // debug mode which iterates through the heap), but to play safer | 3206 // debug mode which iterates through the heap), but to play safer |
3208 // we still do it. | 3207 // we still do it. |
3209 // We do not create a filler for objects in large object space. | 3208 // We do not create a filler for objects in large object space. |
3210 // TODO(hpayer): We should shrink the large object page if the size | 3209 // TODO(hpayer): We should shrink the large object page if the size |
3211 // of the object changed significantly. | 3210 // of the object changed significantly. |
3212 if (!lo_space()->Contains(object)) { | 3211 if (!lo_space()->Contains(object)) { |
3213 CreateFillerObjectAt(new_end, bytes_to_trim); | 3212 CreateFillerObjectAt(new_end, bytes_to_trim, kClearRecordedSlots); |
3214 if (mark_compact_collector()->sweeping_in_progress()) { | |
3215 // Array trimming during sweeping can add invalid slots in free list. | |
3216 ClearRecordedSlotRange(object, reinterpret_cast<Object**>(new_end), | |
3217 reinterpret_cast<Object**>(old_end)); | |
3218 } | |
3219 } | 3213 } |
3220 | 3214 |
3221 // Initialize header of the trimmed array. We are storing the new length | 3215 // Initialize header of the trimmed array. We are storing the new length |
3222 // using release store after creating a filler for the left-over space to | 3216 // using release store after creating a filler for the left-over space to |
3223 // avoid races with the sweeper thread. | 3217 // avoid races with the sweeper thread. |
3224 object->synchronized_set_length(len - elements_to_trim); | 3218 object->synchronized_set_length(len - elements_to_trim); |
3225 | 3219 |
3226 // Maintain consistency of live bytes during incremental marking | 3220 // Maintain consistency of live bytes during incremental marking |
3227 AdjustLiveBytes(object, -bytes_to_trim, mode); | 3221 AdjustLiveBytes(object, -bytes_to_trim, mode); |
3228 | 3222 |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3312 | 3306 |
3313 if (immovable) { | 3307 if (immovable) { |
3314 Address address = result->address(); | 3308 Address address = result->address(); |
3315 // Code objects which should stay at a fixed address are allocated either | 3309 // Code objects which should stay at a fixed address are allocated either |
3316 // in the first page of code space (objects on the first page of each space | 3310 // in the first page of code space (objects on the first page of each space |
3317 // are never moved) or in large object space. | 3311 // are never moved) or in large object space. |
3318 if (!code_space_->FirstPage()->Contains(address) && | 3312 if (!code_space_->FirstPage()->Contains(address) && |
3319 MemoryChunk::FromAddress(address)->owner()->identity() != LO_SPACE) { | 3313 MemoryChunk::FromAddress(address)->owner()->identity() != LO_SPACE) { |
3320 // Discard the first code allocation, which was on a page where it could | 3314 // Discard the first code allocation, which was on a page where it could |
3321 // be moved. | 3315 // be moved. |
3322 CreateFillerObjectAt(result->address(), object_size); | 3316 CreateFillerObjectAt(result->address(), object_size, kNoRecordedSlots); |
3323 allocation = lo_space_->AllocateRaw(object_size, EXECUTABLE); | 3317 allocation = lo_space_->AllocateRaw(object_size, EXECUTABLE); |
3324 if (!allocation.To(&result)) return allocation; | 3318 if (!allocation.To(&result)) return allocation; |
3325 OnAllocationEvent(result, object_size); | 3319 OnAllocationEvent(result, object_size); |
3326 } | 3320 } |
3327 } | 3321 } |
3328 | 3322 |
3329 result->set_map_no_write_barrier(code_map()); | 3323 result->set_map_no_write_barrier(code_map()); |
3330 Code* code = Code::cast(result); | 3324 Code* code = Code::cast(result); |
3331 DCHECK(IsAligned(bit_cast<intptr_t>(code->address()), kCodeAlignment)); | 3325 DCHECK(IsAligned(bit_cast<intptr_t>(code->address()), kCodeAlignment)); |
3332 DCHECK(isolate_->code_range() == NULL || !isolate_->code_range()->valid() || | 3326 DCHECK(isolate_->code_range() == NULL || !isolate_->code_range()->valid() || |
(...skipping 2241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5574 void Heap::ClearRecordedSlot(HeapObject* object, Object** slot) { | 5568 void Heap::ClearRecordedSlot(HeapObject* object, Object** slot) { |
5575 if (!InNewSpace(object)) { | 5569 if (!InNewSpace(object)) { |
5576 store_buffer()->MoveEntriesToRememberedSet(); | 5570 store_buffer()->MoveEntriesToRememberedSet(); |
5577 Address slot_addr = reinterpret_cast<Address>(slot); | 5571 Address slot_addr = reinterpret_cast<Address>(slot); |
5578 Page* page = Page::FromAddress(slot_addr); | 5572 Page* page = Page::FromAddress(slot_addr); |
5579 DCHECK_EQ(page->owner()->identity(), OLD_SPACE); | 5573 DCHECK_EQ(page->owner()->identity(), OLD_SPACE); |
5580 RememberedSet<OLD_TO_NEW>::Remove(page, slot_addr); | 5574 RememberedSet<OLD_TO_NEW>::Remove(page, slot_addr); |
5581 } | 5575 } |
5582 } | 5576 } |
5583 | 5577 |
5584 void Heap::ClearRecordedSlotRange(HeapObject* object, Object** start, | 5578 void Heap::ClearRecordedSlotRange(Address start, Address end) { |
5585 Object** end) { | 5579 Page* page = Page::FromAddress(start); |
5586 if (!InNewSpace(object)) { | 5580 if (!page->InNewSpace()) { |
5587 store_buffer()->MoveEntriesToRememberedSet(); | 5581 store_buffer()->MoveEntriesToRememberedSet(); |
5588 Address start_addr = reinterpret_cast<Address>(start); | |
5589 Address end_addr = reinterpret_cast<Address>(end); | |
5590 Page* page = Page::FromAddress(start_addr); | |
5591 DCHECK_EQ(page->owner()->identity(), OLD_SPACE); | 5582 DCHECK_EQ(page->owner()->identity(), OLD_SPACE); |
5592 RememberedSet<OLD_TO_NEW>::RemoveRange(page, start_addr, end_addr); | 5583 RememberedSet<OLD_TO_NEW>::RemoveRange(page, start, end); |
5593 } | 5584 } |
5594 } | 5585 } |
5595 | 5586 |
5596 Space* AllSpaces::next() { | 5587 Space* AllSpaces::next() { |
5597 switch (counter_++) { | 5588 switch (counter_++) { |
5598 case NEW_SPACE: | 5589 case NEW_SPACE: |
5599 return heap_->new_space(); | 5590 return heap_->new_space(); |
5600 case OLD_SPACE: | 5591 case OLD_SPACE: |
5601 return heap_->old_space(); | 5592 return heap_->old_space(); |
5602 case CODE_SPACE: | 5593 case CODE_SPACE: |
(...skipping 722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6325 } | 6316 } |
6326 | 6317 |
6327 | 6318 |
6328 // static | 6319 // static |
6329 int Heap::GetStaticVisitorIdForMap(Map* map) { | 6320 int Heap::GetStaticVisitorIdForMap(Map* map) { |
6330 return StaticVisitorBase::GetVisitorId(map); | 6321 return StaticVisitorBase::GetVisitorId(map); |
6331 } | 6322 } |
6332 | 6323 |
6333 } // namespace internal | 6324 } // namespace internal |
6334 } // namespace v8 | 6325 } // namespace v8 |
OLD | NEW |