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/mark-compact.h" | 5 #include "src/heap/mark-compact.h" |
6 | 6 |
7 #include "src/base/atomicops.h" | 7 #include "src/base/atomicops.h" |
8 #include "src/base/bits.h" | 8 #include "src/base/bits.h" |
9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
10 #include "src/compilation-cache.h" | 10 #include "src/compilation-cache.h" |
(...skipping 2769 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2780 } | 2780 } |
2781 | 2781 |
2782 | 2782 |
2783 void MarkCompactCollector::MigrateObjectMixed(HeapObject* dst, HeapObject* src, | 2783 void MarkCompactCollector::MigrateObjectMixed(HeapObject* dst, HeapObject* src, |
2784 int size) { | 2784 int size) { |
2785 if (src->IsFixedTypedArrayBase()) { | 2785 if (src->IsFixedTypedArrayBase()) { |
2786 heap()->MoveBlock(dst->address(), src->address(), size); | 2786 heap()->MoveBlock(dst->address(), src->address(), size); |
2787 Address base_pointer_slot = | 2787 Address base_pointer_slot = |
2788 dst->address() + FixedTypedArrayBase::kBasePointerOffset; | 2788 dst->address() + FixedTypedArrayBase::kBasePointerOffset; |
2789 RecordMigratedSlot(Memory::Object_at(base_pointer_slot), base_pointer_slot); | 2789 RecordMigratedSlot(Memory::Object_at(base_pointer_slot), base_pointer_slot); |
| 2790 } else if (src->IsBytecodeArray()) { |
| 2791 heap()->MoveBlock(dst->address(), src->address(), size); |
| 2792 Address constant_pool_slot = |
| 2793 dst->address() + BytecodeArray::kConstantPoolOffset; |
| 2794 RecordMigratedSlot(Memory::Object_at(constant_pool_slot), |
| 2795 constant_pool_slot); |
2790 } else if (FLAG_unbox_double_fields) { | 2796 } else if (FLAG_unbox_double_fields) { |
2791 Address dst_addr = dst->address(); | 2797 Address dst_addr = dst->address(); |
2792 Address src_addr = src->address(); | 2798 Address src_addr = src->address(); |
2793 Address src_slot = src_addr; | 2799 Address src_slot = src_addr; |
2794 Address dst_slot = dst_addr; | 2800 Address dst_slot = dst_addr; |
2795 | 2801 |
2796 LayoutDescriptorHelper helper(src->map()); | 2802 LayoutDescriptorHelper helper(src->map()); |
2797 DCHECK(!helper.all_fields_tagged()); | 2803 DCHECK(!helper.all_fields_tagged()); |
2798 for (int remaining = size / kPointerSize; remaining > 0; remaining--) { | 2804 for (int remaining = size / kPointerSize; remaining > 0; remaining--) { |
2799 Object* value = Memory::Object_at(src_slot); | 2805 Object* value = Memory::Object_at(src_slot); |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3203 if (type == MAP_TYPE || type == CODE_TYPE) return true; | 3209 if (type == MAP_TYPE || type == CODE_TYPE) return true; |
3204 | 3210 |
3205 // Consider slots in objects that contain ONLY raw data as invalid. | 3211 // Consider slots in objects that contain ONLY raw data as invalid. |
3206 return false; | 3212 return false; |
3207 } | 3213 } |
3208 | 3214 |
3209 case HeapObjectContents::kMixedValues: { | 3215 case HeapObjectContents::kMixedValues: { |
3210 if (object->IsFixedTypedArrayBase()) { | 3216 if (object->IsFixedTypedArrayBase()) { |
3211 return static_cast<int>(slot - object->address()) == | 3217 return static_cast<int>(slot - object->address()) == |
3212 FixedTypedArrayBase::kBasePointerOffset; | 3218 FixedTypedArrayBase::kBasePointerOffset; |
| 3219 } else if (object->IsBytecodeArray()) { |
| 3220 return static_cast<int>(slot - object->address()) == |
| 3221 BytecodeArray::kConstantPoolOffset; |
3213 } else if (FLAG_unbox_double_fields) { | 3222 } else if (FLAG_unbox_double_fields) { |
3214 // Filter out slots that happen to point to unboxed double fields. | 3223 // Filter out slots that happen to point to unboxed double fields. |
3215 LayoutDescriptorHelper helper(object->map()); | 3224 LayoutDescriptorHelper helper(object->map()); |
3216 DCHECK(!helper.all_fields_tagged()); | 3225 DCHECK(!helper.all_fields_tagged()); |
3217 return helper.IsTagged(static_cast<int>(slot - object->address())); | 3226 return helper.IsTagged(static_cast<int>(slot - object->address())); |
3218 } | 3227 } |
3219 break; | 3228 break; |
3220 } | 3229 } |
3221 } | 3230 } |
3222 UNREACHABLE(); | 3231 UNREACHABLE(); |
(...skipping 1519 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4742 SlotsBuffer* buffer = *buffer_address; | 4751 SlotsBuffer* buffer = *buffer_address; |
4743 while (buffer != NULL) { | 4752 while (buffer != NULL) { |
4744 SlotsBuffer* next_buffer = buffer->next(); | 4753 SlotsBuffer* next_buffer = buffer->next(); |
4745 DeallocateBuffer(buffer); | 4754 DeallocateBuffer(buffer); |
4746 buffer = next_buffer; | 4755 buffer = next_buffer; |
4747 } | 4756 } |
4748 *buffer_address = NULL; | 4757 *buffer_address = NULL; |
4749 } | 4758 } |
4750 } // namespace internal | 4759 } // namespace internal |
4751 } // namespace v8 | 4760 } // namespace v8 |
OLD | NEW |