Index: vm/allocation.h |
=================================================================== |
--- vm/allocation.h (revision 6287) |
+++ vm/allocation.h (working copy) |
@@ -6,6 +6,7 @@ |
#define VM_ALLOCATION_H_ |
#include "platform/assert.h" |
+#include "vm/base_isolate.h" |
#include "vm/globals.h" |
namespace dart { |
@@ -36,17 +37,36 @@ |
// to a stack frame above the frame where these objects were allocated. |
class StackResource { |
public: |
- explicit StackResource(Isolate* isolate); |
- virtual ~StackResource(); |
+ explicit StackResource(BaseIsolate* isolate) |
+ : isolate_(isolate), previous_(NULL) { |
+ // We can only have longjumps and exceptions when there is a current |
+ // isolate. If there is no current isolate, we don't need to |
+ // protect this case. |
+ if (isolate) { |
+ previous_ = isolate->top_resource(); |
+ isolate->set_top_resource(this); |
+ } |
+ } |
- Isolate* isolate() const { return isolate_; } |
+ virtual ~StackResource() { |
+ if (isolate()) { |
+ StackResource* top = isolate()->top_resource(); |
+ ASSERT(top == this); |
+ isolate()->set_top_resource(previous_); |
+ } |
+#if defined(DEBUG) |
+ BaseIsolate::AssertCurrent(isolate()); |
+#endif |
+ } |
+ BaseIsolate* isolate() const { return isolate_; } |
+ |
// The delete operator should be private instead of public, but unfortunately |
// the compiler complains when compiling the destructors for subclasses. |
void operator delete(void* pointer) { UNREACHABLE(); } |
private: |
- Isolate* isolate_; // Current isolate for this stack resource. |
+ BaseIsolate* isolate_; // Current isolate for this stack resource. |
StackResource* previous_; |
void* operator new(uword size); |