| 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" |
| 11 | 11 |
| 12 namespace dart { | 12 namespace dart { |
| 13 | 13 |
| 14 // The class ReusableHandleScope is used in regions of the | 14 // Classes registered in REUSABLE_HANDLE_LIST have an isolate specific reusable |
| 15 // virtual machine where isolate specific reusable handles are used. | 15 // handle. A guard class (Reusable*ClassName*HandleScope) should be used in |
| 16 // This class asserts that we do not add code that will result in recursive | 16 // regions of the virtual machine where the isolate specific reusable handle |
| 17 // uses of reusable handles. | 17 // of that type is used. The class asserts that we do not add code that will |
| 18 // It is used as follows: | 18 // result in recursive uses of the class's reusable handle. |
| 19 // |
| 20 // Below is an example of a reusable array handle via the |
| 21 // REUSABLE_*CLASSNAME*_HANDLESCOPE macro: |
| 22 // |
| 19 // { | 23 // { |
| 20 // ReusableHandleScope reused_handles(isolate); | 24 // REUSABLE_ARRAY_HANDLESCOPE(isolate); |
| 21 // .... | 25 // .... |
| 22 // ..... | 26 // .... |
| 23 // code that uses isolate specific reusable handles. | 27 // Array& funcs = reused_array_handle.Handle(); |
| 24 // Array& funcs = reused_handles.ArrayHandle(); | 28 // code that uses funcs |
| 25 // .... | 29 // .... |
| 26 // } | 30 // } |
| 31 // |
| 27 | 32 |
| 28 #if defined(DEBUG) | 33 #if defined(DEBUG) |
| 29 #define REUSABLE_SCOPE(name) \ | 34 #define REUSABLE_SCOPE(name) \ |
| 30 class Reusable##name##HandleScope : public ValueObject { \ | 35 class Reusable##name##HandleScope : public ValueObject { \ |
| 31 public: \ | 36 public: \ |
| 32 explicit Reusable##name##HandleScope(Isolate* isolate) \ | 37 explicit Reusable##name##HandleScope(Isolate* isolate) \ |
| 33 : isolate_(isolate) { \ | 38 : isolate_(isolate) { \ |
| 34 ASSERT(!isolate->reusable_##name##_handle_scope_active()); \ | 39 ASSERT(!isolate->reusable_##name##_handle_scope_active()); \ |
| 35 isolate->set_reusable_##name##_handle_scope_active(true); \ | 40 isolate->set_reusable_##name##_handle_scope_active(true); \ |
| 36 } \ | 41 } \ |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 return *handle_; \ | 74 return *handle_; \ |
| 70 } \ | 75 } \ |
| 71 private: \ | 76 private: \ |
| 72 name* handle_; \ | 77 name* handle_; \ |
| 73 DISALLOW_COPY_AND_ASSIGN(Reusable##name##HandleScope); \ | 78 DISALLOW_COPY_AND_ASSIGN(Reusable##name##HandleScope); \ |
| 74 }; | 79 }; |
| 75 #endif // defined(DEBUG) | 80 #endif // defined(DEBUG) |
| 76 REUSABLE_HANDLE_LIST(REUSABLE_SCOPE) | 81 REUSABLE_HANDLE_LIST(REUSABLE_SCOPE) |
| 77 #undef REUSABLE_SCOPE | 82 #undef REUSABLE_SCOPE |
| 78 | 83 |
| 84 #define REUSABLE_ABSTRACT_TYPE_HANDLESCOPE(isolate) \ |
| 85 ReusableAbstractTypeHandleScope reused_abstract_type(isolate); |
| 86 #define REUSABLE_ARRAY_HANDLESCOPE(isolate) \ |
| 87 ReusableArrayHandleScope reused_array_handle(isolate); |
| 88 #define REUSABLE_CLASS_HANDLESCOPE(isolate) \ |
| 89 ReusableClassHandleScope reused_class_handle(isolate); |
| 90 #define REUSABLE_CODE_HANDLESCOPE(isolate) \ |
| 91 ReusableCodeHandleScope reused_code_handle(isolate); |
| 92 #define REUSABLE_ERROR_HANDLESCOPE(isolate) \ |
| 93 ReusableErrorHandleScope reused_error_handle(isolate); |
| 94 #define REUSABLE_FIELD_HANDLESCOPE(isolate) \ |
| 95 ReusableFieldHandleScope reused_field_handle(isolate); |
| 96 #define REUSABLE_FUNCTION_HANDLESCOPE(isolate) \ |
| 97 ReusableFunctionHandleScope reused_function_handle(isolate); |
| 98 #define REUSABLE_INSTANCE_HANDLESCOPE(isolate) \ |
| 99 ReusableInstanceHandleScope reused_instance_handle(isolate); |
| 79 #define REUSABLE_OBJECT_HANDLESCOPE(isolate) \ | 100 #define REUSABLE_OBJECT_HANDLESCOPE(isolate) \ |
| 80 ReusableObjectHandleScope reused_object_handle(isolate); | 101 ReusableObjectHandleScope reused_object_handle(isolate); |
| 81 #define REUSABLE_ERROR_HANDLESCOPE(isolate) \ | |
| 82 ReusableErrorHandleScope reused_error_handle(isolate); | |
| 83 #define REUSABLE_ARRAY_HANDLESCOPE(isolate) \ | |
| 84 ReusableArrayHandleScope reused_array_handle(isolate); | |
| 85 #define REUSABLE_STRING_HANDLESCOPE(isolate) \ | 102 #define REUSABLE_STRING_HANDLESCOPE(isolate) \ |
| 86 ReusableStringHandleScope reused_string_handle(isolate); | 103 ReusableStringHandleScope reused_string_handle(isolate); |
| 87 #define REUSABLE_INSTANCE_HANDLESCOPE(isolate) \ | 104 #define REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(isolate) \ |
| 88 ReusableInstanceHandleScope reused_instance_handle(isolate); | 105 ReusableTypeArgumentsHandleScope reused_type_arguments_handle(isolate); |
| 89 #define REUSABLE_FUNCTION_HANDLESCOPE(isolate) \ | |
| 90 ReusableFunctionHandleScope reused_function_handle(isolate); | |
| 91 #define REUSABLE_FIELD_HANDLESCOPE(isolate) \ | |
| 92 ReusableFieldHandleScope reused_field_handle(isolate); | |
| 93 #define REUSABLE_CLASS_HANDLESCOPE(isolate) \ | |
| 94 ReusableClassHandleScope reused_class_handle(isolate); | |
| 95 #define REUSABLE_ABSTRACT_TYPE_HANDLESCOPE(isolate) \ | |
| 96 ReusableAbstractTypeHandleScope reused_abstract_type(isolate); | |
| 97 #define REUSABLE_TYPE_PARAMETER_HANDLESCOPE(isolate) \ | 106 #define REUSABLE_TYPE_PARAMETER_HANDLESCOPE(isolate) \ |
| 98 ReusableTypeParameterHandleScope reused_type_parameter(isolate); | 107 ReusableTypeParameterHandleScope reused_type_parameter(isolate); |
| 99 #define REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(isolate) \ | 108 |
| 100 ReusableTypeArgumentsHandleScope reused_type_arguments_handle(isolate); | |
| 101 | 109 |
| 102 } // namespace dart | 110 } // namespace dart |
| 103 | 111 |
| 104 #endif // VM_REUSABLE_HANDLES_H_ | 112 #endif // VM_REUSABLE_HANDLES_H_ |
| OLD | NEW |