| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef VM_REUSABLE_HANDLES_H_ | 5 #ifndef VM_REUSABLE_HANDLES_H_ |
| 6 #define VM_REUSABLE_HANDLES_H_ | 6 #define VM_REUSABLE_HANDLES_H_ |
| 7 | 7 |
| 8 #include "vm/allocation.h" | 8 #include "vm/allocation.h" |
| 9 #include "vm/handles.h" | 9 #include "vm/handles.h" |
| 10 #include "vm/object.h" | 10 #include "vm/object.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 // { | 23 // { |
| 24 // REUSABLE_ARRAY_HANDLESCOPE(isolate); | 24 // REUSABLE_ARRAY_HANDLESCOPE(isolate); |
| 25 // .... | 25 // .... |
| 26 // .... | 26 // .... |
| 27 // Array& funcs = reused_array_handle.Handle(); | 27 // Array& funcs = reused_array_handle.Handle(); |
| 28 // code that uses funcs | 28 // code that uses funcs |
| 29 // .... | 29 // .... |
| 30 // } | 30 // } |
| 31 // | 31 // |
| 32 | 32 |
| 33 |
| 33 #if defined(DEBUG) | 34 #if defined(DEBUG) |
| 34 #define REUSABLE_SCOPE(name) \ | 35 #define REUSABLE_SCOPE(name) \ |
| 35 class Reusable##name##HandleScope : public ValueObject { \ | 36 class Reusable##name##HandleScope : public ValueObject { \ |
| 36 public: \ | 37 public: \ |
| 37 explicit Reusable##name##HandleScope(Isolate* isolate) \ | 38 explicit Reusable##name##HandleScope(Thread* thread) \ |
| 38 : isolate_(isolate) { \ | 39 : thread_(thread) { \ |
| 39 ASSERT(!isolate->reusable_##name##_handle_scope_active()); \ | 40 ASSERT(!thread->reusable_##name##_handle_scope_active()); \ |
| 40 isolate->set_reusable_##name##_handle_scope_active(true); \ | 41 thread->set_reusable_##name##_handle_scope_active(true); \ |
| 41 } \ | 42 } \ |
| 42 Reusable##name##HandleScope() : isolate_(Isolate::Current()) { \ | 43 Reusable##name##HandleScope() : thread_(Thread::Current()) { \ |
| 43 ASSERT(!isolate_->reusable_##name##_handle_scope_active()); \ | 44 ASSERT(!thread_->reusable_##name##_handle_scope_active()); \ |
| 44 isolate_->set_reusable_##name##_handle_scope_active(true); \ | 45 thread_->set_reusable_##name##_handle_scope_active(true); \ |
| 45 } \ | 46 } \ |
| 46 ~Reusable##name##HandleScope() { \ | 47 ~Reusable##name##HandleScope() { \ |
| 47 ASSERT(isolate_->reusable_##name##_handle_scope_active()); \ | 48 ASSERT(thread_->reusable_##name##_handle_scope_active()); \ |
| 48 isolate_->set_reusable_##name##_handle_scope_active(false); \ | 49 thread_->set_reusable_##name##_handle_scope_active(false); \ |
| 49 Handle().raw_ = name::null(); \ | 50 Handle().raw_ = name::null(); \ |
| 50 } \ | 51 } \ |
| 51 name& Handle() const { \ | 52 name& Handle() const { \ |
| 52 ASSERT(isolate_->name##_handle_ != NULL); \ | 53 ASSERT(thread_->name##_handle_ != NULL); \ |
| 53 return *isolate_->name##_handle_; \ | 54 return *thread_->name##_handle_; \ |
| 54 } \ | 55 } \ |
| 55 private: \ | 56 private: \ |
| 56 Isolate* isolate_; \ | 57 Thread* thread_; \ |
| 57 DISALLOW_COPY_AND_ASSIGN(Reusable##name##HandleScope); \ | 58 DISALLOW_COPY_AND_ASSIGN(Reusable##name##HandleScope); \ |
| 58 }; | 59 }; |
| 59 #else | 60 #else |
| 60 #define REUSABLE_SCOPE(name) \ | 61 #define REUSABLE_SCOPE(name) \ |
| 61 class Reusable##name##HandleScope : public ValueObject { \ | 62 class Reusable##name##HandleScope : public ValueObject { \ |
| 62 public: \ | 63 public: \ |
| 63 explicit Reusable##name##HandleScope(Isolate* isolate) \ | 64 explicit Reusable##name##HandleScope(Thread* thread) \ |
| 64 : handle_(isolate->name##_handle_) { \ | 65 : handle_(thread->name##_handle_) { \ |
| 65 } \ | 66 } \ |
| 66 Reusable##name##HandleScope() \ | 67 Reusable##name##HandleScope() \ |
| 67 : handle_(Isolate::Current()->name##_handle_) { \ | 68 : handle_(Thread::Current()->name##_handle_) { \ |
| 68 } \ | 69 } \ |
| 69 ~Reusable##name##HandleScope() { \ | 70 ~Reusable##name##HandleScope() { \ |
| 70 handle_->raw_ = name::null(); \ | 71 handle_->raw_ = name::null(); \ |
| 71 } \ | 72 } \ |
| 72 name& Handle() const { \ | 73 name& Handle() const { \ |
| 73 ASSERT(handle_ != NULL); \ | 74 ASSERT(handle_ != NULL); \ |
| 74 return *handle_; \ | 75 return *handle_; \ |
| 75 } \ | 76 } \ |
| 76 private: \ | 77 private: \ |
| 77 name* handle_; \ | 78 name* handle_; \ |
| 78 DISALLOW_COPY_AND_ASSIGN(Reusable##name##HandleScope); \ | 79 DISALLOW_COPY_AND_ASSIGN(Reusable##name##HandleScope); \ |
| 79 }; | 80 }; |
| 80 #endif // defined(DEBUG) | 81 #endif // defined(DEBUG) |
| 81 REUSABLE_HANDLE_LIST(REUSABLE_SCOPE) | 82 REUSABLE_HANDLE_LIST(REUSABLE_SCOPE) |
| 82 #undef REUSABLE_SCOPE | 83 #undef REUSABLE_SCOPE |
| 83 | 84 |
| 84 #define REUSABLE_ABSTRACT_TYPE_HANDLESCOPE(isolate) \ | 85 #define REUSABLE_ABSTRACT_TYPE_HANDLESCOPE(thread) \ |
| 85 ReusableAbstractTypeHandleScope reused_abstract_type(isolate); | 86 ReusableAbstractTypeHandleScope reused_abstract_type(thread); |
| 86 #define REUSABLE_ARRAY_HANDLESCOPE(isolate) \ | 87 #define REUSABLE_ARRAY_HANDLESCOPE(thread) \ |
| 87 ReusableArrayHandleScope reused_array_handle(isolate); | 88 ReusableArrayHandleScope reused_array_handle(thread); |
| 88 #define REUSABLE_CLASS_HANDLESCOPE(isolate) \ | 89 #define REUSABLE_CLASS_HANDLESCOPE(thread) \ |
| 89 ReusableClassHandleScope reused_class_handle(isolate); | 90 ReusableClassHandleScope reused_class_handle(thread); |
| 90 #define REUSABLE_CODE_HANDLESCOPE(isolate) \ | 91 #define REUSABLE_CODE_HANDLESCOPE(thread) \ |
| 91 ReusableCodeHandleScope reused_code_handle(isolate); | 92 ReusableCodeHandleScope reused_code_handle(thread); |
| 92 #define REUSABLE_ERROR_HANDLESCOPE(isolate) \ | 93 #define REUSABLE_ERROR_HANDLESCOPE(thread) \ |
| 93 ReusableErrorHandleScope reused_error_handle(isolate); | 94 ReusableErrorHandleScope reused_error_handle(thread); |
| 94 #define REUSABLE_EXCEPTION_HANDLERS_HANDLESCOPE(isolate) \ | 95 #define REUSABLE_EXCEPTION_HANDLERS_HANDLESCOPE(thread) \ |
| 95 ReusableExceptionHandlersHandleScope \ | 96 ReusableExceptionHandlersHandleScope \ |
| 96 reused_exception_handlers_handle(isolate); | 97 reused_exception_handlers_handle(thread); |
| 97 #define REUSABLE_FIELD_HANDLESCOPE(isolate) \ | 98 #define REUSABLE_FIELD_HANDLESCOPE(thread) \ |
| 98 ReusableFieldHandleScope reused_field_handle(isolate); | 99 ReusableFieldHandleScope reused_field_handle(thread); |
| 99 #define REUSABLE_FUNCTION_HANDLESCOPE(isolate) \ | 100 #define REUSABLE_FUNCTION_HANDLESCOPE(thread) \ |
| 100 ReusableFunctionHandleScope reused_function_handle(isolate); | 101 ReusableFunctionHandleScope reused_function_handle(thread); |
| 101 #define REUSABLE_GROWABLE_OBJECT_ARRAY_HANDLESCOPE(isolate) \ | 102 #define REUSABLE_GROWABLE_OBJECT_ARRAY_HANDLESCOPE(thread) \ |
| 102 ReusableGrowableObjectArrayHandleScope \ | 103 ReusableGrowableObjectArrayHandleScope \ |
| 103 reused_growable_object_array_handle(isolate) | 104 reused_growable_object_array_handle(thread) |
| 104 #define REUSABLE_INSTANCE_HANDLESCOPE(isolate) \ | 105 #define REUSABLE_INSTANCE_HANDLESCOPE(thread) \ |
| 105 ReusableInstanceHandleScope reused_instance_handle(isolate); | 106 ReusableInstanceHandleScope reused_instance_handle(thread); |
| 106 #define REUSABLE_LIBRARY_HANDLESCOPE(isolate) \ | 107 #define REUSABLE_LIBRARY_HANDLESCOPE(thread) \ |
| 107 ReusableLibraryHandleScope reused_library_handle(isolate); | 108 ReusableLibraryHandleScope reused_library_handle(thread); |
| 108 #define REUSABLE_OBJECT_HANDLESCOPE(isolate) \ | 109 #define REUSABLE_OBJECT_HANDLESCOPE(thread) \ |
| 109 ReusableObjectHandleScope reused_object_handle(isolate); | 110 ReusableObjectHandleScope reused_object_handle(thread); |
| 110 #define REUSABLE_PC_DESCRIPTORS_HANDLESCOPE(isolate) \ | 111 #define REUSABLE_PC_DESCRIPTORS_HANDLESCOPE(thread) \ |
| 111 ReusablePcDescriptorsHandleScope reused_pc_descriptors_handle(isolate); | 112 ReusablePcDescriptorsHandleScope reused_pc_descriptors_handle(thread); |
| 112 #define REUSABLE_STRING_HANDLESCOPE(isolate) \ | 113 #define REUSABLE_STRING_HANDLESCOPE(thread) \ |
| 113 ReusableStringHandleScope reused_string_handle(isolate); | 114 ReusableStringHandleScope reused_string_handle(thread); |
| 114 #define REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(isolate) \ | 115 #define REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(thread) \ |
| 115 ReusableTypeArgumentsHandleScope reused_type_arguments_handle(isolate); | 116 ReusableTypeArgumentsHandleScope reused_type_arguments_handle(thread); |
| 116 #define REUSABLE_TYPE_PARAMETER_HANDLESCOPE(isolate) \ | 117 #define REUSABLE_TYPE_PARAMETER_HANDLESCOPE(thread) \ |
| 117 ReusableTypeParameterHandleScope reused_type_parameter(isolate); | 118 ReusableTypeParameterHandleScope reused_type_parameter(thread); |
| 118 | |
| 119 | 119 |
| 120 } // namespace dart | 120 } // namespace dart |
| 121 | 121 |
| 122 #endif // VM_REUSABLE_HANDLES_H_ | 122 #endif // VM_REUSABLE_HANDLES_H_ |
| OLD | NEW |