| Index: src/zone.cc
|
| diff --git a/src/zone.cc b/src/zone.cc
|
| index d3f1c6fce52d0b00e9feb86c0c253b5564937c51..0555f5da8ff88d3a593d71e3f9fee096ff44bf31 100644
|
| --- a/src/zone.cc
|
| +++ b/src/zone.cc
|
| @@ -73,15 +73,37 @@ Zone::Zone(Isolate* isolate)
|
| segment_bytes_allocated_(0),
|
| position_(0),
|
| limit_(0),
|
| - scope_nesting_(0),
|
| segment_head_(NULL),
|
| isolate_(isolate) {
|
| }
|
|
|
|
|
| -ZoneScope::~ZoneScope() {
|
| - if (ShouldDeleteOnExit()) zone_->DeleteAll();
|
| - zone_->scope_nesting_--;
|
| +Zone::~Zone() {
|
| +#ifdef DEBUG
|
| + // Constant byte value used for zapping dead memory in debug mode.
|
| + static const unsigned char kZapDeadByte = 0xcd;
|
| +#endif
|
| +
|
| + // Traverse the chained list of segments, zapping
|
| + // (in debug mode) and freeing every segment
|
| + Segment* current = segment_head_;
|
| + while (current != NULL) {
|
| + Segment* next = current->next();
|
| + int size = current->size();
|
| +#ifdef DEBUG
|
| + // Zap the entire current segment (including the header).
|
| + memset(current, kZapDeadByte, size);
|
| +#endif
|
| + DeleteSegment(current, size);
|
| + current = next;
|
| + }
|
| +
|
| + // We must clear the position and limit to force
|
| + // a new segment to be allocated on demand.
|
| + position_ = limit_ = 0;
|
| +
|
| + // Update the head segment.
|
| + segment_head_ = NULL;
|
| }
|
|
|
|
|
| @@ -105,66 +127,6 @@ void Zone::DeleteSegment(Segment* segment, int size) {
|
| }
|
|
|
|
|
| -void Zone::DeleteAll() {
|
| -#ifdef DEBUG
|
| - // Constant byte value used for zapping dead memory in debug mode.
|
| - static const unsigned char kZapDeadByte = 0xcd;
|
| -#endif
|
| -
|
| - // Find a segment with a suitable size to keep around.
|
| - Segment* keep = segment_head_;
|
| - while (keep != NULL && keep->size() > kMaximumKeptSegmentSize) {
|
| - keep = keep->next();
|
| - }
|
| -
|
| - // Traverse the chained list of segments, zapping (in debug mode)
|
| - // and freeing every segment except the one we wish to keep.
|
| - Segment* current = segment_head_;
|
| - while (current != NULL) {
|
| - Segment* next = current->next();
|
| - if (current == keep) {
|
| - // Unlink the segment we wish to keep from the list.
|
| - current->clear_next();
|
| - } else {
|
| - int size = current->size();
|
| -#ifdef DEBUG
|
| - // Zap the entire current segment (including the header).
|
| - memset(current, kZapDeadByte, size);
|
| -#endif
|
| - DeleteSegment(current, size);
|
| - }
|
| - current = next;
|
| - }
|
| -
|
| - // If we have found a segment we want to keep, we must recompute the
|
| - // variables 'position' and 'limit' to prepare for future allocate
|
| - // attempts. Otherwise, we must clear the position and limit to
|
| - // force a new segment to be allocated on demand.
|
| - if (keep != NULL) {
|
| - Address start = keep->start();
|
| - position_ = RoundUp(start, kAlignment);
|
| - limit_ = keep->end();
|
| -#ifdef DEBUG
|
| - // Zap the contents of the kept segment (but not the header).
|
| - memset(start, kZapDeadByte, keep->capacity());
|
| -#endif
|
| - } else {
|
| - position_ = limit_ = 0;
|
| - }
|
| -
|
| - // Update the head segment to be the kept segment (if any).
|
| - segment_head_ = keep;
|
| -}
|
| -
|
| -
|
| -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.
|
|
|