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/zone.h" | 5 #include "src/zone.h" |
6 | 6 |
7 #include <cstring> | 7 #include <cstring> |
8 | 8 |
| 9 #include "src/v8.h" |
| 10 |
9 #ifdef V8_USE_ADDRESS_SANITIZER | 11 #ifdef V8_USE_ADDRESS_SANITIZER |
10 #include <sanitizer/asan_interface.h> | 12 #include <sanitizer/asan_interface.h> |
11 #endif // V8_USE_ADDRESS_SANITIZER | 13 #endif // V8_USE_ADDRESS_SANITIZER |
12 | 14 |
13 namespace v8 { | 15 namespace v8 { |
14 namespace internal { | 16 namespace internal { |
15 | 17 |
16 namespace { | 18 namespace { |
17 | 19 |
18 #if V8_USE_ADDRESS_SANITIZER | 20 #if V8_USE_ADDRESS_SANITIZER |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 // is to avoid excessive malloc() and free() overhead. | 232 // is to avoid excessive malloc() and free() overhead. |
231 Segment* head = segment_head_; | 233 Segment* head = segment_head_; |
232 const size_t old_size = (head == nullptr) ? 0 : head->size(); | 234 const size_t old_size = (head == nullptr) ? 0 : head->size(); |
233 static const size_t kSegmentOverhead = sizeof(Segment) + kAlignment; | 235 static const size_t kSegmentOverhead = sizeof(Segment) + kAlignment; |
234 const size_t new_size_no_overhead = size + (old_size << 1); | 236 const size_t new_size_no_overhead = size + (old_size << 1); |
235 size_t new_size = kSegmentOverhead + new_size_no_overhead; | 237 size_t new_size = kSegmentOverhead + new_size_no_overhead; |
236 const size_t min_new_size = kSegmentOverhead + static_cast<size_t>(size); | 238 const size_t min_new_size = kSegmentOverhead + static_cast<size_t>(size); |
237 // Guard against integer overflow. | 239 // Guard against integer overflow. |
238 if (new_size_no_overhead < static_cast<size_t>(size) || | 240 if (new_size_no_overhead < static_cast<size_t>(size) || |
239 new_size < static_cast<size_t>(kSegmentOverhead)) { | 241 new_size < static_cast<size_t>(kSegmentOverhead)) { |
240 FatalProcessOutOfMemory("Zone"); | 242 V8::FatalProcessOutOfMemory("Zone"); |
241 return nullptr; | 243 return nullptr; |
242 } | 244 } |
243 if (new_size < static_cast<size_t>(kMinimumSegmentSize)) { | 245 if (new_size < static_cast<size_t>(kMinimumSegmentSize)) { |
244 new_size = kMinimumSegmentSize; | 246 new_size = kMinimumSegmentSize; |
245 } else if (new_size > static_cast<size_t>(kMaximumSegmentSize)) { | 247 } else if (new_size > static_cast<size_t>(kMaximumSegmentSize)) { |
246 // Limit the size of new segments to avoid growing the segment size | 248 // Limit the size of new segments to avoid growing the segment size |
247 // exponentially, thus putting pressure on contiguous virtual address space. | 249 // exponentially, thus putting pressure on contiguous virtual address space. |
248 // All the while making sure to allocate a segment large enough to hold the | 250 // All the while making sure to allocate a segment large enough to hold the |
249 // requested size. | 251 // requested size. |
250 new_size = Max(min_new_size, static_cast<size_t>(kMaximumSegmentSize)); | 252 new_size = Max(min_new_size, static_cast<size_t>(kMaximumSegmentSize)); |
251 } | 253 } |
252 if (new_size > INT_MAX) { | 254 if (new_size > INT_MAX) { |
253 FatalProcessOutOfMemory("Zone"); | 255 V8::FatalProcessOutOfMemory("Zone"); |
254 return nullptr; | 256 return nullptr; |
255 } | 257 } |
256 Segment* segment = NewSegment(static_cast<int>(new_size)); | 258 Segment* segment = NewSegment(static_cast<int>(new_size)); |
257 if (segment == nullptr) { | 259 if (segment == nullptr) { |
258 FatalProcessOutOfMemory("Zone"); | 260 V8::FatalProcessOutOfMemory("Zone"); |
259 return nullptr; | 261 return nullptr; |
260 } | 262 } |
261 | 263 |
262 // Recompute 'top' and 'limit' based on the new segment. | 264 // Recompute 'top' and 'limit' based on the new segment. |
263 Address result = RoundUp(segment->start(), kAlignment); | 265 Address result = RoundUp(segment->start(), kAlignment); |
264 position_ = result + size; | 266 position_ = result + size; |
265 // Check for address overflow. | 267 // Check for address overflow. |
266 // (Should not happen since the segment is guaranteed to accomodate | 268 // (Should not happen since the segment is guaranteed to accomodate |
267 // size bytes + header and alignment padding) | 269 // size bytes + header and alignment padding) |
268 DCHECK_GE(reinterpret_cast<uintptr_t>(position_), | 270 DCHECK_GE(reinterpret_cast<uintptr_t>(position_), |
269 reinterpret_cast<uintptr_t>(result)); | 271 reinterpret_cast<uintptr_t>(result)); |
270 limit_ = segment->end(); | 272 limit_ = segment->end(); |
271 DCHECK(position_ <= limit_); | 273 DCHECK(position_ <= limit_); |
272 return result; | 274 return result; |
273 } | 275 } |
274 | 276 |
275 } // namespace internal | 277 } // namespace internal |
276 } // namespace v8 | 278 } // namespace v8 |
OLD | NEW |