| Index: src/zone.cc
|
| diff --git a/src/zone.cc b/src/zone.cc
|
| index 42ce8c5cb7c2d72392c3f80cbbc92f42ac418cf4..7574778f539acb9db63f73e79218a9fa0a3cd9ee 100644
|
| --- a/src/zone.cc
|
| +++ b/src/zone.cc
|
| @@ -34,24 +34,6 @@ namespace v8 {
|
| namespace internal {
|
|
|
|
|
| -Zone::Zone()
|
| - : zone_excess_limit_(256 * MB),
|
| - segment_bytes_allocated_(0),
|
| - position_(0),
|
| - limit_(0),
|
| - scope_nesting_(0),
|
| - segment_head_(NULL) {
|
| -}
|
| -unsigned Zone::allocation_size_ = 0;
|
| -
|
| -
|
| -ZoneScope::~ZoneScope() {
|
| - ASSERT_EQ(Isolate::Current(), isolate_);
|
| - if (ShouldDeleteOnExit()) isolate_->zone()->DeleteAll();
|
| - isolate_->zone()->scope_nesting_--;
|
| -}
|
| -
|
| -
|
| // Segments represent chunks of memory: They have starting address
|
| // (encoded in the this pointer) and a size in bytes. Segments are
|
| // chained together forming a LIFO structure with the newest segment
|
| @@ -60,6 +42,11 @@ ZoneScope::~ZoneScope() {
|
|
|
| class Segment {
|
| public:
|
| + void Initialize(Segment* next, int size) {
|
| + next_ = next;
|
| + size_ = size;
|
| + }
|
| +
|
| Segment* next() const { return next_; }
|
| void clear_next() { next_ = NULL; }
|
|
|
| @@ -77,19 +64,33 @@ class Segment {
|
|
|
| Segment* next_;
|
| int size_;
|
| -
|
| - friend class Zone;
|
| };
|
|
|
|
|
| +Zone::Zone()
|
| + : zone_excess_limit_(256 * MB),
|
| + segment_bytes_allocated_(0),
|
| + position_(0),
|
| + limit_(0),
|
| + scope_nesting_(0),
|
| + segment_head_(NULL) {
|
| +}
|
| +unsigned Zone::allocation_size_ = 0;
|
| +
|
| +ZoneScope::~ZoneScope() {
|
| + ASSERT_EQ(Isolate::Current(), isolate_);
|
| + if (ShouldDeleteOnExit()) isolate_->zone()->DeleteAll();
|
| + isolate_->zone()->scope_nesting_--;
|
| +}
|
| +
|
| +
|
| // Creates a new segment, sets it size, and pushes it to the front
|
| // of the segment chain. Returns the new segment.
|
| Segment* Zone::NewSegment(int size) {
|
| Segment* result = reinterpret_cast<Segment*>(Malloced::New(size));
|
| adjust_segment_bytes_allocated(size);
|
| if (result != NULL) {
|
| - result->next_ = segment_head_;
|
| - result->size_ = size;
|
| + result->Initialize(segment_head_, size);
|
| segment_head_ = result;
|
| }
|
| return result;
|
| @@ -155,6 +156,14 @@ void Zone::DeleteAll() {
|
| }
|
|
|
|
|
| +void Zone::DeleteKeptSegment() {
|
| + if (segment_head_ != NULL) {
|
| + DeleteSegment(segment_head_, segment_head_->size());
|
| + segment_head_ = NULL;
|
| + }
|
| +}
|
| +
|
| +
|
| Address Zone::NewExpand(int size) {
|
| // Make sure the requested size is already properly aligned and that
|
| // there isn't enough room in the Zone to satisfy the request.
|
|
|