Index: runtime/vm/dart_api_state.h |
=================================================================== |
--- runtime/vm/dart_api_state.h (revision 25286) |
+++ runtime/vm/dart_api_state.h (working copy) |
@@ -50,7 +50,7 @@ |
// Delete all memory associated with the zone. |
~ApiZone() { |
Isolate* isolate = Isolate::Current(); |
- if (isolate != NULL && isolate->current_zone() == &zone_) { |
+ if ((isolate != NULL) && (isolate->current_zone() == &zone_)) { |
isolate->set_current_zone(zone_.previous_); |
} |
#ifdef DEBUG |
@@ -92,6 +92,22 @@ |
Zone* GetZone() { return &zone_; } |
+ void Reinit(Isolate* isolate) { |
+ if (isolate == NULL) { |
+ zone_.Link(NULL); |
+ } else { |
+ zone_.Link(isolate->current_zone()); |
+ isolate->set_current_zone(&zone_); |
+ } |
+ } |
+ |
+ void Reset(Isolate* isolate) { |
+ if ((isolate != NULL) && (isolate->current_zone() == &zone_)) { |
+ isolate->set_current_zone(zone_.previous_); |
+ } |
+ zone_.DeleteAll(); |
+ } |
+ |
private: |
Zone zone_; |
@@ -265,6 +281,13 @@ |
kOffsetOfRawPtrInLocalHandle>::VisitObjectPointers(visitor); |
} |
+ // Reset the local handles block for reuse. |
+ void Reset() { |
+ Handles<kLocalHandleSizeInWords, |
+ kLocalHandlesPerChunk, |
+ kOffsetOfRawPtrInLocalHandle>::Reset(); |
+ } |
+ |
// Allocates a handle in the current handle scope. This handle is valid only |
// in the current handle scope and is destroyed when the current handle |
// scope ends. |
@@ -505,6 +528,21 @@ |
previous_ = NULL; |
} |
+ // Reinit the ApiLocalScope to new values. |
+ void Reinit(Isolate* isolate, ApiLocalScope* previous, uword stack_marker) { |
+ previous_ = previous; |
+ stack_marker_ = stack_marker; |
+ zone_.Reinit(isolate); |
+ } |
+ |
+ // Reset the ApiLocalScope so that it can be reused again. |
+ void Reset(Isolate* isolate) { |
+ local_handles_.Reset(); |
+ zone_.Reset(isolate); |
+ previous_ = NULL; |
+ stack_marker_ = 0; |
+ } |
+ |
// Accessors. |
ApiLocalScope* previous() const { return previous_; } |
uword stack_marker() const { return stack_marker_; } |
@@ -527,8 +565,15 @@ |
// basis and destroyed when the isolate is shutdown. |
class ApiState { |
public: |
- ApiState() : top_scope_(NULL), delayed_weak_reference_sets_(NULL), |
- null_(NULL), true_(NULL), false_(NULL), |
+ ApiState() : persistent_handles_(), |
+ weak_persistent_handles_(), |
+ prologue_weak_persistent_handles_(), |
+ reusable_scope_(NULL), |
+ top_scope_(NULL), |
+ delayed_weak_reference_sets_(NULL), |
+ null_(NULL), |
+ true_(NULL), |
+ false_(NULL), |
acquired_error_(NULL) {} |
~ApiState() { |
while (top_scope_ != NULL) { |
@@ -555,6 +600,11 @@ |
} |
// Accessors. |
+ ApiLocalScope* reusable_scope() const { return reusable_scope_; } |
+ void set_reusable_scope(ApiLocalScope* value) { |
+ ASSERT(value == NULL || reusable_scope_ == NULL); |
+ reusable_scope_ = value; |
+ } |
ApiLocalScope* top_scope() const { return top_scope_; } |
void set_top_scope(ApiLocalScope* value) { top_scope_ = value; } |
@@ -680,6 +730,7 @@ |
PersistentHandles persistent_handles_; |
FinalizablePersistentHandles weak_persistent_handles_; |
FinalizablePersistentHandles prologue_weak_persistent_handles_; |
+ ApiLocalScope* reusable_scope_; |
ApiLocalScope* top_scope_; |
WeakReferenceSet* delayed_weak_reference_sets_; |