| 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
|
|
|