| Index: src/zone.cc
|
| diff --git a/src/zone.cc b/src/zone.cc
|
| index 450e975c9487003365644c31fe46cb0741f81c0f..48d8c7b171d54deaff81a861e48969adf276f786 100644
|
| --- a/src/zone.cc
|
| +++ b/src/zone.cc
|
| @@ -62,6 +62,47 @@ Zone::~Zone() {
|
| }
|
|
|
|
|
| +void* Zone::New(int size) {
|
| + // Round up the requested size to fit the alignment.
|
| + size = RoundUp(size, kAlignment);
|
| +
|
| + // If the allocation size is divisible by 8 then we return an 8-byte aligned
|
| + // address.
|
| + if (kPointerSize == 4 && kAlignment == 4) {
|
| + position_ += ((~size) & 4) & (reinterpret_cast<intptr_t>(position_) & 4);
|
| + } else {
|
| + DCHECK(kAlignment >= kPointerSize);
|
| + }
|
| +
|
| + // Check if the requested size is available without expanding.
|
| + Address result = position_;
|
| +
|
| + int size_with_redzone =
|
| +#ifdef V8_USE_ADDRESS_SANITIZER
|
| + size + kASanRedzoneBytes;
|
| +#else
|
| + size;
|
| +#endif
|
| +
|
| + if (size_with_redzone > limit_ - position_) {
|
| + result = NewExpand(size_with_redzone);
|
| + } else {
|
| + position_ += size_with_redzone;
|
| + }
|
| +
|
| +#ifdef V8_USE_ADDRESS_SANITIZER
|
| + Address redzone_position = result + size;
|
| + DCHECK(redzone_position + kASanRedzoneBytes == position_);
|
| + ASAN_POISON_MEMORY_REGION(redzone_position, kASanRedzoneBytes);
|
| +#endif
|
| +
|
| + // Check that the result has the proper alignment and return it.
|
| + DCHECK(IsAddressAligned(result, kAlignment, 0));
|
| + allocation_size_ += size;
|
| + return reinterpret_cast<void*>(result);
|
| +}
|
| +
|
| +
|
| void Zone::DeleteAll() {
|
| #ifdef DEBUG
|
| // Constant byte value used for zapping dead memory in debug mode.
|
|
|