Index: runtime/vm/allocation.cc |
diff --git a/runtime/vm/allocation.cc b/runtime/vm/allocation.cc |
index b6fda7b8478f61be06d8c2a2687aba0dacac737b..b5f0f6cdf061c0e3dcd0cfb9259cefc1560cfe27 100644 |
--- a/runtime/vm/allocation.cc |
+++ b/runtime/vm/allocation.cc |
@@ -6,6 +6,7 @@ |
#include "platform/assert.h" |
#include "vm/isolate.h" |
+#include "vm/thread.h" |
#include "vm/zone.h" |
namespace dart { |
@@ -30,6 +31,41 @@ void* ZoneAllocated::operator new(uword size, Zone* zone) { |
} |
+StackResource::~StackResource() { |
+ if (thread_ != NULL) { |
+ StackResource* top = thread_->top_resource(); |
+ ASSERT(top == this); |
+ thread_->set_top_resource(previous_); |
+ } |
+#if defined(DEBUG) |
+ if (thread_ != NULL) { |
+ ASSERT(Thread::Current() == thread_); |
+ BaseIsolate::AssertCurrent(reinterpret_cast<BaseIsolate*>(isolate())); |
+ } |
+#endif |
+} |
+ |
+ |
+Isolate* StackResource::isolate() const { |
+ return thread_ == NULL ? NULL : thread_->isolate(); |
+} |
+ |
+ |
+void StackResource::Init(Thread* thread) { |
+ // We can only have longjumps and exceptions when there is a current |
+ // thread and isolate. If there is no current thread, we don't need to |
+ // protect this case. |
+ // TODO(23807): Eliminate this special case. |
+ if (thread != NULL) { |
+ ASSERT(Thread::Current() == thread); |
+ thread_ = thread; |
+ previous_ = thread_->top_resource(); |
+ ASSERT((previous_ == NULL) || (previous_->thread_ == thread)); |
+ thread_->set_top_resource(this); |
+ } |
+} |
+ |
+ |
void StackResource::UnwindAbove(Thread* thread, StackResource* new_top) { |
StackResource* current_resource = thread->top_resource(); |
while (current_resource != new_top) { |