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 1018 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1029 if (space == LO_SPACE) { | 1029 if (space == LO_SPACE) { |
1030 DCHECK_EQ(1, reservation->length()); | 1030 DCHECK_EQ(1, reservation->length()); |
1031 perform_gc = !lo_space()->CanAllocateSize(reservation->at(0).size); | 1031 perform_gc = !lo_space()->CanAllocateSize(reservation->at(0).size); |
1032 } else { | 1032 } else { |
1033 for (auto& chunk : *reservation) { | 1033 for (auto& chunk : *reservation) { |
1034 AllocationResult allocation; | 1034 AllocationResult allocation; |
1035 int size = chunk.size; | 1035 int size = chunk.size; |
1036 DCHECK_LE(size, MemoryAllocator::PageAreaSize( | 1036 DCHECK_LE(size, MemoryAllocator::PageAreaSize( |
1037 static_cast<AllocationSpace>(space))); | 1037 static_cast<AllocationSpace>(space))); |
1038 if (space == NEW_SPACE) { | 1038 if (space == NEW_SPACE) { |
1039 allocation = new_space()->AllocateRaw(size); | 1039 allocation = new_space()->AllocateRawUnaligned(size); |
1040 } else { | 1040 } else { |
1041 allocation = paged_space(space)->AllocateRaw(size); | 1041 allocation = paged_space(space)->AllocateRawUnaligned(size); |
1042 } | 1042 } |
1043 HeapObject* free_space; | 1043 HeapObject* free_space; |
1044 if (allocation.To(&free_space)) { | 1044 if (allocation.To(&free_space)) { |
1045 // Mark with a free list node, in case we have a GC before | 1045 // Mark with a free list node, in case we have a GC before |
1046 // deserializing. | 1046 // deserializing. |
1047 Address free_space_address = free_space->address(); | 1047 Address free_space_address = free_space->address(); |
1048 CreateFillerObjectAt(free_space_address, size); | 1048 CreateFillerObjectAt(free_space_address, size); |
1049 DCHECK(space < Serializer::kNumberOfPreallocatedSpaces); | 1049 DCHECK(space < Serializer::kNumberOfPreallocatedSpaces); |
1050 chunk.start = free_space_address; | 1050 chunk.start = free_space_address; |
1051 chunk.end = free_space_address + size; | 1051 chunk.end = free_space_address + size; |
(...skipping 1087 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2139 } | 2139 } |
2140 } | 2140 } |
2141 } | 2141 } |
2142 | 2142 |
2143 template <int alignment> | 2143 template <int alignment> |
2144 static inline bool SemiSpaceCopyObject(Map* map, HeapObject** slot, | 2144 static inline bool SemiSpaceCopyObject(Map* map, HeapObject** slot, |
2145 HeapObject* object, int object_size) { | 2145 HeapObject* object, int object_size) { |
2146 Heap* heap = map->GetHeap(); | 2146 Heap* heap = map->GetHeap(); |
2147 | 2147 |
2148 DCHECK(heap->AllowedToBeMigrated(object, NEW_SPACE)); | 2148 DCHECK(heap->AllowedToBeMigrated(object, NEW_SPACE)); |
2149 AllocationResult allocation; | 2149 AllocationAlignment align = |
2150 #ifdef V8_HOST_ARCH_32_BIT | 2150 alignment == kDoubleAlignment ? kDoubleAligned : kWordAligned; |
2151 if (alignment == kDoubleAlignment) { | 2151 AllocationResult allocation = |
2152 allocation = | 2152 heap->new_space()->AllocateRaw(object_size, align); |
2153 heap->new_space()->AllocateRawAligned(object_size, kDoubleAligned); | |
2154 } else { | |
2155 allocation = heap->new_space()->AllocateRaw(object_size); | |
2156 } | |
2157 #else | |
2158 allocation = heap->new_space()->AllocateRaw(object_size); | |
2159 #endif | |
2160 | 2153 |
2161 HeapObject* target = NULL; // Initialization to please compiler. | 2154 HeapObject* target = NULL; // Initialization to please compiler. |
2162 if (allocation.To(&target)) { | 2155 if (allocation.To(&target)) { |
2163 // Order is important here: Set the promotion limit before storing a | 2156 // Order is important here: Set the promotion limit before storing a |
2164 // filler for double alignment or migrating the object. Otherwise we | 2157 // filler for double alignment or migrating the object. Otherwise we |
2165 // may end up overwriting promotion queue entries when we migrate the | 2158 // may end up overwriting promotion queue entries when we migrate the |
2166 // object. | 2159 // object. |
2167 heap->promotion_queue()->SetNewLimit(heap->new_space()->top()); | 2160 heap->promotion_queue()->SetNewLimit(heap->new_space()->top()); |
2168 | 2161 |
2169 MigrateObject(heap, object, target, object_size); | 2162 MigrateObject(heap, object, target, object_size); |
2170 | 2163 |
2171 // Update slot to new target. | 2164 // Update slot to new target. |
2172 *slot = target; | 2165 *slot = target; |
2173 | 2166 |
2174 heap->IncrementSemiSpaceCopiedObjectSize(object_size); | 2167 heap->IncrementSemiSpaceCopiedObjectSize(object_size); |
2175 return true; | 2168 return true; |
2176 } | 2169 } |
2177 return false; | 2170 return false; |
2178 } | 2171 } |
2179 | 2172 |
2180 | 2173 |
2181 template <ObjectContents object_contents, int alignment> | 2174 template <ObjectContents object_contents, int alignment> |
2182 static inline bool PromoteObject(Map* map, HeapObject** slot, | 2175 static inline bool PromoteObject(Map* map, HeapObject** slot, |
2183 HeapObject* object, int object_size) { | 2176 HeapObject* object, int object_size) { |
2184 Heap* heap = map->GetHeap(); | 2177 Heap* heap = map->GetHeap(); |
2185 | 2178 |
2186 AllocationResult allocation; | 2179 AllocationAlignment align = |
2187 #ifdef V8_HOST_ARCH_32_BIT | 2180 alignment == kDoubleAlignment ? kDoubleAligned : kWordAligned; |
2188 if (alignment == kDoubleAlignment) { | 2181 AllocationResult allocation = |
2189 allocation = | 2182 heap->old_space()->AllocateRaw(object_size, align); |
2190 heap->old_space()->AllocateRawAligned(object_size, kDoubleAligned); | |
2191 } else { | |
2192 allocation = heap->old_space()->AllocateRaw(object_size); | |
2193 } | |
2194 #else | |
2195 allocation = heap->old_space()->AllocateRaw(object_size); | |
2196 #endif | |
2197 | 2183 |
2198 HeapObject* target = NULL; // Initialization to please compiler. | 2184 HeapObject* target = NULL; // Initialization to please compiler. |
2199 if (allocation.To(&target)) { | 2185 if (allocation.To(&target)) { |
2200 MigrateObject(heap, object, target, object_size); | 2186 MigrateObject(heap, object, target, object_size); |
2201 | 2187 |
2202 // Update slot to new target. | 2188 // Update slot to new target. |
2203 *slot = target; | 2189 *slot = target; |
2204 | 2190 |
2205 if (object_contents == POINTER_OBJECT) { | 2191 if (object_contents == POINTER_OBJECT) { |
2206 if (map->instance_type() == JS_FUNCTION_TYPE) { | 2192 if (map->instance_type() == JS_FUNCTION_TYPE) { |
(...skipping 4323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6530 } | 6516 } |
6531 delete list; | 6517 delete list; |
6532 } else { | 6518 } else { |
6533 prev = list; | 6519 prev = list; |
6534 } | 6520 } |
6535 list = next; | 6521 list = next; |
6536 } | 6522 } |
6537 } | 6523 } |
6538 } | 6524 } |
6539 } // namespace v8::internal | 6525 } // namespace v8::internal |
OLD | NEW |