| 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);
|
|
|