| 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 <string.h> | 5 #include <string.h> |
| 6 | 6 |
| 7 #include "src/v8.h" | 7 #include "src/v8.h" |
| 8 #include "src/zone-inl.h" | 8 #include "src/zone-inl.h" |
| 9 | 9 |
| 10 namespace v8 { | 10 namespace v8 { |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 55 | 55 |
| 56 | 56 |
| 57 Zone::~Zone() { | 57 Zone::~Zone() { |
| 58 DeleteAll(); | 58 DeleteAll(); |
| 59 DeleteKeptSegment(); | 59 DeleteKeptSegment(); |
| 60 | 60 |
| 61 DCHECK(segment_bytes_allocated_ == 0); | 61 DCHECK(segment_bytes_allocated_ == 0); |
| 62 } | 62 } |
| 63 | 63 |
| 64 | 64 |
| 65 void* Zone::New(int size) { |
| 66 // Round up the requested size to fit the alignment. |
| 67 size = RoundUp(size, kAlignment); |
| 68 |
| 69 // If the allocation size is divisible by 8 then we return an 8-byte aligned |
| 70 // address. |
| 71 if (kPointerSize == 4 && kAlignment == 4) { |
| 72 position_ += ((~size) & 4) & (reinterpret_cast<intptr_t>(position_) & 4); |
| 73 } else { |
| 74 DCHECK(kAlignment >= kPointerSize); |
| 75 } |
| 76 |
| 77 // Check if the requested size is available without expanding. |
| 78 Address result = position_; |
| 79 |
| 80 int size_with_redzone = |
| 81 #ifdef V8_USE_ADDRESS_SANITIZER |
| 82 size + kASanRedzoneBytes; |
| 83 #else |
| 84 size; |
| 85 #endif |
| 86 |
| 87 if (size_with_redzone > limit_ - position_) { |
| 88 result = NewExpand(size_with_redzone); |
| 89 } else { |
| 90 position_ += size_with_redzone; |
| 91 } |
| 92 |
| 93 #ifdef V8_USE_ADDRESS_SANITIZER |
| 94 Address redzone_position = result + size; |
| 95 DCHECK(redzone_position + kASanRedzoneBytes == position_); |
| 96 ASAN_POISON_MEMORY_REGION(redzone_position, kASanRedzoneBytes); |
| 97 #endif |
| 98 |
| 99 // Check that the result has the proper alignment and return it. |
| 100 DCHECK(IsAddressAligned(result, kAlignment, 0)); |
| 101 allocation_size_ += size; |
| 102 return reinterpret_cast<void*>(result); |
| 103 } |
| 104 |
| 105 |
| 65 void Zone::DeleteAll() { | 106 void Zone::DeleteAll() { |
| 66 #ifdef DEBUG | 107 #ifdef DEBUG |
| 67 // Constant byte value used for zapping dead memory in debug mode. | 108 // Constant byte value used for zapping dead memory in debug mode. |
| 68 static const unsigned char kZapDeadByte = 0xcd; | 109 static const unsigned char kZapDeadByte = 0xcd; |
| 69 #endif | 110 #endif |
| 70 | 111 |
| 71 // Find a segment with a suitable size to keep around. | 112 // Find a segment with a suitable size to keep around. |
| 72 Segment* keep = NULL; | 113 Segment* keep = NULL; |
| 73 // Traverse the chained list of segments, zapping (in debug mode) | 114 // Traverse the chained list of segments, zapping (in debug mode) |
| 74 // and freeing every segment except the one we wish to keep. | 115 // and freeing every segment except the one we wish to keep. |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 209 V8::FatalProcessOutOfMemory("Zone"); | 250 V8::FatalProcessOutOfMemory("Zone"); |
| 210 return NULL; | 251 return NULL; |
| 211 } | 252 } |
| 212 limit_ = segment->end(); | 253 limit_ = segment->end(); |
| 213 DCHECK(position_ <= limit_); | 254 DCHECK(position_ <= limit_); |
| 214 return result; | 255 return result; |
| 215 } | 256 } |
| 216 | 257 |
| 217 | 258 |
| 218 } } // namespace v8::internal | 259 } } // namespace v8::internal |
| OLD | NEW |