Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1241)

Unified Diff: Source/heap/Handle.h

Issue 137483003: Add template aliases to support both reference counting and garbage collection for a transition per… (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Address comment. Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | Source/heap/HeapTest.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/heap/Handle.h
diff --git a/Source/heap/Handle.h b/Source/heap/Handle.h
index 8ca68efd6659e0b5cb1843000e0705793977f97d..17342087a18f9960a31c66a846aa96c32c1f96b4 100644
--- a/Source/heap/Handle.h
+++ b/Source/heap/Handle.h
@@ -35,6 +35,9 @@
#include "heap/ThreadState.h"
#include "heap/Visitor.h"
+#include "wtf/Ptr.h"
+#include "wtf/RefCounted.h"
+
namespace WebCore {
template<typename T> class Member;
@@ -174,6 +177,9 @@ public:
Persistent(const Member<U>& other) : m_raw(other) { }
template<typename U>
+ Persistent(const Ptr<U>& other) : m_raw(other.get()) { }
+
+ template<typename U>
Persistent& operator=(U* other)
{
m_raw = other;
@@ -205,6 +211,7 @@ public:
bool operator!() const { return !m_raw; }
operator T*() const { return m_raw; }
+ operator Ptr<T>() const { return m_raw; }
T* operator->() const { return *this; }
@@ -404,6 +411,88 @@ template<typename T, typename U> inline bool operator!=(const Persistent<T>& a,
template<typename T, typename U> inline bool operator==(const Persistent<T>& a, const Persistent<U>& b) { return a.get() == b.get(); }
template<typename T, typename U> inline bool operator!=(const Persistent<T>& a, const Persistent<U>& b) { return a.get() != b.get(); }
+// Template aliases for the transition period where we want to support
+// both reference counting and garbage collection based on a
+// compile-time flag.
+//
+// With clang we can use c++11 template aliases which is really what
+// we want. For GCC and MSVC we simulate the template aliases with
+// stylized macros until we can use template aliases.
+#if ENABLE(OILPAN)
+
+#if COMPILER(CLANG)
+template<typename T> using PassRefPtrWillBePtr = Ptr<T>;
+template<typename T> using RefCountedWillBeGarbageCollected = GarbageCollected<T>;
+template<typename T> using RefCountedWillBeGarbageCollectedFinalized = GarbageCollectedFinalized<T>;
+template<typename T> using RefPtrWillBePersistent = Persistent<T>;
+template<typename T> using RefPtrWillBePtr = Ptr<T>;
+template<typename T> using RefPtrWillBeMember = Member<T>;
+template<typename T> using PtrWillBeMember = Member<T>;
+template<typename T> using PtrWillBeWeakMember = WeakMember<T>;
+template<typename T> using OwnPtrWillBeMember = Member<T>;
+template<typename T> using PassOwnPtrWillBePtr = Ptr<T>;
+template<typename T> using NoBaseWillBeGarbageCollected = GarbageCollected<T>;
+template<typename T> using NoBaseWillBeGarbageCollectedFinalized = GarbageCollectedFinalized<T>;
+#else // !COMPILER(CLANG)
+#define PassRefPtrWillBePtr Ptr
+#define RefCountedWillBeGarbageCollected GarbageCollected
+#define RefCountedWillBeGarbageCollectedFinalized GarbageCollectedFinalized
+#define RefPtrWillBePersistent Persistent
+#define RefPtrWillBePtr Ptr
+#define RefPtrWillBeMember Member
+#define PtrWillBeMember Member
+#define PtrWillBeWeakMember WeakMember
+#define OwnPtrWillBeMember Member
+#define PassOwnPtrWillBePtr Ptr
+#define NoBaseWillBeGarbageCollected GarbageCollected
+#define NoBaseWillBeGarbageCollectedFinalized GarbageCollectedFinalized
+#endif // COMPILER(CLANG)
+
+template<typename T> PassRefPtrWillBePtr<T> adoptRefWillBeNoop(T* ptr) { return PassRefPtrWillBePtr<T>(ptr); }
+template<typename T> PassOwnPtrWillBePtr<T> adoptPtrWillBeNoop(T* ptr) { return PassOwnPtrWillBePtr<T>(ptr); }
+
+#else // !ENABLE(OILPAN)
+
+template<typename T>
+class DummyBase {
+public:
+ DummyBase() { }
+ ~DummyBase() { }
+};
+
+#if COMPILER(CLANG)
+template<typename T> using PassRefPtrWillBePtr = PassRefPtr<T>;
+template<typename T> using RefCountedWillBeGarbageCollected = RefCounted<T>;
+template<typename T> using RefCountedWillBeGarbageCollectedFinalized = RefCounted<T>;
+template<typename T> using RefPtrWillBePersistent = RefPtr<T>;
+template<typename T> using RefPtrWillBePtr = RefPtr<T>;
+template<typename T> using RefPtrWillBeMember = RefPtr<T>;
+template<typename T> using PtrWillBeMember = Ptr<T>;
+template<typename T> using PtrWillBeWeakMember = Ptr<T>;
+template<typename T> using OwnPtrWillBeMember = OwnPtr<T>;
+template<typename T> using PassOwnPtrWillBePtr = PassOwnPtr<T>;
+template<typename T> using NoBaseWillBeGarbageCollected = DummyBase<T>;
+template<typename T> using NoBaseWillBeGarbageCollectedFinalized = DummyBase<T>;
+#else // !COMPILER(CLANG)
+#define PassRefPtrWillBePtr PassRefPtr
+#define RefCountedWillBeGarbageCollected RefCounted
+#define RefCountedWillBeGarbageCollectedFinalized RefCounted
+#define RefPtrWillBePersistent RefPtr
+#define RefPtrWillBePtr RefPtr
+#define RefPtrWillBeMember RefPtr
+#define PtrWillBeMember Ptr
+#define PtrWillBeWeakMember Ptr
+#define OwnPtrWillBeMember OwnPtr
+#define PassOwnPtrWillBePtr PassOwnPtr
+#define NoBaseWillBeGarbageCollected DummyBase
+#define NoBaseWillBeGarbageCollectedFinalized DummyBase
+#endif // COMPILER(CLANG)
+
+template<typename T> PassRefPtrWillBePtr<T> adoptRefWillBeNoop(T* ptr) { return adoptRef(ptr); }
+template<typename T> PassOwnPtrWillBePtr<T> adoptPtrWillBeNoop(T* ptr) { return adoptPtr(ptr); }
+
+#endif // ENABLE(OILPAN)
+
} // namespace WebCore
namespace WTF {
« no previous file with comments | « no previous file | Source/heap/HeapTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698