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. |