| // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| #include "vm/zone_text_buffer.h" | |
| #include "platform/assert.h" | |
| #include "platform/globals.h" | |
| #include "platform/utils.h" | |
| #include "vm/object.h" | |
| #include "vm/os.h" | |
| #include "vm/zone.h" | |
| namespace dart { | |
| ZoneTextBuffer::ZoneTextBuffer(Zone* zone, intptr_t initial_capacity) | |
| : zone_(zone) { | |
| ASSERT(initial_capacity > 0); | |
| buffer_ = reinterpret_cast<char*>(zone->Alloc<char>(initial_capacity)); | |
| capacity_ = initial_capacity; | |
| buffer_[length_] = '\0'; | |
| } | |
| void ZoneTextBuffer::Clear() { | |
| const intptr_t initial_capacity = 64; | |
| buffer_ = reinterpret_cast<char*>(zone_->Alloc<char>(initial_capacity)); | |
| capacity_ = initial_capacity; | |
| length_ = 0; | |
| buffer_[length_] = '\0'; | |
| } | |
| bool ZoneTextBuffer::EnsureCapacity(intptr_t len) { | |
| intptr_t remaining = capacity_ - length_; | |
| if (remaining <= len) { | |
| intptr_t new_capacity = capacity_ + Utils::Maximum(capacity_, len); | |
| buffer_ = zone_->Realloc<char>(buffer_, capacity_, new_capacity); | |
| capacity_ = new_capacity; | |
| } | |
| return true; | |
| } | |
| } // namespace dart |