| 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/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 2761 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2772 Memory::Object_at(dst_slot) = value; | 2772 Memory::Object_at(dst_slot) = value; |
| 2773 RecordMigratedSlot(value, dst_slot); | 2773 RecordMigratedSlot(value, dst_slot); |
| 2774 src_slot += kPointerSize; | 2774 src_slot += kPointerSize; |
| 2775 dst_slot += kPointerSize; | 2775 dst_slot += kPointerSize; |
| 2776 } | 2776 } |
| 2777 } | 2777 } |
| 2778 | 2778 |
| 2779 | 2779 |
| 2780 void MarkCompactCollector::MigrateObjectMixed(HeapObject* dst, HeapObject* src, | 2780 void MarkCompactCollector::MigrateObjectMixed(HeapObject* dst, HeapObject* src, |
| 2781 int size) { | 2781 int size) { |
| 2782 if (FLAG_unbox_double_fields) { | 2782 if (src->IsFixedTypedArrayBase()) { |
| 2783 heap()->MoveBlock(dst->address(), src->address(), size); |
| 2784 Address base_pointer_slot = |
| 2785 dst->address() + FixedTypedArrayBase::kBasePointerOffset; |
| 2786 RecordMigratedSlot(Memory::Object_at(base_pointer_slot), base_pointer_slot); |
| 2787 } else if (FLAG_unbox_double_fields) { |
| 2783 Address dst_addr = dst->address(); | 2788 Address dst_addr = dst->address(); |
| 2784 Address src_addr = src->address(); | 2789 Address src_addr = src->address(); |
| 2785 Address src_slot = src_addr; | 2790 Address src_slot = src_addr; |
| 2786 Address dst_slot = dst_addr; | 2791 Address dst_slot = dst_addr; |
| 2787 | 2792 |
| 2788 LayoutDescriptorHelper helper(src->map()); | 2793 LayoutDescriptorHelper helper(src->map()); |
| 2789 DCHECK(!helper.all_fields_tagged()); | 2794 DCHECK(!helper.all_fields_tagged()); |
| 2790 for (int remaining = size / kPointerSize; remaining > 0; remaining--) { | 2795 for (int remaining = size / kPointerSize; remaining > 0; remaining--) { |
| 2791 Object* value = Memory::Object_at(src_slot); | 2796 Object* value = Memory::Object_at(src_slot); |
| 2792 | 2797 |
| (...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3191 InstanceType type = object->map()->instance_type(); | 3196 InstanceType type = object->map()->instance_type(); |
| 3192 // Slots in maps and code can't be invalid because they are never | 3197 // Slots in maps and code can't be invalid because they are never |
| 3193 // shrunk. | 3198 // shrunk. |
| 3194 if (type == MAP_TYPE || type == CODE_TYPE) return true; | 3199 if (type == MAP_TYPE || type == CODE_TYPE) return true; |
| 3195 | 3200 |
| 3196 // Consider slots in objects that contain ONLY raw data as invalid. | 3201 // Consider slots in objects that contain ONLY raw data as invalid. |
| 3197 return false; | 3202 return false; |
| 3198 } | 3203 } |
| 3199 | 3204 |
| 3200 case HeapObjectContents::kMixedValues: { | 3205 case HeapObjectContents::kMixedValues: { |
| 3201 if (FLAG_unbox_double_fields) { | 3206 if (object->IsFixedTypedArrayBase()) { |
| 3207 return static_cast<int>(slot - object->address()) == |
| 3208 FixedTypedArrayBase::kBasePointerOffset; |
| 3209 } else if (FLAG_unbox_double_fields) { |
| 3202 // Filter out slots that happen to point to unboxed double fields. | 3210 // Filter out slots that happen to point to unboxed double fields. |
| 3203 LayoutDescriptorHelper helper(object->map()); | 3211 LayoutDescriptorHelper helper(object->map()); |
| 3204 DCHECK(!helper.all_fields_tagged()); | 3212 DCHECK(!helper.all_fields_tagged()); |
| 3205 return helper.IsTagged(static_cast<int>(slot - object->address())); | 3213 return helper.IsTagged(static_cast<int>(slot - object->address())); |
| 3206 } | 3214 } |
| 3207 break; | 3215 break; |
| 3208 } | 3216 } |
| 3209 } | 3217 } |
| 3210 UNREACHABLE(); | 3218 UNREACHABLE(); |
| 3211 } | 3219 } |
| (...skipping 1516 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4728 SlotsBuffer* buffer = *buffer_address; | 4736 SlotsBuffer* buffer = *buffer_address; |
| 4729 while (buffer != NULL) { | 4737 while (buffer != NULL) { |
| 4730 SlotsBuffer* next_buffer = buffer->next(); | 4738 SlotsBuffer* next_buffer = buffer->next(); |
| 4731 DeallocateBuffer(buffer); | 4739 DeallocateBuffer(buffer); |
| 4732 buffer = next_buffer; | 4740 buffer = next_buffer; |
| 4733 } | 4741 } |
| 4734 *buffer_address = NULL; | 4742 *buffer_address = NULL; |
| 4735 } | 4743 } |
| 4736 } // namespace internal | 4744 } // namespace internal |
| 4737 } // namespace v8 | 4745 } // namespace v8 |
| OLD | NEW |