| Index: include/v8.h
|
| diff --git a/include/v8.h b/include/v8.h
|
| index 9ddde5294b168900f3c8fbf318673b978e04a4a9..f2727d3a868384b593b6388109f8c8afcf3d2398 100644
|
| --- a/include/v8.h
|
| +++ b/include/v8.h
|
| @@ -142,7 +142,10 @@ class Utils;
|
| class Value;
|
| template <class T> class Handle;
|
| template <class T> class Local;
|
| -template <class T> class Persistent;
|
| +template<class T, class P> class NonCopyablePersistentModifier;
|
| +template<class T,
|
| + class M = NonCopyablePersistentModifier<T, void> > class Persistent;
|
| +template<class T, class P> class WeakCallbackObject;
|
| class FunctionTemplate;
|
| class ObjectTemplate;
|
| class Data;
|
| @@ -192,27 +195,6 @@ class UniqueId {
|
| intptr_t data_;
|
| };
|
|
|
| -
|
| -// --- Weak Handles ---
|
| -
|
| -
|
| -/**
|
| - * A weak reference callback function.
|
| - *
|
| - * This callback should either explicitly invoke Dispose on |object| if
|
| - * V8 wrapper is not needed anymore, or 'revive' it by invocation of MakeWeak.
|
| - *
|
| - * \param object the weak global object to be reclaimed by the garbage collector
|
| - * \param parameter the value passed in when making the weak global object
|
| - */
|
| -template<typename T, typename P>
|
| -class WeakReferenceCallbacks {
|
| - public:
|
| - typedef void (*Revivable)(Isolate* isolate,
|
| - Persistent<T>* object,
|
| - P* parameter);
|
| -};
|
| -
|
| // --- Handles ---
|
|
|
| #define TYPE_CHECK(T, S) \
|
| @@ -253,13 +235,6 @@ template <class T> class Handle {
|
| */
|
| V8_INLINE(Handle()) : val_(0) {}
|
|
|
| -#ifdef V8_USE_UNSAFE_HANDLES
|
| - /**
|
| - * Creates a new handle for the specified value.
|
| - */
|
| - V8_INLINE(explicit Handle(T* val)) : val_(val) {}
|
| -#endif
|
| -
|
| /**
|
| * Creates a handle for the contents of the specified handle. This
|
| * constructor allows you to pass handles as arguments by value and
|
| @@ -308,7 +283,6 @@ template <class T> class Handle {
|
| return *a == *b;
|
| }
|
|
|
| -#ifndef V8_USE_UNSAFE_HANDLES
|
| template <class S> V8_INLINE(
|
| bool operator==(const Persistent<S>& that) const) {
|
| internal::Object** a = reinterpret_cast<internal::Object**>(**this);
|
| @@ -317,7 +291,6 @@ template <class T> class Handle {
|
| if (b == 0) return false;
|
| return *a == *b;
|
| }
|
| -#endif
|
|
|
| /**
|
| * Checks whether two handles are different.
|
| @@ -342,15 +315,22 @@ template <class T> class Handle {
|
| return Handle<S>::Cast(*this);
|
| }
|
|
|
| -#ifndef V8_USE_UNSAFE_HANDLES
|
| V8_INLINE(static Handle<T> New(Isolate* isolate, Handle<T> that)) {
|
| return New(isolate, that.val_);
|
| }
|
| - // TODO(dcarney): remove before cutover
|
| V8_INLINE(static Handle<T> New(Isolate* isolate, const Persistent<T>& that)) {
|
| return New(isolate, that.val_);
|
| }
|
|
|
| + // TODO(dcarney): better name
|
| + // TODO(dcarney): implement
|
| + // This is a useful helper function for managing resources tied to
|
| + // a handle dynamically
|
| + template<class P>
|
| + void WeakBind(Isolate* isolate,
|
| + P* parameter,
|
| + void (*WeakBindFunction)(Isolate* isolate, P* parameter));
|
| +
|
| #ifndef V8_ALLOW_ACCESS_TO_RAW_HANDLE_CONSTRUCTOR
|
|
|
| private:
|
| @@ -359,11 +339,10 @@ template <class T> class Handle {
|
| * Creates a new handle for the specified value.
|
| */
|
| V8_INLINE(explicit Handle(T* val)) : val_(val) {}
|
| -#endif
|
|
|
| private:
|
| friend class Utils;
|
| - template<class F> friend class Persistent;
|
| + template<class F, class M> friend class Persistent;
|
| template<class F> friend class Local;
|
| friend class Arguments;
|
| template<class F> friend class FunctionCallbackInfo;
|
| @@ -377,9 +356,7 @@ template <class T> class Handle {
|
| friend class Context;
|
| friend class HandleScope;
|
|
|
| -#ifndef V8_USE_UNSAFE_HANDLES
|
| V8_INLINE(static Handle<T> New(Isolate* isolate, T* that));
|
| -#endif
|
|
|
| T* val_;
|
| };
|
| @@ -407,10 +384,6 @@ template <class T> class Local : public Handle<T> {
|
| }
|
|
|
|
|
| -#ifdef V8_USE_UNSAFE_HANDLES
|
| - template <class S> V8_INLINE(Local(S* that) : Handle<T>(that)) { }
|
| -#endif
|
| -
|
| template <class S> V8_INLINE(static Local<T> Cast(Local<S> that)) {
|
| #ifdef V8_ENABLE_CHECKS
|
| // If we're going to perform the type check then we have to check
|
| @@ -419,12 +392,10 @@ template <class T> class Local : public Handle<T> {
|
| #endif
|
| return Local<T>(T::Cast(*that));
|
| }
|
| -#ifndef V8_USE_UNSAFE_HANDLES
|
| template <class S> V8_INLINE(Local(Handle<S> that))
|
| : Handle<T>(reinterpret_cast<T*>(*that)) {
|
| TYPE_CHECK(T, S);
|
| }
|
| -#endif
|
|
|
| template <class S> V8_INLINE(Local<S> As()) {
|
| return Local<S>::Cast(*this);
|
| @@ -437,20 +408,19 @@ template <class T> class Local : public Handle<T> {
|
| */
|
| V8_INLINE(static Local<T> New(Handle<T> that));
|
| V8_INLINE(static Local<T> New(Isolate* isolate, Handle<T> that));
|
| -#ifndef V8_USE_UNSAFE_HANDLES
|
| - // TODO(dcarney): remove before cutover
|
| - V8_INLINE(static Local<T> New(Isolate* isolate, const Persistent<T>& that));
|
| + template<class M>
|
| + V8_INLINE(static Local<T> New(Isolate* isolate,
|
| + const Persistent<T, M>& that));
|
|
|
| #ifndef V8_ALLOW_ACCESS_TO_RAW_HANDLE_CONSTRUCTOR
|
|
|
| private:
|
| #endif
|
| template <class S> V8_INLINE(Local(S* that) : Handle<T>(that)) { }
|
| -#endif
|
|
|
| private:
|
| friend class Utils;
|
| - template<class F> friend class Persistent;
|
| + template<class F, class M> friend class Persistent;
|
| template<class F> friend class Handle;
|
| friend class Arguments;
|
| template<class F> friend class FunctionCallbackInfo;
|
| @@ -465,117 +435,150 @@ template <class T> class Local : public Handle<T> {
|
| V8_INLINE(static Local<T> New(Isolate* isolate, T* that));
|
| };
|
|
|
| -/**
|
| - * 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
|
| - * allocated, a Persistent handle remains valid until it is explicitly
|
| - * disposed.
|
| - *
|
| - * A persistent handle contains a reference to a storage cell within
|
| - * the v8 engine which holds an object value and which is updated by
|
| - * the garbage collector whenever the object is moved. A new storage
|
| - * cell can be created using Persistent::New and existing handles can
|
| - * be disposed using Persistent::Dispose. Since persistent handles
|
| - * are passed by value you may have many persistent handle objects
|
| - * that point to the same storage cell. For instance, if you pass a
|
| - * persistent handle as an argument to a function you will not get two
|
| - * different storage cells but rather two references to the same
|
| - * storage cell.
|
| - */
|
| -template <class T> class Persistent // NOLINT
|
| -#ifdef V8_USE_UNSAFE_HANDLES
|
| - : public Handle<T> {
|
| -#else
|
| - { // NOLINT
|
| -#endif
|
| +
|
| +// TODO(dcarney): better name
|
| +template<class P>
|
| +class PersistentData {
|
| public:
|
| -#ifndef V8_USE_UNSAFE_HANDLES
|
| - V8_INLINE(Persistent()) : val_(0) { }
|
| - // TODO(dcarney): add this back before cutover.
|
| -// V8_INLINE(~Persistent()) {
|
| -// Dispose();
|
| -// }
|
| - V8_INLINE(bool IsEmpty() const) { return val_ == 0; }
|
| - // TODO(dcarney): remove somehow before cutover
|
| - // The handle should either be 0, or a pointer to a live cell.
|
| - V8_INLINE(void Clear()) { val_ = 0; }
|
| + // TODO(dcarney): fill out implementation
|
| + V8_INLINE(bool IsWeak());
|
| + V8_INLINE(bool IsIndependent());
|
| + V8_INLINE(P* GetParameter());
|
| + private:
|
| + uint8_t flags_;
|
| + P* parameter_;
|
| +};
|
|
|
| - /**
|
| - * A constructor that creates a new global cell pointing to that. In contrast
|
| - * to the copy constructor, this creates a new persistent handle which needs
|
| - * to be separately disposed.
|
| - */
|
| - template <class S> V8_INLINE(Persistent(Isolate* isolate, Handle<S> that))
|
| - : val_(New(isolate, *that)) { }
|
|
|
| - template <class S> V8_INLINE(Persistent(Isolate* isolate,
|
| - Persistent<S>& that)) // NOLINT
|
| - : val_(New(isolate, *that)) { }
|
| +template<typename T,
|
| + typename P,
|
| + typename M = NonCopyablePersistentModifier<T, void> >
|
| +class WeakReferenceCallbacks {
|
| + public:
|
| + typedef void (*Revivable)(Isolate* isolate,
|
| + Persistent<T, M>* object,
|
| + P* parameter);
|
| + // TODO(dcarney): better name
|
| + typedef void NewCallbackName(const WeakCallbackObject<T, P> &);
|
| +};
|
|
|
| -#else
|
| - /**
|
| - * Creates an empty persistent handle that doesn't point to any
|
| - * storage cell.
|
| - */
|
| - V8_INLINE(Persistent()) : Handle<T>() { }
|
|
|
| - /**
|
| - * Creates a persistent handle for the same storage cell as the
|
| - * specified handle. This constructor allows you to pass persistent
|
| - * handles as arguments by value and to assign between persistent
|
| - * handles. However, attempting to assign between incompatible
|
| - * persistent handles, for instance from a Persistent<String> to a
|
| - * Persistent<Number> will cause a compile-time error. Assigning
|
| - * between compatible persistent handles, for instance assigning a
|
| - * Persistent<String> to a variable declared as Persistent<Value>,
|
| - * is allowed as String is a subclass of Value.
|
| - */
|
| - template <class S> V8_INLINE(Persistent(Persistent<S> that))
|
| - : Handle<T>(reinterpret_cast<T*>(*that)) {
|
| - /**
|
| - * This check fails when trying to convert between incompatible
|
| - * handles. For example, converting from a Handle<String> to a
|
| - * Handle<Number>.
|
| - */
|
| - TYPE_CHECK(T, S);
|
| +// TODO(dcarney): better name
|
| +template<class T, class P>
|
| +class WeakCallbackObject {
|
| + public:
|
| + // TODO(dcarney): getters, make members private, etc
|
| + Isolate* isolate_;
|
| + // 'handle' for the persistent cell
|
| + // stack allocated
|
| + // not handle scoped
|
| + Handle<T> handle_;
|
| + const PersistentData<P>& data_;
|
| +};
|
| +
|
| +
|
| +// TODO(dcarney): better name
|
| +// this class should make persistent mimic current behaviour
|
| +template<class T, class P>
|
| +class NonCopyablePersistentModifier {
|
| + typedef Persistent<T, NonCopyablePersistentModifier<T, P> > MyPersistent;
|
| + // TODO(dcarney): come up with a good compile error here.
|
| + template<class O>
|
| + V8_INLINE(static void Uncompilable()) {
|
| + TYPE_CHECK(O, Primitive);
|
| + }
|
| +
|
| + public:
|
| + typedef P WeakParameter;
|
| + // This will be called on copy and assign
|
| + // in the case the handle is non-empty
|
| + V8_INLINE(static void Initialize(const PersistentData<P>& data,
|
| + MyPersistent* persistent)) {
|
| + Uncompilable<Object>();
|
| + }
|
| + // This will be called on move constructors
|
| + // in the case the handle is non-empty
|
| + V8_INLINE(static void Move(P** parameter)) {
|
| + Uncompilable<Object>();
|
| }
|
| + // TODO(dcarney): have a static WeakDispose that gc can check against
|
| + // This will be called in the first sweep to determine if
|
| + // the persistent can be disposed early
|
| + static MyPersistent* WeakDispose(P* parameter) {
|
| + return NULL;
|
| + }
|
| + // TODO(dcarney): remove this
|
| + V8_INLINE(static bool AutoDispose()) { return false; }
|
| +};
|
|
|
| - template <class S> V8_INLINE(Persistent(S* that)) : Handle<T>(that) { }
|
|
|
| - /**
|
| - * A constructor that creates a new global cell pointing to that. In contrast
|
| - * to the copy constructor, this creates a new persistent handle which needs
|
| - * to be separately disposed.
|
| - */
|
| +// TODO(dcarney): new comments
|
| +// M is 'Modifier' - the templated class that
|
| +// can deal with copying and moving the weak parameter
|
| +template <class T, class M> class Persistent {
|
| + public:
|
| + typedef typename M::WeakParameter WeakParameter;
|
| + // normal constructors
|
| + V8_INLINE(Persistent()) : val_(0) { }
|
| template <class S> V8_INLINE(Persistent(Isolate* isolate, Handle<S> that))
|
| - : Handle<T>(New(isolate, that)) { }
|
| + : val_(New(isolate, *that)) { }
|
| + template <class S, class M2>
|
| + V8_INLINE(Persistent(Isolate* isolate,
|
| + const Persistent<S, M2>& that))
|
| + : val_(New(that)) { }
|
| + // destructor
|
| + V8_INLINE(~Persistent()) {
|
| + // TODO(dcarney): Remove this check. Always dispose.
|
| + if (M::AutoDispose()) Reset();
|
| + }
|
| + // copy and assign operators
|
| + // Duplicate the storage cell and reinitialize
|
| + V8_INLINE(Persistent(const Persistent& that)) : val_(0) {
|
| + Copy(that);
|
| + }
|
| + V8_INLINE(Persistent& operator=(const Persistent& that)) { // NOLINT
|
| + Copy(that);
|
| + return *this;
|
| + }
|
|
|
| + // TODO(dcarney): move into private section at bottom
|
| + private:
|
| + template<class S, class M2>
|
| + V8_INLINE(void Copy(const Persistent<S, M2>& that)) {
|
| + // TODO(dcarney): New and Copy can be one function
|
| + this->val_ = New(that);
|
| + if (this->val_ == NULL) return;
|
| + const PersistentData<typename M2::WeakParameter>& data = that.GetData();
|
| + M::template Initialize<typename M2::WeakParameter>(data, this);
|
| + }
|
| + template<class S, class M2>
|
| + V8_INLINE(static T* New(const Persistent<S, M2>& that));
|
| + // TODO(dcarney): implement
|
| + // maybe this can return a reference into
|
| + // part of GlobalHandle::Node
|
| + // it needs to be inlined, and preferably pretty fast
|
| + const PersistentData<WeakParameter>& GetData();
|
| +
|
| + public:
|
| /**
|
| - * "Casts" a plain handle which is known to be a persistent handle
|
| - * to a persistent handle.
|
| + * Disposes the current contents of the handle and replaces it.
|
| */
|
| - template <class S> explicit V8_INLINE(Persistent(Handle<S> that))
|
| - : Handle<T>(*that) { }
|
| -
|
| -#endif
|
| -
|
| -#ifdef V8_USE_UNSAFE_HANDLES
|
| - template <class S> V8_INLINE(static Persistent<T> Cast(Persistent<S> that)) {
|
| -#ifdef V8_ENABLE_CHECKS
|
| - // If we're going to perform the type check then we have to check
|
| - // that the handle isn't empty before doing the checked cast.
|
| - if (that.IsEmpty()) return Persistent<T>();
|
| -#endif
|
| - return Persistent<T>(T::Cast(*that));
|
| + V8_INLINE(void Reset()) {
|
| + Dispose();
|
| }
|
| + V8_INLINE(void Reset(Isolate* isolate, const Handle<T>& other));
|
| + template <class M2>
|
| + V8_INLINE(void Reset(Isolate* isolate, const Persistent<T, M2>& other));
|
| + // TODO(dcarney): deprecate
|
| + V8_INLINE(void Dispose());
|
| + // TODO(dcarney): deprecate
|
| + V8_INLINE(void Dispose(Isolate* isolate)) { Dispose(); }
|
|
|
| - template <class S> V8_INLINE(Persistent<S> As()) {
|
| - return Persistent<S>::Cast(*this);
|
| - }
|
| + V8_INLINE(bool IsEmpty() const) { return val_ == 0; }
|
|
|
| -#else
|
| + // TODO(dcarney): this is pretty useless, fix or remove
|
| template <class S>
|
| - V8_INLINE(static Persistent<T>& Cast(Persistent<S>& that)) { // NOLINT
|
| + static V8_INLINE(Persistent<T>& Cast(Persistent<S>& that)) { // NOLINT
|
| #ifdef V8_ENABLE_CHECKS
|
| // If we're going to perform the type check then we have to check
|
| // that the handle isn't empty before doing the checked cast.
|
| @@ -584,20 +587,13 @@ template <class T> class Persistent // NOLINT
|
| return reinterpret_cast<Persistent<T>&>(that);
|
| }
|
|
|
| + // TODO(dcarney): this is pretty useless, fix or remove
|
| template <class S> V8_INLINE(Persistent<S>& As()) { // NOLINT
|
| return Persistent<S>::Cast(*this);
|
| }
|
| -#endif
|
| -
|
| -#ifdef V8_USE_UNSAFE_HANDLES
|
| - V8_DEPRECATED(static Persistent<T> New(Handle<T> that));
|
| - V8_INLINE(static Persistent<T> New(Isolate* isolate, Handle<T> that));
|
| - V8_INLINE(static Persistent<T> New(Isolate* isolate, Persistent<T> that));
|
| -#endif
|
|
|
| -#ifndef V8_USE_UNSAFE_HANDLES
|
| - template <class S> V8_INLINE(
|
| - bool operator==(const Persistent<S>& that) const) {
|
| + template <class S, class M2> V8_INLINE(
|
| + bool operator==(const Persistent<S, M2>& that) const) {
|
| internal::Object** a = reinterpret_cast<internal::Object**>(**this);
|
| internal::Object** b = reinterpret_cast<internal::Object**>(*that);
|
| if (a == 0) return b == 0;
|
| @@ -605,53 +601,53 @@ template <class T> class Persistent // NOLINT
|
| return *a == *b;
|
| }
|
|
|
| - template <class S> V8_INLINE(bool operator==(const Handle<S> that) const) {
|
| + template <class S>
|
| + V8_INLINE(bool operator==(const Handle<S> that) const) {
|
| internal::Object** a = reinterpret_cast<internal::Object**>(**this);
|
| internal::Object** b = reinterpret_cast<internal::Object**>(*that);
|
| if (a == 0) return b == 0;
|
| if (b == 0) return false;
|
| return *a == *b;
|
| }
|
| -#endif
|
|
|
| - V8_INLINE(void Dispose());
|
| + // New weak callbacks
|
| + // must be able to static_cast P into P2
|
| + // TODO(dcarney): implement
|
| + template<typename P2>
|
| + V8_INLINE(void MakeWeak(
|
| + P2* parameters,
|
| + typename WeakReferenceCallbacks<T, P2>::NewCallbackName callback));
|
|
|
| - /**
|
| - * Releases the storage cell referenced by this persistent handle.
|
| - * Does not remove the reference to the cell from any handles.
|
| - * This handle's reference, and any other references to the storage
|
| - * cell remain and IsEmpty will still return false.
|
| - */
|
| - // TODO(dcarney): deprecate
|
| - V8_INLINE(void Dispose(Isolate* isolate)) { Dispose(); }
|
| + // Use a weak callback defined in M
|
| + V8_INLINE(void MakeWeak(WeakParameter* parameters)) {
|
| + MakeWeak<WeakParameter>(parameters, M::WeakCallback);
|
| + }
|
|
|
| - /**
|
| - * Make the reference to this object weak. When only weak handles
|
| - * refer to the object, the garbage collector will perform a
|
| - * callback to the given V8::NearDeathCallback function, passing
|
| - * it the object reference and the given parameters.
|
| - */
|
| - template<typename S, typename P>
|
| + // must be able to static_cast P into P2
|
| + // TODO(dcarney): deprecate
|
| + template<typename S, typename P2>
|
| V8_INLINE(void MakeWeak(
|
| - P* parameters,
|
| - typename WeakReferenceCallbacks<S, P>::Revivable callback));
|
| + P2* parameters,
|
| + typename WeakReferenceCallbacks<S, P2>::Revivable callback));
|
|
|
| - template<typename P>
|
| + // must be able to static_cast P into P2
|
| + // TODO(dcarney): deprecate
|
| + template<typename P2>
|
| V8_INLINE(void MakeWeak(
|
| - P* parameters,
|
| - typename WeakReferenceCallbacks<T, P>::Revivable callback));
|
| + P2* parameters,
|
| + typename WeakReferenceCallbacks<T, P2>::Revivable callback));
|
|
|
| - template<typename S, typename P>
|
| + template<typename S, typename P2>
|
| V8_DEPRECATED(void MakeWeak(
|
| Isolate* isolate,
|
| - P* parameters,
|
| - typename WeakReferenceCallbacks<S, P>::Revivable callback));
|
| + P2* parameters,
|
| + typename WeakReferenceCallbacks<S, P2>::Revivable callback));
|
|
|
| - template<typename P>
|
| + template<typename P2>
|
| V8_DEPRECATED(void MakeWeak(
|
| Isolate* isolate,
|
| - P* parameters,
|
| - typename WeakReferenceCallbacks<T, P>::Revivable callback));
|
| + P2* parameters,
|
| + typename WeakReferenceCallbacks<T, P2>::Revivable callback));
|
|
|
| V8_INLINE(void ClearWeak());
|
|
|
| @@ -725,68 +721,36 @@ template <class T> class Persistent // NOLINT
|
| return WrapperClassId();
|
| }
|
|
|
| - /**
|
| - * Disposes the current contents of the handle and replaces it.
|
| - */
|
| - V8_INLINE(void Reset(Isolate* isolate, const Handle<T>& other));
|
| -
|
| -#ifndef V8_USE_UNSAFE_HANDLES
|
| - V8_INLINE(void Reset(Isolate* isolate, const Persistent<T>& other));
|
| -#endif
|
| -
|
| - /**
|
| - * Returns the underlying raw pointer and clears the handle. The caller is
|
| - * responsible of eventually destroying the underlying object (by creating a
|
| - * Persistent handle which points to it and Disposing it). In the future,
|
| - * destructing a Persistent will also Dispose it. With this function, the
|
| - * embedder can let the Persistent go out of scope without it getting
|
| - * disposed.
|
| - */
|
| + // TODO(dcarney): remove
|
| V8_INLINE(T* ClearAndLeak());
|
|
|
| -#ifndef V8_USE_UNSAFE_HANDLES
|
| -
|
| - private:
|
| - // TODO(dcarney): make unlinkable before cutover
|
| - V8_INLINE(Persistent(const Persistent& that)) : val_(that.val_) {}
|
| - // TODO(dcarney): make unlinkable before cutover
|
| - V8_INLINE(Persistent& operator=(const Persistent& that)) { // NOLINT
|
| - this->val_ = that.val_;
|
| - return *this;
|
| - }
|
| + // TODO(dcarney) make private or remove
|
| + // Only the garbage collector should do this,
|
| + // and it can just change val_ directly
|
| + // could temporarily just assert that the node is disposed
|
| + V8_INLINE(void Clear()) { val_ = 0; }
|
|
|
| - public:
|
| + // TODO(dcarney): remove need for this in chrome
|
| #ifndef V8_ALLOW_ACCESS_TO_RAW_HANDLE_CONSTRUCTOR
|
|
|
| private:
|
| #endif
|
| - // TODO(dcarney): remove before cutover
|
| template <class S> V8_INLINE(Persistent(S* that)) : val_(that) { }
|
|
|
| - // TODO(dcarney): remove before cutover
|
| V8_INLINE(T* operator*() const) { return val_; }
|
|
|
| private:
|
| - // TODO(dcarney): remove before cutover
|
| - V8_INLINE(T* operator->() const) { return val_; }
|
| - public:
|
| -#endif
|
| -
|
| - private:
|
| friend class Utils;
|
| template<class F> friend class Handle;
|
| template<class F> friend class Local;
|
| - template<class F> friend class Persistent;
|
| + template<class F1, class F2> friend class Persistent;
|
| template<class F> friend class ReturnValue;
|
|
|
| V8_INLINE(static T* New(Isolate* isolate, T* that));
|
|
|
| -#ifndef V8_USE_UNSAFE_HANDLES
|
| T* val_;
|
| -#endif
|
| };
|
|
|
| -
|
| /**
|
| * A stack-allocated class that governs a number of local handles.
|
| * After a handle scope has been created, all local handles will be
|
| @@ -4630,7 +4594,7 @@ class V8EXPORT V8 {
|
|
|
| template <class T> friend class Handle;
|
| template <class T> friend class Local;
|
| - template <class T> friend class Persistent;
|
| + template <class T, class M> friend class Persistent;
|
| friend class Context;
|
| };
|
|
|
| @@ -4968,11 +4932,7 @@ class V8EXPORT Context {
|
| }
|
| // TODO(dcarney): deprecate
|
| V8_INLINE(Scope(Isolate* isolate, Persistent<Context>& context)) // NOLINT
|
| -#ifndef V8_USE_UNSAFE_HANDLES
|
| : context_(Handle<Context>::New(isolate, context)) {
|
| -#else
|
| - : context_(Local<Context>::New(isolate, context)) {
|
| -#endif
|
| context_->Enter();
|
| }
|
| V8_INLINE(~Scope()) { context_->Exit(); }
|
| @@ -5458,9 +5418,9 @@ Local<T> Local<T>::New(Isolate* isolate, Handle<T> that) {
|
| return New(isolate, that.val_);
|
| }
|
|
|
| -#ifndef V8_USE_UNSAFE_HANDLES
|
| template <class T>
|
| -Local<T> Local<T>::New(Isolate* isolate, const Persistent<T>& that) {
|
| +template <class M>
|
| +Local<T> Local<T>::New(Isolate* isolate, const Persistent<T, M>& that) {
|
| return New(isolate, that.val_);
|
| }
|
|
|
| @@ -5472,7 +5432,6 @@ Handle<T> Handle<T>::New(Isolate* isolate, T* that) {
|
| return Handle<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(
|
| reinterpret_cast<internal::Isolate*>(isolate), *p)));
|
| }
|
| -#endif
|
|
|
|
|
| template <class T>
|
| @@ -5485,27 +5444,8 @@ Local<T> Local<T>::New(Isolate* isolate, T* that) {
|
| }
|
|
|
|
|
| -#ifdef V8_USE_UNSAFE_HANDLES
|
| -template <class T>
|
| -Persistent<T> Persistent<T>::New(Handle<T> that) {
|
| - return New(Isolate::GetCurrent(), that.val_);
|
| -}
|
| -
|
| -
|
| -template <class T>
|
| -Persistent<T> Persistent<T>::New(Isolate* isolate, Handle<T> that) {
|
| - return New(Isolate::GetCurrent(), that.val_);
|
| -}
|
| -
|
| -template <class T>
|
| -Persistent<T> Persistent<T>::New(Isolate* isolate, Persistent<T> that) {
|
| - return New(Isolate::GetCurrent(), that.val_);
|
| -}
|
| -#endif
|
| -
|
| -
|
| -template <class T>
|
| -T* Persistent<T>::New(Isolate* isolate, T* that) {
|
| +template <class T, class M>
|
| +T* Persistent<T, M>::New(Isolate* isolate, T* that) {
|
| if (that == NULL) return NULL;
|
| internal::Object** p = reinterpret_cast<internal::Object**>(that);
|
| return reinterpret_cast<T*>(
|
| @@ -5514,8 +5454,20 @@ T* Persistent<T>::New(Isolate* isolate, T* that) {
|
| }
|
|
|
|
|
| -template <class T>
|
| -bool Persistent<T>::IsIndependent() const {
|
| +template <class T, class M>
|
| +template<class S, class M2>
|
| +T* Persistent<T, M>::New(const Persistent<S, M2>& that) {
|
| + if (*that == NULL) return NULL;
|
| + // TODO(dcarney): implement this correctly,
|
| + // isolate is available in GlobalHandles::Node, get it from there
|
| + // This should not be like current new but should copy everything
|
| + // over
|
| + return New(Isolate::GetCurrent(), *that);
|
| +}
|
| +
|
| +
|
| +template <class T, class M>
|
| +bool Persistent<T, M>::IsIndependent() const {
|
| typedef internal::Internals I;
|
| if (this->IsEmpty()) return false;
|
| return I::GetNodeFlag(reinterpret_cast<internal::Object**>(this->val_),
|
| @@ -5523,8 +5475,8 @@ bool Persistent<T>::IsIndependent() const {
|
| }
|
|
|
|
|
| -template <class T>
|
| -bool Persistent<T>::IsNearDeath() const {
|
| +template <class T, class M>
|
| +bool Persistent<T, M>::IsNearDeath() const {
|
| typedef internal::Internals I;
|
| if (this->IsEmpty()) return false;
|
| return I::GetNodeState(reinterpret_cast<internal::Object**>(this->val_)) ==
|
| @@ -5532,8 +5484,8 @@ bool Persistent<T>::IsNearDeath() const {
|
| }
|
|
|
|
|
| -template <class T>
|
| -bool Persistent<T>::IsWeak() const {
|
| +template <class T, class M>
|
| +bool Persistent<T, M>::IsWeak() const {
|
| typedef internal::Internals I;
|
| if (this->IsEmpty()) return false;
|
| return I::GetNodeState(reinterpret_cast<internal::Object**>(this->val_)) ==
|
| @@ -5541,19 +5493,17 @@ bool Persistent<T>::IsWeak() const {
|
| }
|
|
|
|
|
| -template <class T>
|
| -void Persistent<T>::Dispose() {
|
| +template <class T, class M>
|
| +void Persistent<T, M>::Dispose() {
|
| if (this->IsEmpty()) return;
|
| V8::DisposeGlobal(reinterpret_cast<internal::Object**>(this->val_));
|
| -#ifndef V8_USE_UNSAFE_HANDLES
|
| val_ = 0;
|
| -#endif
|
| }
|
|
|
|
|
| -template <class T>
|
| +template <class T, class M>
|
| template <typename S, typename P>
|
| -void Persistent<T>::MakeWeak(
|
| +void Persistent<T, M>::MakeWeak(
|
| P* parameters,
|
| typename WeakReferenceCallbacks<S, P>::Revivable callback) {
|
| TYPE_CHECK(S, T);
|
| @@ -5564,18 +5514,18 @@ void Persistent<T>::MakeWeak(
|
| }
|
|
|
|
|
| -template <class T>
|
| +template <class T, class M>
|
| template <typename P>
|
| -void Persistent<T>::MakeWeak(
|
| +void Persistent<T, M>::MakeWeak(
|
| P* parameters,
|
| typename WeakReferenceCallbacks<T, P>::Revivable callback) {
|
| MakeWeak<T, P>(parameters, callback);
|
| }
|
|
|
|
|
| -template <class T>
|
| +template <class T, class M>
|
| template <typename S, typename P>
|
| -void Persistent<T>::MakeWeak(
|
| +void Persistent<T, M>::MakeWeak(
|
| Isolate* isolate,
|
| P* parameters,
|
| typename WeakReferenceCallbacks<S, P>::Revivable callback) {
|
| @@ -5583,9 +5533,9 @@ void Persistent<T>::MakeWeak(
|
| }
|
|
|
|
|
| -template <class T>
|
| +template <class T, class M>
|
| template<typename P>
|
| -void Persistent<T>::MakeWeak(
|
| +void Persistent<T, M>::MakeWeak(
|
| Isolate* isolate,
|
| P* parameters,
|
| typename WeakReferenceCallbacks<T, P>::Revivable callback) {
|
| @@ -5593,14 +5543,14 @@ void Persistent<T>::MakeWeak(
|
| }
|
|
|
|
|
| -template <class T>
|
| -void Persistent<T>::ClearWeak() {
|
| +template <class T, class M>
|
| +void Persistent<T, M>::ClearWeak() {
|
| V8::ClearWeak(reinterpret_cast<internal::Object**>(this->val_));
|
| }
|
|
|
|
|
| -template <class T>
|
| -void Persistent<T>::MarkIndependent() {
|
| +template <class T, class M>
|
| +void Persistent<T, M>::MarkIndependent() {
|
| typedef internal::Internals I;
|
| if (this->IsEmpty()) return;
|
| I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(this->val_),
|
| @@ -5609,8 +5559,8 @@ void Persistent<T>::MarkIndependent() {
|
| }
|
|
|
|
|
| -template <class T>
|
| -void Persistent<T>::MarkPartiallyDependent() {
|
| +template <class T, class M>
|
| +void Persistent<T, M>::MarkPartiallyDependent() {
|
| typedef internal::Internals I;
|
| if (this->IsEmpty()) return;
|
| I::UpdateNodeFlag(reinterpret_cast<internal::Object**>(this->val_),
|
| @@ -5619,12 +5569,9 @@ void Persistent<T>::MarkPartiallyDependent() {
|
| }
|
|
|
|
|
| -template <class T>
|
| -void Persistent<T>::Reset(Isolate* isolate, const Handle<T>& other) {
|
| - Dispose(isolate);
|
| -#ifdef V8_USE_UNSAFE_HANDLES
|
| - *this = *New(isolate, other);
|
| -#else
|
| +template <class T, class M>
|
| +void Persistent<T, M>::Reset(Isolate* isolate, const Handle<T>& other) {
|
| + Dispose();
|
| if (other.IsEmpty()) {
|
| this->val_ = NULL;
|
| return;
|
| @@ -5632,13 +5579,13 @@ void Persistent<T>::Reset(Isolate* isolate, const Handle<T>& other) {
|
| internal::Object** p = reinterpret_cast<internal::Object**>(other.val_);
|
| this->val_ = reinterpret_cast<T*>(
|
| V8::GlobalizeReference(reinterpret_cast<internal::Isolate*>(isolate), p));
|
| -#endif
|
| }
|
|
|
|
|
| -#ifndef V8_USE_UNSAFE_HANDLES
|
| -template <class T>
|
| -void Persistent<T>::Reset(Isolate* isolate, const Persistent<T>& other) {
|
| +template <class T, class M>
|
| +template <class M2>
|
| +void Persistent<T, M>::Reset(Isolate* isolate,
|
| + const Persistent<T, M2>& other) {
|
| Dispose(isolate);
|
| if (other.IsEmpty()) {
|
| this->val_ = NULL;
|
| @@ -5648,25 +5595,19 @@ void Persistent<T>::Reset(Isolate* isolate, const Persistent<T>& other) {
|
| this->val_ = reinterpret_cast<T*>(
|
| V8::GlobalizeReference(reinterpret_cast<internal::Isolate*>(isolate), p));
|
| }
|
| -#endif
|
|
|
|
|
| -template <class T>
|
| -T* Persistent<T>::ClearAndLeak() {
|
| +template <class T, class M>
|
| +T* Persistent<T, M>::ClearAndLeak() {
|
| T* old;
|
| -#ifdef V8_USE_UNSAFE_HANDLES
|
| - old = **this;
|
| - *this = Persistent<T>();
|
| -#else
|
| old = val_;
|
| val_ = NULL;
|
| -#endif
|
| return old;
|
| }
|
|
|
|
|
| -template <class T>
|
| -void Persistent<T>::SetWrapperClassId(uint16_t class_id) {
|
| +template <class T, class M>
|
| +void Persistent<T, M>::SetWrapperClassId(uint16_t class_id) {
|
| typedef internal::Internals I;
|
| if (this->IsEmpty()) return;
|
| internal::Object** obj = reinterpret_cast<internal::Object**>(this->val_);
|
| @@ -5675,8 +5616,8 @@ void Persistent<T>::SetWrapperClassId(uint16_t class_id) {
|
| }
|
|
|
|
|
| -template <class T>
|
| -uint16_t Persistent<T>::WrapperClassId() const {
|
| +template <class T, class M>
|
| +uint16_t Persistent<T, M>::WrapperClassId() const {
|
| typedef internal::Internals I;
|
| if (this->IsEmpty()) return 0;
|
| internal::Object** obj = reinterpret_cast<internal::Object**>(this->val_);
|
|
|