]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - wtf/RefCounted.h
JavaScriptCore-721.26.tar.gz
[apple/javascriptcore.git] / wtf / RefCounted.h
index ac8e167bf7488b808e6a06b0de6337ad4d9dd37e..761a8566f4fcb777c8b9f114c83a128f28f424e6 100644 (file)
@@ -29,7 +29,7 @@ namespace WTF {
 // This base class holds the non-template methods and attributes.
 // The RefCounted class inherits from it reducing the template bloat
 // generated by the compiler (technique called template hoisting).
-class RefCountedBase : Noncopyable {
+class RefCountedBase {
 public:
     void ref()
     {
@@ -49,15 +49,17 @@ public:
     }
 
 protected:
-    RefCountedBase(int initialRefCount)
-        : m_refCount(initialRefCount)
+    RefCountedBase()
+        : m_refCount(1)
 #ifndef NDEBUG
         , m_deletionHasBegun(false)
 #endif
     {
     }
 
-    ~RefCountedBase() {}
+    ~RefCountedBase()
+    {
+    }
 
     // Returns whether the pointer should be freed or not.
     bool derefBase()
@@ -75,7 +77,23 @@ protected:
         return false;
     }
 
-protected:
+    // Helper for generating JIT code. Please do not use for non-JIT purposes.
+    int* addressOfCount()
+    {
+        return &m_refCount;
+    }
+
+#ifndef NDEBUG
+    bool deletionHasBegun() const
+    {
+        return m_deletionHasBegun;
+    }
+#endif
+
+private:
+    template<class T>
+    friend class CrossThreadRefCounted;
+
     int m_refCount;
 #ifndef NDEBUG
     bool m_deletionHasBegun;
@@ -83,13 +101,22 @@ protected:
 };
 
 
-template<class T> class RefCounted : public RefCountedBase {
+template<class T> class RefCounted : public RefCountedBase, public Noncopyable {
 public:
-    RefCounted(int initialRefCount = 1)
-        : RefCountedBase(initialRefCount)
+    void deref()
     {
+        if (derefBase())
+            delete static_cast<T*>(this);
     }
 
+protected:
+    ~RefCounted()
+    {
+    }
+};
+
+template<class T> class RefCountedCustomAllocated : public RefCountedBase, public NoncopyableCustomAllocated {
+public:
     void deref()
     {
         if (derefBase())
@@ -97,11 +124,14 @@ public:
     }
 
 protected:
-    ~RefCounted() {}
+    ~RefCountedCustomAllocated()
+    {
+    }
 };
 
 } // namespace WTF
 
 using WTF::RefCounted;
+using WTF::RefCountedCustomAllocated;
 
 #endif // RefCounted_h