Index: src/handles.h |
diff --git a/src/handles.h b/src/handles.h |
index d95ca9117022d8d33c3bdfc5cc9dc32c8e7762e5..d7bf03f5152eed066cb692a3321bd70913be9e6a 100644 |
--- a/src/handles.h |
+++ b/src/handles.h |
@@ -39,7 +39,7 @@ namespace internal { |
// Handles are only valid within a HandleScope. |
// When a handle is created for an object a cell is allocated in the heap. |
-template<class T> |
+template<typename T> |
class Handle { |
public: |
INLINE(explicit Handle(T** location)) { location_ = location; } |
@@ -93,6 +93,55 @@ class Handle { |
}; |
+// A handle-scope based variable. The value stored in the variable can change |
+// over time. The value stored in the variable at any time is a root |
+// for garbage collection. |
+// The variable is backed by the current HandleScope. |
+template <typename T> |
+class HandleCell { |
+ public: |
+ // Create a new HandleCell holding the given value. |
+ explicit HandleCell(Handle<T> value); |
+ explicit HandleCell(T* value); |
+ |
+ // Create an alias of an existing HandleCell. |
+ explicit HandleCell(const HandleCell<T>& value) |
+ : location_(value.location_) { } |
+ |
+ INLINE(T* operator->() const) { return operator*(); } |
+ INLINE(T* operator*() const) { |
+ return *location_; |
+ } |
+ INLINE(void operator=(T* value)) { |
+ *location_ = value; |
+ } |
+ INLINE(void operator=(Handle<T> value)) { |
+ *location_ = *value; |
+ } |
+ INLINE(void operator=(const HandleCell<T>& value)) { |
+ *location_ = *value.location_; |
+ } |
+ |
+ // Extract the value of the variable and cast it to a give type. |
+ // This is typically used for calling methods on a more specialized type. |
+ template <typename S> |
+ inline S* cast() { |
+ S::cast(*location_); |
+ return *reinterpret_cast<S**>(location_); |
+ } |
+ |
+ Handle<T> ToHandle() const { |
+ return Handle<T>(*location_); |
+ } |
+ |
+ private: |
+ // Prevent implicit constructor from being created. |
+ HandleCell(); |
+ |
+ T** location_; |
+}; |
+ |
+ |
// A stack-allocated class that governs a number of local handles. |
// After a handle scope has been created, all local handles will be |
// allocated within that handle scope until either the handle scope is |