| 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 1947 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1958 | 1958 |
| 1959 | 1959 |
| 1960 STATIC_ASSERT((FixedDoubleArray::kHeaderSize & kDoubleAlignmentMask) == | 1960 STATIC_ASSERT((FixedDoubleArray::kHeaderSize & kDoubleAlignmentMask) == |
| 1961 0); // NOLINT | 1961 0); // NOLINT |
| 1962 STATIC_ASSERT((ConstantPoolArray::kFirstEntryOffset & kDoubleAlignmentMask) == | 1962 STATIC_ASSERT((ConstantPoolArray::kFirstEntryOffset & kDoubleAlignmentMask) == |
| 1963 0); // NOLINT | 1963 0); // NOLINT |
| 1964 STATIC_ASSERT((ConstantPoolArray::kExtendedFirstOffset & | 1964 STATIC_ASSERT((ConstantPoolArray::kExtendedFirstOffset & |
| 1965 kDoubleAlignmentMask) == 0); // NOLINT | 1965 kDoubleAlignmentMask) == 0); // NOLINT |
| 1966 STATIC_ASSERT((FixedTypedArrayBase::kDataOffset & kDoubleAlignmentMask) == | 1966 STATIC_ASSERT((FixedTypedArrayBase::kDataOffset & kDoubleAlignmentMask) == |
| 1967 0); // NOLINT | 1967 0); // NOLINT |
| 1968 #ifdef V8_HOST_ARCH_32_BIT |
| 1969 STATIC_ASSERT((HeapNumber::kValueOffset & kDoubleAlignmentMask) != |
| 1970 0); // NOLINT |
| 1971 #endif |
| 1968 | 1972 |
| 1969 | 1973 |
| 1970 HeapObject* Heap::EnsureDoubleAligned(HeapObject* object, int size) { | 1974 HeapObject* Heap::EnsureAligned(HeapObject* object, int size, |
| 1971 if ((OffsetFrom(object->address()) & kDoubleAlignmentMask) != 0) { | 1975 AllocationAlignment alignment) { |
| 1976 if (alignment == kDoubleAligned && |
| 1977 (OffsetFrom(object->address()) & kDoubleAlignmentMask) != 0) { |
| 1978 CreateFillerObjectAt(object->address(), kPointerSize); |
| 1979 return HeapObject::FromAddress(object->address() + kPointerSize); |
| 1980 } else if (alignment == kDoubleUnaligned && |
| 1981 (OffsetFrom(object->address()) & kDoubleAlignmentMask) == 0) { |
| 1972 CreateFillerObjectAt(object->address(), kPointerSize); | 1982 CreateFillerObjectAt(object->address(), kPointerSize); |
| 1973 return HeapObject::FromAddress(object->address() + kPointerSize); | 1983 return HeapObject::FromAddress(object->address() + kPointerSize); |
| 1974 } else { | 1984 } else { |
| 1975 CreateFillerObjectAt(object->address() + size - kPointerSize, kPointerSize); | 1985 CreateFillerObjectAt(object->address() + size - kPointerSize, kPointerSize); |
| 1976 return object; | 1986 return object; |
| 1977 } | 1987 } |
| 1978 } | 1988 } |
| 1979 | 1989 |
| 1980 | 1990 |
| 1991 HeapObject* Heap::PrecedeWithFiller(HeapObject* object) { |
| 1992 CreateFillerObjectAt(object->address(), kPointerSize); |
| 1993 return HeapObject::FromAddress(object->address() + kPointerSize); |
| 1994 } |
| 1995 |
| 1996 |
| 1981 HeapObject* Heap::DoubleAlignForDeserialization(HeapObject* object, int size) { | 1997 HeapObject* Heap::DoubleAlignForDeserialization(HeapObject* object, int size) { |
| 1982 return EnsureDoubleAligned(object, size); | 1998 return EnsureAligned(object, size, kDoubleAligned); |
| 1983 } | 1999 } |
| 1984 | 2000 |
| 1985 | 2001 |
| 1986 enum LoggingAndProfiling { | 2002 enum LoggingAndProfiling { |
| 1987 LOGGING_AND_PROFILING_ENABLED, | 2003 LOGGING_AND_PROFILING_ENABLED, |
| 1988 LOGGING_AND_PROFILING_DISABLED | 2004 LOGGING_AND_PROFILING_DISABLED |
| 1989 }; | 2005 }; |
| 1990 | 2006 |
| 1991 | 2007 |
| 1992 enum MarksHandling { TRANSFER_MARKS, IGNORE_MARKS }; | 2008 enum MarksHandling { TRANSFER_MARKS, IGNORE_MARKS }; |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2124 } | 2140 } |
| 2125 } | 2141 } |
| 2126 | 2142 |
| 2127 template <int alignment> | 2143 template <int alignment> |
| 2128 static inline bool SemiSpaceCopyObject(Map* map, HeapObject** slot, | 2144 static inline bool SemiSpaceCopyObject(Map* map, HeapObject** slot, |
| 2129 HeapObject* object, int object_size) { | 2145 HeapObject* object, int object_size) { |
| 2130 Heap* heap = map->GetHeap(); | 2146 Heap* heap = map->GetHeap(); |
| 2131 | 2147 |
| 2132 DCHECK(heap->AllowedToBeMigrated(object, NEW_SPACE)); | 2148 DCHECK(heap->AllowedToBeMigrated(object, NEW_SPACE)); |
| 2133 AllocationResult allocation; | 2149 AllocationResult allocation; |
| 2134 #ifndef V8_HOST_ARCH_64_BIT | 2150 #ifdef V8_HOST_ARCH_32_BIT |
| 2135 if (alignment == kDoubleAlignment) { | 2151 if (alignment == kDoubleAlignment) { |
| 2136 allocation = heap->new_space()->AllocateRawDoubleAligned(object_size); | 2152 allocation = |
| 2153 heap->new_space()->AllocateRawAligned(object_size, kDoubleAligned); |
| 2137 } else { | 2154 } else { |
| 2138 allocation = heap->new_space()->AllocateRaw(object_size); | 2155 allocation = heap->new_space()->AllocateRaw(object_size); |
| 2139 } | 2156 } |
| 2140 #else | 2157 #else |
| 2141 allocation = heap->new_space()->AllocateRaw(object_size); | 2158 allocation = heap->new_space()->AllocateRaw(object_size); |
| 2142 #endif | 2159 #endif |
| 2143 | 2160 |
| 2144 HeapObject* target = NULL; // Initialization to please compiler. | 2161 HeapObject* target = NULL; // Initialization to please compiler. |
| 2145 if (allocation.To(&target)) { | 2162 if (allocation.To(&target)) { |
| 2146 // Order is important here: Set the promotion limit before storing a | 2163 // Order is important here: Set the promotion limit before storing a |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2160 return false; | 2177 return false; |
| 2161 } | 2178 } |
| 2162 | 2179 |
| 2163 | 2180 |
| 2164 template <ObjectContents object_contents, int alignment> | 2181 template <ObjectContents object_contents, int alignment> |
| 2165 static inline bool PromoteObject(Map* map, HeapObject** slot, | 2182 static inline bool PromoteObject(Map* map, HeapObject** slot, |
| 2166 HeapObject* object, int object_size) { | 2183 HeapObject* object, int object_size) { |
| 2167 Heap* heap = map->GetHeap(); | 2184 Heap* heap = map->GetHeap(); |
| 2168 | 2185 |
| 2169 AllocationResult allocation; | 2186 AllocationResult allocation; |
| 2170 #ifndef V8_HOST_ARCH_64_BIT | 2187 #ifdef V8_HOST_ARCH_32_BIT |
| 2171 if (alignment == kDoubleAlignment) { | 2188 if (alignment == kDoubleAlignment) { |
| 2172 allocation = heap->old_space()->AllocateRawDoubleAligned(object_size); | 2189 allocation = |
| 2190 heap->old_space()->AllocateRawAligned(object_size, kDoubleAligned); |
| 2173 } else { | 2191 } else { |
| 2174 allocation = heap->old_space()->AllocateRaw(object_size); | 2192 allocation = heap->old_space()->AllocateRaw(object_size); |
| 2175 } | 2193 } |
| 2176 #else | 2194 #else |
| 2177 allocation = heap->old_space()->AllocateRaw(object_size); | 2195 allocation = heap->old_space()->AllocateRaw(object_size); |
| 2178 #endif | 2196 #endif |
| 2179 | 2197 |
| 2180 HeapObject* target = NULL; // Initialization to please compiler. | 2198 HeapObject* target = NULL; // Initialization to please compiler. |
| 2181 if (allocation.To(&target)) { | 2199 if (allocation.To(&target)) { |
| 2182 MigrateObject(heap, object, target, object_size); | 2200 MigrateObject(heap, object, target, object_size); |
| (...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2833 PretenureFlag pretenure) { | 2851 PretenureFlag pretenure) { |
| 2834 // Statically ensure that it is safe to allocate heap numbers in paged | 2852 // Statically ensure that it is safe to allocate heap numbers in paged |
| 2835 // spaces. | 2853 // spaces. |
| 2836 int size = HeapNumber::kSize; | 2854 int size = HeapNumber::kSize; |
| 2837 STATIC_ASSERT(HeapNumber::kSize <= Page::kMaxRegularHeapObjectSize); | 2855 STATIC_ASSERT(HeapNumber::kSize <= Page::kMaxRegularHeapObjectSize); |
| 2838 | 2856 |
| 2839 AllocationSpace space = SelectSpace(size, pretenure); | 2857 AllocationSpace space = SelectSpace(size, pretenure); |
| 2840 | 2858 |
| 2841 HeapObject* result; | 2859 HeapObject* result; |
| 2842 { | 2860 { |
| 2843 AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE); | 2861 AllocationResult allocation = |
| 2862 AllocateRaw(size, space, OLD_SPACE, kDoubleUnaligned); |
| 2844 if (!allocation.To(&result)) return allocation; | 2863 if (!allocation.To(&result)) return allocation; |
| 2845 } | 2864 } |
| 2846 | 2865 |
| 2847 Map* map = mode == MUTABLE ? mutable_heap_number_map() : heap_number_map(); | 2866 Map* map = mode == MUTABLE ? mutable_heap_number_map() : heap_number_map(); |
| 2848 HeapObject::cast(result)->set_map_no_write_barrier(map); | 2867 HeapObject::cast(result)->set_map_no_write_barrier(map); |
| 2849 HeapNumber::cast(result)->set_value(value); | 2868 HeapNumber::cast(result)->set_value(value); |
| 2850 return result; | 2869 return result; |
| 2851 } | 2870 } |
| 2852 | 2871 |
| 2853 | 2872 |
| (...skipping 3656 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6510 } | 6529 } |
| 6511 delete list; | 6530 delete list; |
| 6512 } else { | 6531 } else { |
| 6513 prev = list; | 6532 prev = list; |
| 6514 } | 6533 } |
| 6515 list = next; | 6534 list = next; |
| 6516 } | 6535 } |
| 6517 } | 6536 } |
| 6518 } | 6537 } |
| 6519 } // namespace v8::internal | 6538 } // namespace v8::internal |
| OLD | NEW |