Index: include/v8.h |
diff --git a/include/v8.h b/include/v8.h |
index 93b55ddbbfa2c282b6a927faba66f38dbeb8d39b..7de714f8dd4811430b2abf6983f3ce150104d07a 100644 |
--- a/include/v8.h |
+++ b/include/v8.h |
@@ -120,6 +120,7 @@ class Utils; |
class Value; |
template <class T> class Handle; |
template <class T> class Local; |
+template <class T> class Eternal; |
template <class T> class Persistent; |
class FunctionTemplate; |
class ObjectTemplate; |
@@ -370,11 +371,6 @@ template <class T> class Handle { |
}; |
-// A value which will never be returned by Local::Eternalize |
-// Useful for static initialization |
-const int kUninitializedEternalIndex = -1; |
- |
- |
/** |
* A light-weight stack-allocated object handle. All operations |
* that return objects from within v8 return them in local handles. They |
@@ -420,11 +416,6 @@ template <class T> class Local : public Handle<T> { |
return Local<S>::Cast(*this); |
} |
- // Keep this Local alive for the lifetime of the Isolate. |
- // It remains retrievable via the returned index, |
- V8_INLINE(int Eternalize(Isolate* isolate)); |
- V8_INLINE(static Local<T> GetEternal(Isolate* isolate, int index)); |
- |
/** |
* Create a local handle for the content of another handle. |
* The referee is kept alive by the local handle even when |
@@ -445,6 +436,7 @@ template <class T> class Local : public Handle<T> { |
private: |
friend class Utils; |
+ template<class F> friend class Eternal; |
template<class F> friend class Persistent; |
template<class F> friend class Handle; |
friend class Arguments; |
@@ -460,6 +452,28 @@ template <class T> class Local : public Handle<T> { |
V8_INLINE(static Local<T> New(Isolate* isolate, T* that)); |
}; |
+ |
+// Eternal handles are set-once handles that live for the life of the isolate. |
+template <class T> class Eternal { |
+ public: |
+ V8_INLINE(Eternal()) : index_(kInitialValue) { } |
+ template<class S> |
+ V8_INLINE(Eternal(Isolate* isolate, Local<S> handle)) |
+ : index_(kInitialValue) { |
+ Set(isolate, handle); |
+ } |
+ // Can only be safely called if already set. |
+ V8_INLINE(Local<T> Get(Isolate* isolate)); |
+ V8_INLINE(bool IsEmpty()) { return index_ != kInitialValue; } |
+ template<class S> |
+ V8_INLINE(void Set(Isolate* isolate, Local<S> handle)); |
+ |
+ private: |
+ static const int kInitialValue = -1; |
+ int index_; |
+}; |
+ |
+ |
/** |
* An object reference that is independent of any handle scope. Where |
* a Local handle only lives as long as the HandleScope in which it was |
@@ -4788,12 +4802,14 @@ class V8_EXPORT V8 { |
void* data, |
RevivableCallback weak_reference_callback); |
static void ClearWeak(internal::Object** global_handle); |
- static int Eternalize(internal::Isolate* isolate, |
- internal::Object** handle); |
- static internal::Object** GetEternal(internal::Isolate* isolate, int index); |
+ static void Eternalize(Isolate* isolate, |
+ Value* handle, |
+ int* index); |
+ static Local<Value> GetEternal(Isolate* isolate, int index); |
template <class T> friend class Handle; |
template <class T> friend class Local; |
+ template <class T> friend class Eternal; |
template <class T> friend class Persistent; |
friend class Context; |
}; |
@@ -5655,17 +5671,16 @@ Local<T> Local<T>::New(Isolate* isolate, T* that) { |
template<class T> |
-int Local<T>::Eternalize(Isolate* isolate) { |
- return V8::Eternalize(reinterpret_cast<internal::Isolate*>(isolate), |
- reinterpret_cast<internal::Object**>(this->val_)); |
+template<class S> |
+void Eternal<T>::Set(Isolate* isolate, Local<S> handle) { |
+ TYPE_CHECK(T, S); |
+ V8::Eternalize(isolate, Value::Cast(*handle), &this->index_); |
} |
template<class T> |
-Local<T> Local<T>::GetEternal(Isolate* isolate, int index) { |
- internal::Object** handle = |
- V8::GetEternal(reinterpret_cast<internal::Isolate*>(isolate), index); |
- return Local<T>(T::Cast(reinterpret_cast<Value*>(handle))); |
+Local<T> Eternal<T>::Get(Isolate* isolate) { |
+ return Local<T>::Cast(V8::GetEternal(isolate, index_)); |
} |