| 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/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 1954 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1965 STATIC_ASSERT((ConstantPoolArray::kExtendedFirstOffset & | 1965 STATIC_ASSERT((ConstantPoolArray::kExtendedFirstOffset & |
| 1966 kDoubleAlignmentMask) == 0); // NOLINT | 1966 kDoubleAlignmentMask) == 0); // NOLINT |
| 1967 STATIC_ASSERT((FixedTypedArrayBase::kDataOffset & kDoubleAlignmentMask) == | 1967 STATIC_ASSERT((FixedTypedArrayBase::kDataOffset & kDoubleAlignmentMask) == |
| 1968 0); // NOLINT | 1968 0); // NOLINT |
| 1969 #ifdef V8_HOST_ARCH_32_BIT | 1969 #ifdef V8_HOST_ARCH_32_BIT |
| 1970 STATIC_ASSERT((HeapNumber::kValueOffset & kDoubleAlignmentMask) != | 1970 STATIC_ASSERT((HeapNumber::kValueOffset & kDoubleAlignmentMask) != |
| 1971 0); // NOLINT | 1971 0); // NOLINT |
| 1972 #endif | 1972 #endif |
| 1973 | 1973 |
| 1974 | 1974 |
| 1975 HeapObject* Heap::EnsureAligned(HeapObject* object, int size, | 1975 int Heap::GetAlignmentSize(Address address, AllocationAlignment alignment) { |
| 1976 AllocationAlignment alignment) { | 1976 intptr_t offset = OffsetFrom(address); |
| 1977 if (alignment == kDoubleAligned && | 1977 if (alignment == kDoubleAligned && (offset & kDoubleAlignmentMask) != 0) |
| 1978 (OffsetFrom(object->address()) & kDoubleAlignmentMask) != 0) { | 1978 return kPointerSize; |
| 1979 CreateFillerObjectAt(object->address(), kPointerSize); | 1979 if (alignment == kDoubleValueAligned && (offset & kDoubleAlignmentMask) == 0) |
| 1980 return HeapObject::FromAddress(object->address() + kPointerSize); | 1980 return kPointerSize; |
| 1981 } else if (alignment == kDoubleUnaligned && | 1981 return 0; |
| 1982 (OffsetFrom(object->address()) & kDoubleAlignmentMask) == 0) { | |
| 1983 CreateFillerObjectAt(object->address(), kPointerSize); | |
| 1984 return HeapObject::FromAddress(object->address() + kPointerSize); | |
| 1985 } else { | |
| 1986 CreateFillerObjectAt(object->address() + size - kPointerSize, kPointerSize); | |
| 1987 return object; | |
| 1988 } | |
| 1989 } | 1982 } |
| 1990 | 1983 |
| 1991 | 1984 |
| 1992 HeapObject* Heap::PrecedeWithFiller(HeapObject* object) { | 1985 HeapObject* Heap::PrecedeWithFiller(HeapObject* object, int fill_size) { |
| 1993 CreateFillerObjectAt(object->address(), kPointerSize); | 1986 CreateFillerObjectAt(object->address(), fill_size); |
| 1994 return HeapObject::FromAddress(object->address() + kPointerSize); | 1987 return HeapObject::FromAddress(object->address() + fill_size); |
| 1995 } | 1988 } |
| 1996 | 1989 |
| 1997 | 1990 |
| 1998 HeapObject* Heap::DoubleAlignForDeserialization(HeapObject* object, int size) { | 1991 HeapObject* Heap::DoubleAlignForDeserialization(HeapObject* object, int size) { |
| 1999 return EnsureAligned(object, size, kDoubleAligned); | 1992 Address address = object->address(); |
| 1993 int fill_size = GetAlignmentSize(address, kDoubleAligned); |
| 1994 // If object is not aligned, add fill to align it. |
| 1995 if (fill_size) return PrecedeWithFiller(object, kPointerSize); |
| 1996 |
| 1997 // object is aligned. Add fill in the extra space at the end. |
| 1998 // TODO(bbudge) Calculate alignment fill earlier to avoid this. |
| 1999 CreateFillerObjectAt(address + size - kPointerSize, kPointerSize); |
| 2000 return object; |
| 2000 } | 2001 } |
| 2001 | 2002 |
| 2002 | 2003 |
| 2003 enum LoggingAndProfiling { | 2004 enum LoggingAndProfiling { |
| 2004 LOGGING_AND_PROFILING_ENABLED, | 2005 LOGGING_AND_PROFILING_ENABLED, |
| 2005 LOGGING_AND_PROFILING_DISABLED | 2006 LOGGING_AND_PROFILING_DISABLED |
| 2006 }; | 2007 }; |
| 2007 | 2008 |
| 2008 | 2009 |
| 2009 enum MarksHandling { TRANSFER_MARKS, IGNORE_MARKS }; | 2010 enum MarksHandling { TRANSFER_MARKS, IGNORE_MARKS }; |
| (...skipping 830 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2840 // Statically ensure that it is safe to allocate heap numbers in paged | 2841 // Statically ensure that it is safe to allocate heap numbers in paged |
| 2841 // spaces. | 2842 // spaces. |
| 2842 int size = HeapNumber::kSize; | 2843 int size = HeapNumber::kSize; |
| 2843 STATIC_ASSERT(HeapNumber::kSize <= Page::kMaxRegularHeapObjectSize); | 2844 STATIC_ASSERT(HeapNumber::kSize <= Page::kMaxRegularHeapObjectSize); |
| 2844 | 2845 |
| 2845 AllocationSpace space = SelectSpace(size, pretenure); | 2846 AllocationSpace space = SelectSpace(size, pretenure); |
| 2846 | 2847 |
| 2847 HeapObject* result; | 2848 HeapObject* result; |
| 2848 { | 2849 { |
| 2849 AllocationResult allocation = | 2850 AllocationResult allocation = |
| 2850 AllocateRaw(size, space, OLD_SPACE, kDoubleUnaligned); | 2851 AllocateRaw(size, space, OLD_SPACE, kDoubleValueAligned); |
| 2851 if (!allocation.To(&result)) return allocation; | 2852 if (!allocation.To(&result)) return allocation; |
| 2852 } | 2853 } |
| 2853 | 2854 |
| 2854 Map* map = mode == MUTABLE ? mutable_heap_number_map() : heap_number_map(); | 2855 Map* map = mode == MUTABLE ? mutable_heap_number_map() : heap_number_map(); |
| 2855 HeapObject::cast(result)->set_map_no_write_barrier(map); | 2856 HeapObject::cast(result)->set_map_no_write_barrier(map); |
| 2856 HeapNumber::cast(result)->set_value(value); | 2857 HeapNumber::cast(result)->set_value(value); |
| 2857 return result; | 2858 return result; |
| 2858 } | 2859 } |
| 2859 | 2860 |
| 2860 | 2861 |
| (...skipping 3684 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6545 *object_type = "CODE_TYPE"; \ | 6546 *object_type = "CODE_TYPE"; \ |
| 6546 *object_sub_type = "CODE_AGE/" #name; \ | 6547 *object_sub_type = "CODE_AGE/" #name; \ |
| 6547 return true; | 6548 return true; |
| 6548 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) | 6549 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) |
| 6549 #undef COMPARE_AND_RETURN_NAME | 6550 #undef COMPARE_AND_RETURN_NAME |
| 6550 } | 6551 } |
| 6551 return false; | 6552 return false; |
| 6552 } | 6553 } |
| 6553 } | 6554 } |
| 6554 } // namespace v8::internal | 6555 } // namespace v8::internal |
| OLD | NEW |