| Index: runtime/vm/reusable_handles.h
|
| ===================================================================
|
| --- runtime/vm/reusable_handles.h (revision 0)
|
| +++ runtime/vm/reusable_handles.h (revision 0)
|
| @@ -0,0 +1,144 @@
|
| +// Copyright (c) 2013, 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.
|
| +
|
| +#ifndef VM_REUSABLE_HANDLES_H_
|
| +#define VM_REUSABLE_HANDLES_H_
|
| +
|
| +#include "vm/allocation.h"
|
| +#include "vm/handles.h"
|
| +#include "vm/object.h"
|
| +
|
| +namespace dart {
|
| +
|
| +// The class ReusableHandleScope is used in regions of the
|
| +// virtual machine where isolate specific reusable handles are used.
|
| +// This class asserts that we do not add code that will result in recursive
|
| +// uses of reusable handles.
|
| +// It is used as follows:
|
| +// {
|
| +// ReusableHandleScope reused_handles(isolate);
|
| +// ....
|
| +// .....
|
| +// code that uses isolate specific reusable handles.
|
| +// Array& funcs = reused_handles.ArrayHandle();
|
| +// ....
|
| +// }
|
| +#if defined(DEBUG)
|
| +class ReusableObjectHandleScope : public StackResource {
|
| + public:
|
| + explicit ReusableObjectHandleScope(Isolate* isolate)
|
| + : StackResource(isolate), isolate_(isolate) {
|
| + ASSERT(!isolate->reusable_handle_scope_active());
|
| + isolate->set_reusable_handle_scope_active(true);
|
| + }
|
| + ReusableObjectHandleScope()
|
| + : StackResource(Isolate::Current()), isolate_(Isolate::Current()) {
|
| + ASSERT(!isolate()->reusable_handle_scope_active());
|
| + isolate()->set_reusable_handle_scope_active(true);
|
| + }
|
| + ~ReusableObjectHandleScope() {
|
| + ASSERT(isolate()->reusable_handle_scope_active());
|
| + isolate()->set_reusable_handle_scope_active(false);
|
| + Handle().raw_ = Object::null();
|
| + }
|
| + Object& Handle() {
|
| + ASSERT(isolate_->Object_handle_ != NULL);
|
| + return *isolate_->Object_handle_;
|
| + }
|
| +
|
| + private:
|
| + Isolate* isolate_;
|
| + DISALLOW_COPY_AND_ASSIGN(ReusableObjectHandleScope);
|
| +};
|
| +
|
| +
|
| +class ReusableHandleScope : public StackResource {
|
| + public:
|
| + explicit ReusableHandleScope(Isolate* isolate)
|
| + : StackResource(isolate), isolate_(isolate) {
|
| + ASSERT(!isolate->reusable_handle_scope_active());
|
| + isolate->set_reusable_handle_scope_active(true);
|
| + }
|
| + ReusableHandleScope()
|
| + : StackResource(Isolate::Current()), isolate_(Isolate::Current()) {
|
| + ASSERT(!isolate()->reusable_handle_scope_active());
|
| + isolate()->set_reusable_handle_scope_active(true);
|
| + }
|
| + ~ReusableHandleScope() {
|
| + ASSERT(isolate()->reusable_handle_scope_active());
|
| + isolate()->set_reusable_handle_scope_active(false);
|
| +#define CLEAR_REUSABLE_HANDLE(object) \
|
| + object##Handle().raw_ = Object::null(); \
|
| +
|
| + REUSABLE_HANDLE_LIST(CLEAR_REUSABLE_HANDLE);
|
| + }
|
| +
|
| +#define REUSABLE_HANDLE_ACCESSORS(object) \
|
| + object& object##Handle() { \
|
| + ASSERT(isolate_->object##_handle_ != NULL); \
|
| + return *isolate_->object##_handle_; \
|
| + } \
|
| +
|
| + REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_ACCESSORS)
|
| +#undef REUSABLE_HANDLE_ACCESSORS
|
| +
|
| + private:
|
| + void ResetHandles();
|
| + Isolate* isolate_;
|
| + DISALLOW_COPY_AND_ASSIGN(ReusableHandleScope);
|
| +};
|
| +#else
|
| +class ReusableObjectHandleScope : public ValueObject {
|
| + public:
|
| + explicit ReusableObjectHandleScope(Isolate* isolate)
|
| + : handle_(isolate->Object_handle_) {
|
| + }
|
| + ReusableObjectHandleScope() : handle_(Isolate::Current()->Object_handle_) {
|
| + }
|
| + ~ReusableObjectHandleScope() {
|
| + handle_->raw_ = Object::null();
|
| + }
|
| + Object& Handle() {
|
| + ASSERT(handle_ != NULL);
|
| + return *handle_;
|
| + }
|
| +
|
| + private:
|
| + Object* handle_;
|
| + DISALLOW_COPY_AND_ASSIGN(ReusableObjectHandleScope);
|
| +};
|
| +
|
| +
|
| +class ReusableHandleScope : public ValueObject {
|
| + public:
|
| + explicit ReusableHandleScope(Isolate* isolate) : isolate_(isolate) {
|
| + }
|
| + ReusableHandleScope() : isolate_(Isolate::Current()) {
|
| + }
|
| + ~ReusableHandleScope() {
|
| +#define CLEAR_REUSABLE_HANDLE(object) \
|
| + object##Handle().raw_ = Object::null(); \
|
| +
|
| + REUSABLE_HANDLE_LIST(CLEAR_REUSABLE_HANDLE);
|
| + }
|
| +
|
| +#define REUSABLE_HANDLE_ACCESSORS(object) \
|
| + object& object##Handle() { \
|
| + ASSERT(isolate_->object##_handle_ != NULL); \
|
| + return *isolate_->object##_handle_; \
|
| + } \
|
| +
|
| + REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_ACCESSORS)
|
| +#undef REUSABLE_HANDLE_ACCESSORS
|
| +
|
| + private:
|
| + void ResetHandles();
|
| + Isolate* isolate_;
|
| + DISALLOW_COPY_AND_ASSIGN(ReusableHandleScope);
|
| +};
|
| +#endif // defined(DEBUG)
|
| +
|
| +} // namespace dart
|
| +
|
| +#endif // VM_REUSABLE_HANDLES_H_
|
|
|
| Property changes on: runtime/vm/reusable_handles.h
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|