// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. #include "vm/allocation.h" #include "platform/assert.h" #include "vm/isolate.h" #include "vm/thread.h" #include "vm/zone.h" namespace dart { static void* Allocate(uword size, Zone* zone) { ASSERT(zone != NULL); if (size > static_cast(kIntptrMax)) { FATAL1("ZoneAllocated object has unexpectedly large size %" Pu "", size); } return reinterpret_cast(zone->AllocUnsafe(size)); } void* ZoneAllocated::operator new(uword size) { return Allocate(size, Thread::Current()->zone()); } void* ZoneAllocated::operator new(uword size, Zone* zone) { ASSERT(Thread::Current()->ZoneIsOwnedByThread(zone)); return Allocate(size, 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_); } #endif } void StackResource::Init(ThreadState* 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(ThreadState* thread, StackResource* new_top) { StackResource* current_resource = thread->top_resource(); while (current_resource != new_top) { current_resource->~StackResource(); current_resource = thread->top_resource(); } } } // namespace dart