Index: src/handles.h |
diff --git a/src/handles.h b/src/handles.h |
index d95ca9117022d8d33c3bdfc5cc9dc32c8e7762e5..b038c1f34c1eb96d00ddc68c7b30a428154d72c3 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,54 @@ 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 RootVar { |
Erik Corry
2011/02/24 10:36:57
I think I would prefer MutableHandle as a name wit
Lasse Reichstein
2011/02/24 13:44:41
Renamed to HandleCell.
The name MutableHandle seem
|
+ public: |
+ // Create a new RootVar holding the given value. |
+ explicit RootVar(Handle<T> value); |
+ explicit RootVar(T* value); |
+ |
+ // Create an alias of an existing RootVar. |
+ explicit RootVar(const RootVar<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)) { |
Erik Corry
2011/02/24 10:36:57
Would it be premature generalization to provide th
Lasse Reichstein
2011/02/24 13:44:41
I would prefer only having explicit ways to extrac
|
+ *location_ = *value; |
+ } |
+ INLINE(void operator=(const RootVar<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. |
+ RootVar(); |
+ |
+ 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 |