V8_INLINE void SetWeak(P* parameter,
                         typename WeakCallbackInfo::Callback callback,
                         WeakCallbackType type);
  /**
   * Turns this handle into a weak phantom handle without finalization callback.
   * The handle will be reset automatically when the garbage collector detects
   * that the object is no longer reachable.
   * A related function Isolate::NumberOfPhantomHandleResetsSinceLastCall
   * returns how many phantom handles were reset by the garbage collector.
   */
  V8_INLINE void SetWeak();
  template
  V8_INLINE P* ClearWeak();
  // TODO(dcarney): remove this.
  V8_INLINE void ClearWeak() { ClearWeak(); }
  /**
   * Annotates the strong handle with the given label, which is then used by the
   * heap snapshot generator as a name of the edge from the root to the handle.
   * The function does not take ownership of the label and assumes that the
   * label is valid as long as the handle is valid.
   */
  V8_INLINE void AnnotateStrongRetainer(const char* label);
  /**
   * Allows the embedder to tell the v8 garbage collector that a certain object
   * is alive. Only allowed when the embedder is asked to trace its heap by
   * EmbedderHeapTracer.
   */
  V8_DEPRECATED(
      "Used TracedGlobal and EmbedderHeapTracer::RegisterEmbedderReference",
      V8_INLINE void RegisterExternalReference(Isolate* isolate) const);
  /**
   * Marks the reference to this object independent. Garbage collector is free
   * to ignore any object groups containing this object. Weak callback for an
   * independent handle should not assume that it will be preceded by a global
   * GC prologue callback or followed by a global GC epilogue callback.
   */
  V8_DEPRECATED(
      "Weak objects are always considered independent. "
      "Use TracedGlobal when trying to use EmbedderHeapTracer. "
      "Use a strong handle when trying to keep an object alive.",
      V8_INLINE void MarkIndependent());
  /**
   * Marks the reference to this object as active. The scavenge garbage
   * collection should not reclaim the objects marked as active, even if the
   * object held by the handle is otherwise unreachable.
   *
   * This bit is cleared after the each garbage collection pass.
   */
  V8_DEPRECATED("Use TracedGlobal.", V8_INLINE void MarkActive());
  V8_DEPRECATED("See MarkIndependent.", V8_INLINE bool IsIndependent() const);
  /** Returns true if the handle's reference is weak.  */
  V8_INLINE bool IsWeak() const;
  /**
   * Assigns a wrapper class ID to the handle.
   */
  V8_INLINE void SetWrapperClassId(uint16_t class_id);
  /**
   * Returns the class ID previously assigned to this handle or 0 if no class ID
   * was previously assigned.
   */
  V8_INLINE uint16_t WrapperClassId() const;
  PersistentBase(const PersistentBase& other) = delete;  // NOLINT
  void operator=(const PersistentBase&) = delete;
 private:
  friend class Isolate;
  friend class Utils;
  template friend class Local;
  template friend class Persistent;
  template 
  friend class Global;
  template friend class PersistentBase;
  template friend class ReturnValue;
  template 
  friend class PersistentValueMapBase;
  template friend class PersistentValueVector;
  friend class Object;
  explicit V8_INLINE PersistentBase(T* val) : val_(val) {}
  V8_INLINE static T* New(Isolate* isolate, T* that);
  T* val_;
};
/**
 * Default traits for Persistent. This class does not allow
 * use of the copy constructor or assignment operator.
 * At present kResetInDestructor is not set, but that will change in a future
 * version.
 */
template
class NonCopyablePersistentTraits {
 public:
  typedef Persistent > NonCopyablePersistent;
  static const bool kResetInDestructor = false;
  template
  V8_INLINE static void Copy(const Persistent& source,
                             NonCopyablePersistent* dest) {
    Uncompilable