]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - heap/Weak.h
JavaScriptCore-7600.1.4.13.1.tar.gz
[apple/javascriptcore.git] / heap / Weak.h
index 0938249b8b0223247d4824e2c06aedab1bd9c671..80cdbd82c66d6204e0838087ebb47c661e6b54b7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009, 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2009, 2012, 2013 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 #ifndef Weak_h
 #define Weak_h
 
-#include <wtf/Assertions.h>
-#include "PassWeak.h"
-#include "WeakSetInlines.h"
+#include <cstddef>
+#include <wtf/Noncopyable.h>
 
 namespace JSC {
 
-template<typename T> class Weak : public WeakImplAccessor<Weak<T>, T> {
+class WeakImpl;
+class WeakHandleOwner;
+
+// This is a free function rather than a Weak<T> member function so we can put it in Weak.cpp.
+JS_EXPORT_PRIVATE void weakClearSlowCase(WeakImpl*&);
+
+template<typename T> class Weak {
     WTF_MAKE_NONCOPYABLE(Weak);
 public:
-    friend class WeakImplAccessor<Weak<T>, T>;
-    typedef typename WeakImplAccessor<Weak<T>, T>::GetType GetType;
+    Weak()
+        : m_impl(0)
+    {
+    }
+
+    Weak(std::nullptr_t)
+        : m_impl(0)
+    {
+    }
 
-    Weak();
-    Weak(std::nullptr_t);
-    Weak(GetType, WeakHandleOwner* = 0, void* context = 0);
+    Weak(T*, WeakHandleOwner* = 0, void* context = 0);
 
     enum HashTableDeletedValueTag { HashTableDeletedValue };
     bool isHashTableDeletedValue() const;
     Weak(HashTableDeletedValueTag);
 
-    template<typename U> Weak(const PassWeak<U>&);
+    Weak(Weak&&);
 
-    ~Weak();
+    ~Weak()
+    {
+        clear();
+    }
 
     void swap(Weak&);
-    Weak& operator=(const PassWeak<T>&);
-    
+
+    Weak& operator=(Weak&&);
+
     bool operator!() const;
+    T* operator->() const;
+    T& operator*() const;
+    T* get() const;
+
+    bool was(T*) const;
 
     // This conversion operator allows implicit conversion to bool but not to other integer types.
-    typedef JSValue (HandleBase::*UnspecifiedBoolType);
+    typedef void* (Weak::*UnspecifiedBoolType);
     operator UnspecifiedBoolType*() const;
 
-    PassWeak<T> release();
-    void clear();
+    WeakImpl* leakImpl() WARN_UNUSED_RETURN;
+    void clear()
+    {
+        if (!m_impl)
+            return;
+        weakClearSlowCase(m_impl);
+    }
     
 private:
     static WeakImpl* hashTableDeletedValue();
@@ -68,114 +92,6 @@ private:
     WeakImpl* m_impl;
 };
 
-template<typename T> inline Weak<T>::Weak()
-    : m_impl(0)
-{
-}
-
-template<typename T> inline Weak<T>::Weak(std::nullptr_t)
-    : m_impl(0)
-{
-}
-
-template<typename T> inline Weak<T>::Weak(typename Weak<T>::GetType getType, WeakHandleOwner* weakOwner, void* context)
-    : m_impl(getType ? WeakSet::allocate(getType, weakOwner, context) : 0)
-{
-}
-
-template<typename T> inline bool Weak<T>::isHashTableDeletedValue() const
-{
-    return m_impl == hashTableDeletedValue();
-}
-
-template<typename T> inline Weak<T>::Weak(typename Weak<T>::HashTableDeletedValueTag)
-    : m_impl(hashTableDeletedValue())
-{
-}
-
-template<typename T> template<typename U>  inline Weak<T>::Weak(const PassWeak<U>& other)
-    : m_impl(other.leakImpl())
-{
-}
-
-template<typename T> inline Weak<T>::~Weak()
-{
-    clear();
-}
-
-template<class T> inline void swap(Weak<T>& a, Weak<T>& b)
-{
-    a.swap(b);
-}
-
-template<typename T> inline void Weak<T>::swap(Weak& other)
-{
-    std::swap(m_impl, other.m_impl);
-}
-
-template<typename T> inline Weak<T>& Weak<T>::operator=(const PassWeak<T>& o)
-{
-    clear();
-    m_impl = o.leakImpl();
-    return *this;
-}
-
-template<typename T> inline bool Weak<T>::operator!() const
-{
-    return !m_impl || !m_impl->jsValue() || m_impl->state() != WeakImpl::Live;
-}
-
-template<typename T> inline Weak<T>::operator UnspecifiedBoolType*() const
-{
-    return reinterpret_cast<UnspecifiedBoolType*>(!!*this);
-}
-
-template<typename T> inline PassWeak<T> Weak<T>::release()
-{
-    PassWeak<T> tmp = adoptWeak<T>(m_impl);
-    m_impl = 0;
-    return tmp;
-}
-
-template<typename T> inline void Weak<T>::clear()
-{
-    if (!m_impl)
-        return;
-    WeakSet::deallocate(m_impl);
-    m_impl = 0;
-}
-    
-template<typename T> inline WeakImpl* Weak<T>::hashTableDeletedValue()
-{
-    return reinterpret_cast<WeakImpl*>(-1);
-}
-
 } // namespace JSC
 
-namespace WTF {
-
-template<typename T> struct VectorTraits<JSC::Weak<T> > : SimpleClassVectorTraits {
-    static const bool canCompareWithMemcmp = false;
-};
-
-template<typename T> struct HashTraits<JSC::Weak<T> > : SimpleClassHashTraits<JSC::Weak<T> > {
-    typedef JSC::Weak<T> StorageType;
-
-    typedef std::nullptr_t EmptyValueType;
-    static EmptyValueType emptyValue() { return nullptr; }
-
-    typedef JSC::PassWeak<T> PassInType;
-    static void store(PassInType value, StorageType& storage) { storage = value; }
-
-    typedef JSC::PassWeak<T> PassOutType;
-    static PassOutType passOut(StorageType& value) { return value.release(); }
-    static PassOutType passOut(EmptyValueType) { return PassOutType(); }
-
-    typedef typename StorageType::GetType PeekType;
-    static PeekType peek(const StorageType& value) { return value.get(); }
-    static PeekType peek(EmptyValueType) { return PeekType(); }
-};
-
-}
-
 #endif // Weak_h