| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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_HANDLES_H_ | 5 #ifndef VM_HANDLES_H_ |
| 6 #define VM_HANDLES_H_ | 6 #define VM_HANDLES_H_ |
| 7 | 7 |
| 8 #include "vm/allocation.h" | 8 #include "vm/allocation.h" |
| 9 | 9 |
| 10 namespace dart { | 10 namespace dart { |
| 11 | 11 |
| 12 // Handles are used in the Dart Virtual Machine to ensure that access | 12 // Handles are used in the Dart Virtual Machine to ensure that access |
| 13 // to dart objects in the virtual machine code is done in a | 13 // to dart objects in the virtual machine code is done in a |
| 14 // Garbage Collection safe manner. | 14 // Garbage Collection safe manner. |
| 15 // | 15 // |
| 16 // The class Handles is the basic type that implements creation of handles and | 16 // The class Handles is the basic type that implements creation of handles and |
| 17 // manages their life cycle (allocated either in the current zone or | 17 // manages their life cycle (allocated either in the current zone or |
| 18 // current handle scope). | 18 // current handle scope). |
| 19 // The two forms of handle allocation are: | 19 // The two forms of handle allocation are: |
| 20 // - allocation of handles in the current zone (Handle::AllocateZoneHandle). | 20 // - allocation of handles in the current zone (Handle::AllocateZoneHandle). |
| 21 // Handles allocated in this manner are destroyed when the zone is destroyed. | 21 // Handles allocated in this manner are destroyed when the zone is destroyed. |
| 22 // - allocation of handles in a scoped manner (Handle::AllocateHandle). | 22 // - allocation of handles in a scoped manner (Handle::AllocateHandle). |
| 23 // A new scope can be started using HANDLESCOPE(). | 23 // A new scope can be started using HANDLESCOPE(isolate). |
| 24 // Handles allocated in this manner are destroyed when the HandleScope | 24 // Handles allocated in this manner are destroyed when the HandleScope |
| 25 // object is destroyed. | 25 // object is destroyed. |
| 26 // Code that uses scoped handles typically looks as follows: | 26 // Code that uses scoped handles typically looks as follows: |
| 27 // { | 27 // { |
| 28 // HANDLESCOPE(isolate); | 28 // HANDLESCOPE(isolate); |
| 29 // const String& str = String::Handle(String::New("abc")); | 29 // const String& str = String::Handle(String::New("abc")); |
| 30 // ..... | 30 // ..... |
| 31 // ..... | 31 // ..... |
| 32 // } | 32 // } |
| 33 // Code that uses zone handles typically looks as follows: | 33 // Code that uses zone handles typically looks as follows: |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 public: | 253 public: |
| 254 explicit HandleScope(Isolate* isolate); | 254 explicit HandleScope(Isolate* isolate); |
| 255 ~HandleScope(); | 255 ~HandleScope(); |
| 256 | 256 |
| 257 private: | 257 private: |
| 258 VMHandles::HandlesBlock* saved_handle_block_; // Handle block at prev scope. | 258 VMHandles::HandlesBlock* saved_handle_block_; // Handle block at prev scope. |
| 259 uword saved_handle_slot_; // Next available handle slot at previous scope. | 259 uword saved_handle_slot_; // Next available handle slot at previous scope. |
| 260 #if defined(DEBUG) | 260 #if defined(DEBUG) |
| 261 HandleScope* link_; // Link to previous scope. | 261 HandleScope* link_; // Link to previous scope. |
| 262 #endif | 262 #endif |
| 263 DISALLOW_COPY_AND_ASSIGN(HandleScope); | 263 DISALLOW_IMPLICIT_CONSTRUCTORS(HandleScope); |
| 264 }; | 264 }; |
| 265 | 265 |
| 266 // Macro to start a new Handle scope. | 266 // Macro to start a new Handle scope. |
| 267 #define HANDLESCOPE(isolate) \ | 267 #define HANDLESCOPE(isolate) \ |
| 268 dart::HandleScope vm_internal_handles_scope_(isolate); | 268 dart::HandleScope vm_internal_handles_scope_(isolate); |
| 269 | 269 |
| 270 | 270 |
| 271 // The class NoHandleScope is used in critical regions of the virtual machine | 271 // The class NoHandleScope is used in critical regions of the virtual machine |
| 272 // code where raw dart object pointers are directly manipulated. | 272 // code where raw dart object pointers are directly manipulated. |
| 273 // This class asserts that we do not add code that will allocate new handles | 273 // This class asserts that we do not add code that will allocate new handles |
| 274 // during this critical area. | 274 // during this critical area. |
| 275 // It is used as follows: | 275 // It is used as follows: |
| 276 // { | 276 // { |
| 277 // NOHANDLESCOPE(isolate); | 277 // NOHANDLESCOPE(isolate); |
| 278 // .... | 278 // .... |
| 279 // ..... | 279 // ..... |
| 280 // critical code that manipulates dart objects directly. | 280 // critical code that manipulates dart objects directly. |
| 281 // .... | 281 // .... |
| 282 // } | 282 // } |
| 283 #if defined(DEBUG) | 283 #if defined(DEBUG) |
| 284 class NoHandleScope : public StackResource { | 284 class NoHandleScope : public StackResource { |
| 285 public: | 285 public: |
| 286 explicit NoHandleScope(Isolate* isolate); | 286 explicit NoHandleScope(Isolate* isolate); |
| 287 ~NoHandleScope(); | 287 ~NoHandleScope(); |
| 288 | 288 |
| 289 private: | 289 private: |
| 290 DISALLOW_COPY_AND_ASSIGN(NoHandleScope); | 290 DISALLOW_IMPLICIT_CONSTRUCTORS(NoHandleScope); |
| 291 }; | 291 }; |
| 292 #else // defined(DEBUG) | 292 #else // defined(DEBUG) |
| 293 class NoHandleScope : public ValueObject { | 293 class NoHandleScope : public ValueObject { |
| 294 public: | 294 public: |
| 295 explicit NoHandleScope(Isolate* isolate) { } | 295 explicit NoHandleScope(Isolate* isolate) { } |
| 296 ~NoHandleScope() { } | 296 ~NoHandleScope() { } |
| 297 | 297 |
| 298 private: | 298 private: |
| 299 DISALLOW_COPY_AND_ASSIGN(NoHandleScope); | 299 DISALLOW_IMPLICIT_CONSTRUCTORS(NoHandleScope); |
| 300 }; | 300 }; |
| 301 #endif // defined(DEBUG) | 301 #endif // defined(DEBUG) |
| 302 | 302 |
| 303 // Macro to start a no handles scope in the code. | 303 // Macro to start a no handles scope in the code. |
| 304 #define NOHANDLESCOPE(isolate) \ | 304 #define NOHANDLESCOPE(isolate) \ |
| 305 dart::NoHandleScope no_vm_internal_handles_scope_(isolate); | 305 dart::NoHandleScope no_vm_internal_handles_scope_(isolate); |
| 306 | 306 |
| 307 } // namespace dart | 307 } // namespace dart |
| 308 | 308 |
| 309 #endif // VM_HANDLES_H_ | 309 #endif // VM_HANDLES_H_ |
| OLD | NEW |