| 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/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/base/once.h" | 10 #include "src/base/once.h" |
| (...skipping 2558 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2569 } | 2569 } |
| 2570 | 2570 |
| 2571 | 2571 |
| 2572 AllocationResult Heap::AllocatePartialMap(InstanceType instance_type, | 2572 AllocationResult Heap::AllocatePartialMap(InstanceType instance_type, |
| 2573 int instance_size) { | 2573 int instance_size) { |
| 2574 Object* result = nullptr; | 2574 Object* result = nullptr; |
| 2575 AllocationResult allocation = AllocateRaw(Map::kSize, MAP_SPACE, MAP_SPACE); | 2575 AllocationResult allocation = AllocateRaw(Map::kSize, MAP_SPACE, MAP_SPACE); |
| 2576 if (!allocation.To(&result)) return allocation; | 2576 if (!allocation.To(&result)) return allocation; |
| 2577 | 2577 |
| 2578 // Map::cast cannot be used due to uninitialized map field. | 2578 // Map::cast cannot be used due to uninitialized map field. |
| 2579 reinterpret_cast<Map*>(result)->set_map(raw_unchecked_meta_map()); | 2579 reinterpret_cast<Map*>(result)->set_map( |
| 2580 reinterpret_cast<Map*>(root(kMetaMapRootIndex))); |
| 2580 reinterpret_cast<Map*>(result)->set_instance_type(instance_type); | 2581 reinterpret_cast<Map*>(result)->set_instance_type(instance_type); |
| 2581 reinterpret_cast<Map*>(result)->set_instance_size(instance_size); | 2582 reinterpret_cast<Map*>(result)->set_instance_size(instance_size); |
| 2582 // Initialize to only containing tagged fields. | 2583 // Initialize to only containing tagged fields. |
| 2583 reinterpret_cast<Map*>(result)->set_visitor_id( | 2584 reinterpret_cast<Map*>(result)->set_visitor_id( |
| 2584 StaticVisitorBase::GetVisitorId(instance_type, instance_size, false)); | 2585 StaticVisitorBase::GetVisitorId(instance_type, instance_size, false)); |
| 2585 if (FLAG_unbox_double_fields) { | 2586 if (FLAG_unbox_double_fields) { |
| 2586 reinterpret_cast<Map*>(result) | 2587 reinterpret_cast<Map*>(result) |
| 2587 ->set_layout_descriptor(LayoutDescriptor::FastPointerLayout()); | 2588 ->set_layout_descriptor(LayoutDescriptor::FastPointerLayout()); |
| 2588 } | 2589 } |
| 2589 reinterpret_cast<Map*>(result)->clear_unused(); | 2590 reinterpret_cast<Map*>(result)->clear_unused(); |
| (...skipping 964 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3554 CopyBytes(instance->GetFirstBytecodeAddress(), raw_bytecodes, length); | 3555 CopyBytes(instance->GetFirstBytecodeAddress(), raw_bytecodes, length); |
| 3555 | 3556 |
| 3556 return result; | 3557 return result; |
| 3557 } | 3558 } |
| 3558 | 3559 |
| 3559 | 3560 |
| 3560 void Heap::CreateFillerObjectAt(Address addr, int size) { | 3561 void Heap::CreateFillerObjectAt(Address addr, int size) { |
| 3561 if (size == 0) return; | 3562 if (size == 0) return; |
| 3562 HeapObject* filler = HeapObject::FromAddress(addr); | 3563 HeapObject* filler = HeapObject::FromAddress(addr); |
| 3563 if (size == kPointerSize) { | 3564 if (size == kPointerSize) { |
| 3564 filler->set_map_no_write_barrier(raw_unchecked_one_pointer_filler_map()); | 3565 filler->set_map_no_write_barrier( |
| 3566 reinterpret_cast<Map*>(root(kOnePointerFillerMapRootIndex))); |
| 3565 } else if (size == 2 * kPointerSize) { | 3567 } else if (size == 2 * kPointerSize) { |
| 3566 filler->set_map_no_write_barrier(raw_unchecked_two_pointer_filler_map()); | 3568 filler->set_map_no_write_barrier( |
| 3569 reinterpret_cast<Map*>(root(kTwoPointerFillerMapRootIndex))); |
| 3567 } else { | 3570 } else { |
| 3568 filler->set_map_no_write_barrier(raw_unchecked_free_space_map()); | 3571 filler->set_map_no_write_barrier( |
| 3572 reinterpret_cast<Map*>(root(kFreeSpaceMapRootIndex))); |
| 3569 FreeSpace::cast(filler)->nobarrier_set_size(size); | 3573 FreeSpace::cast(filler)->nobarrier_set_size(size); |
| 3570 } | 3574 } |
| 3571 // At this point, we may be deserializing the heap from a snapshot, and | 3575 // At this point, we may be deserializing the heap from a snapshot, and |
| 3572 // none of the maps have been created yet and are NULL. | 3576 // none of the maps have been created yet and are NULL. |
| 3573 DCHECK((filler->map() == NULL && !deserialization_complete_) || | 3577 DCHECK((filler->map() == NULL && !deserialization_complete_) || |
| 3574 filler->map()->IsMap()); | 3578 filler->map()->IsMap()); |
| 3575 } | 3579 } |
| 3576 | 3580 |
| 3577 | 3581 |
| 3578 bool Heap::CanMoveObjectStart(HeapObject* object) { | 3582 bool Heap::CanMoveObjectStart(HeapObject* object) { |
| (...skipping 2680 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6259 MarkRecursively(root, &mark_visitor); | 6263 MarkRecursively(root, &mark_visitor); |
| 6260 | 6264 |
| 6261 UnmarkVisitor unmark_visitor(this); | 6265 UnmarkVisitor unmark_visitor(this); |
| 6262 UnmarkRecursively(root, &unmark_visitor); | 6266 UnmarkRecursively(root, &unmark_visitor); |
| 6263 | 6267 |
| 6264 ProcessResults(); | 6268 ProcessResults(); |
| 6265 } | 6269 } |
| 6266 | 6270 |
| 6267 | 6271 |
| 6268 static bool SafeIsNativeContext(HeapObject* obj) { | 6272 static bool SafeIsNativeContext(HeapObject* obj) { |
| 6269 return obj->map() == obj->GetHeap()->raw_unchecked_native_context_map(); | 6273 return obj->map() == obj->GetHeap()->root(Heap::kNativeContextMapRootIndex); |
| 6270 } | 6274 } |
| 6271 | 6275 |
| 6272 | 6276 |
| 6273 void PathTracer::MarkRecursively(Object** p, MarkVisitor* mark_visitor) { | 6277 void PathTracer::MarkRecursively(Object** p, MarkVisitor* mark_visitor) { |
| 6274 if (!(*p)->IsHeapObject()) return; | 6278 if (!(*p)->IsHeapObject()) return; |
| 6275 | 6279 |
| 6276 HeapObject* obj = HeapObject::cast(*p); | 6280 HeapObject* obj = HeapObject::cast(*p); |
| 6277 | 6281 |
| 6278 MapWord map_word = obj->map_word(); | 6282 MapWord map_word = obj->map_word(); |
| 6279 if (!map_word.ToMap()->IsHeapObject()) return; // visited before | 6283 if (!map_word.ToMap()->IsHeapObject()) return; // visited before |
| (...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6790 *object_type = "CODE_TYPE"; \ | 6794 *object_type = "CODE_TYPE"; \ |
| 6791 *object_sub_type = "CODE_AGE/" #name; \ | 6795 *object_sub_type = "CODE_AGE/" #name; \ |
| 6792 return true; | 6796 return true; |
| 6793 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) | 6797 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) |
| 6794 #undef COMPARE_AND_RETURN_NAME | 6798 #undef COMPARE_AND_RETURN_NAME |
| 6795 } | 6799 } |
| 6796 return false; | 6800 return false; |
| 6797 } | 6801 } |
| 6798 } // namespace internal | 6802 } // namespace internal |
| 6799 } // namespace v8 | 6803 } // namespace v8 |
| OLD | NEW |