| Index: runtime/vm/zone.h
 | 
| ===================================================================
 | 
| --- runtime/vm/zone.h	(revision 25803)
 | 
| +++ runtime/vm/zone.h	(working copy)
 | 
| @@ -12,6 +12,8 @@
 | 
|  
 | 
|  namespace dart {
 | 
|  
 | 
| +DECLARE_DEBUG_FLAG(bool, trace_zones);
 | 
| +
 | 
|  // Zones support very fast allocation of small chunks of memory. The
 | 
|  // chunks cannot be deallocated individually, but instead zones
 | 
|  // support deallocating all chunks in one fast operation.
 | 
| @@ -57,9 +59,30 @@
 | 
|    void VisitObjectPointers(ObjectPointerVisitor* visitor);
 | 
|  
 | 
|   private:
 | 
| -  Zone();
 | 
| -  ~Zone();  // Delete all memory associated with the zone.
 | 
| +  Zone()
 | 
| +    : initial_buffer_(buffer_, kInitialChunkSize),
 | 
| +      position_(initial_buffer_.start()),
 | 
| +      limit_(initial_buffer_.end()),
 | 
| +      head_(NULL),
 | 
| +      large_segments_(NULL),
 | 
| +      handles_(),
 | 
| +      previous_(NULL) {
 | 
| +#ifdef DEBUG
 | 
| +    // Zap the entire initial buffer.
 | 
| +    memset(initial_buffer_.pointer(), kZapUninitializedByte,
 | 
| +           initial_buffer_.size());
 | 
| +#endif
 | 
| +  }
 | 
|  
 | 
| +  ~Zone() {  // Delete all memory associated with the zone.
 | 
| +#if defined(DEBUG)
 | 
| +    if (FLAG_trace_zones) {
 | 
| +      DumpZoneSizes();
 | 
| +    }
 | 
| +#endif
 | 
| +    DeleteAll();
 | 
| +  }
 | 
| +
 | 
|    // All pointers returned from AllocateUnsafe() and New() have this alignment.
 | 
|    static const intptr_t kAlignment = kWordSize;
 | 
|  
 | 
| @@ -134,10 +157,32 @@
 | 
|  class StackZone : public StackResource {
 | 
|   public:
 | 
|    // Create an empty zone and set is at the current zone for the Isolate.
 | 
| -  explicit StackZone(BaseIsolate* isolate);
 | 
| +  explicit StackZone(BaseIsolate* isolate)
 | 
| +    : StackResource(isolate),
 | 
| +      zone_() {
 | 
| +#ifdef DEBUG
 | 
| +    if (FLAG_trace_zones) {
 | 
| +      OS::PrintErr("*** Starting a new Stack zone 0x%"Px"(0x%"Px")\n",
 | 
| +                   reinterpret_cast<intptr_t>(this),
 | 
| +                   reinterpret_cast<intptr_t>(&zone_));
 | 
| +    }
 | 
| +#endif
 | 
| +    zone_.Link(isolate->current_zone());
 | 
| +    isolate->set_current_zone(&zone_);
 | 
| +  }
 | 
|  
 | 
|    // Delete all memory associated with the zone.
 | 
| -  ~StackZone();
 | 
| +  ~StackZone() {
 | 
| +    ASSERT(isolate()->current_zone() == &zone_);
 | 
| +    isolate()->set_current_zone(zone_.previous_);
 | 
| +#ifdef DEBUG
 | 
| +    if (FLAG_trace_zones) {
 | 
| +      OS::PrintErr("*** Deleting Stack zone 0x%"Px"(0x%"Px")\n",
 | 
| +                   reinterpret_cast<intptr_t>(this),
 | 
| +                   reinterpret_cast<intptr_t>(&zone_));
 | 
| +    }
 | 
| +#endif
 | 
| +  }
 | 
|  
 | 
|    // Compute the total size of this zone. This includes wasted space that is
 | 
|    // due to internal fragmentation in the segments.
 | 
| 
 |