| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright (C) 2014 Google Inc. All rights reserved. | 2  * Copyright (C) 2014 Google Inc. All rights reserved. | 
| 3  * | 3  * | 
| 4  * Redistribution and use in source and binary forms, with or without | 4  * Redistribution and use in source and binary forms, with or without | 
| 5  * modification, are permitted provided that the following conditions are | 5  * modification, are permitted provided that the following conditions are | 
| 6  * met: | 6  * met: | 
| 7  * | 7  * | 
| 8  *     * Redistributions of source code must retain the above copyright | 8  *     * Redistributions of source code must retain the above copyright | 
| 9  * notice, this list of conditions and the following disclaimer. | 9  * notice, this list of conditions and the following disclaimer. | 
| 10  *     * Redistributions in binary form must reproduce the above | 10  *     * Redistributions in binary form must reproduce the above | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
| 28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
| 29  */ | 29  */ | 
| 30 | 30 | 
| 31 #ifndef Handle_h | 31 #ifndef Handle_h | 
| 32 #define Handle_h | 32 #define Handle_h | 
| 33 | 33 | 
| 34 #include "heap/Heap.h" | 34 #include "heap/Heap.h" | 
| 35 #include "heap/ThreadState.h" | 35 #include "heap/ThreadState.h" | 
| 36 #include "heap/Visitor.h" | 36 #include "heap/Visitor.h" | 
| 37 | 37 | 
|  | 38 #include "wtf/Ptr.h" | 
|  | 39 #include "wtf/RefCounted.h" | 
|  | 40 | 
| 38 namespace WebCore { | 41 namespace WebCore { | 
| 39 | 42 | 
| 40 template<typename T> class Member; | 43 template<typename T> class Member; | 
| 41 | 44 | 
| 42 class PersistentNode { | 45 class PersistentNode { | 
| 43 public: | 46 public: | 
| 44     explicit PersistentNode(TraceCallback trace) : m_trace(trace) { } | 47     explicit PersistentNode(TraceCallback trace) : m_trace(trace) { } | 
| 45 | 48 | 
| 46     virtual ~PersistentNode() { } | 49     virtual ~PersistentNode() { } | 
| 47 | 50 | 
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 167 | 170 | 
| 168     Persistent(const Persistent& other) : m_raw(other) { } | 171     Persistent(const Persistent& other) : m_raw(other) { } | 
| 169 | 172 | 
| 170     template<typename U> | 173     template<typename U> | 
| 171     Persistent(const Persistent<U>& other) : m_raw(other) { } | 174     Persistent(const Persistent<U>& other) : m_raw(other) { } | 
| 172 | 175 | 
| 173     template<typename U> | 176     template<typename U> | 
| 174     Persistent(const Member<U>& other) : m_raw(other) { } | 177     Persistent(const Member<U>& other) : m_raw(other) { } | 
| 175 | 178 | 
| 176     template<typename U> | 179     template<typename U> | 
|  | 180     Persistent(const Ptr<U>& other) : m_raw(other.get()) { } | 
|  | 181 | 
|  | 182     template<typename U> | 
| 177     Persistent& operator=(U* other) | 183     Persistent& operator=(U* other) | 
| 178     { | 184     { | 
| 179         m_raw = other; | 185         m_raw = other; | 
| 180         return *this; | 186         return *this; | 
| 181     } | 187     } | 
| 182 | 188 | 
| 183     virtual ~Persistent() | 189     virtual ~Persistent() | 
| 184     { | 190     { | 
| 185         m_raw = 0; | 191         m_raw = 0; | 
| 186     } | 192     } | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 198         T* result = m_raw; | 204         T* result = m_raw; | 
| 199         m_raw = 0; | 205         m_raw = 0; | 
| 200         return result; | 206         return result; | 
| 201     } | 207     } | 
| 202 | 208 | 
| 203     T& operator*() const { return *m_raw; } | 209     T& operator*() const { return *m_raw; } | 
| 204 | 210 | 
| 205     bool operator!() const { return !m_raw; } | 211     bool operator!() const { return !m_raw; } | 
| 206 | 212 | 
| 207     operator T*() const { return m_raw; } | 213     operator T*() const { return m_raw; } | 
|  | 214     operator Ptr<T>() const { return m_raw; } | 
| 208 | 215 | 
| 209     T* operator->() const { return *this; } | 216     T* operator->() const { return *this; } | 
| 210 | 217 | 
| 211     Persistent& operator=(std::nullptr_t) | 218     Persistent& operator=(std::nullptr_t) | 
| 212     { | 219     { | 
| 213         m_raw = 0; | 220         m_raw = 0; | 
| 214         return *this; | 221         return *this; | 
| 215     } | 222     } | 
| 216 | 223 | 
| 217     Persistent& operator=(const Persistent& other) | 224     Persistent& operator=(const Persistent& other) | 
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 397 // Comparison operators between (Weak)Members and Persistents | 404 // Comparison operators between (Weak)Members and Persistents | 
| 398 template<typename T, typename U> inline bool operator==(const Member<T>& a, cons
     t Member<U>& b) { return a.get() == b.get(); } | 405 template<typename T, typename U> inline bool operator==(const Member<T>& a, cons
     t Member<U>& b) { return a.get() == b.get(); } | 
| 399 template<typename T, typename U> inline bool operator!=(const Member<T>& a, cons
     t Member<U>& b) { return a.get() != b.get(); } | 406 template<typename T, typename U> inline bool operator!=(const Member<T>& a, cons
     t Member<U>& b) { return a.get() != b.get(); } | 
| 400 template<typename T, typename U> inline bool operator==(const Member<T>& a, cons
     t Persistent<U>& b) { return a.get() == b.get(); } | 407 template<typename T, typename U> inline bool operator==(const Member<T>& a, cons
     t Persistent<U>& b) { return a.get() == b.get(); } | 
| 401 template<typename T, typename U> inline bool operator!=(const Member<T>& a, cons
     t Persistent<U>& b) { return a.get() != b.get(); } | 408 template<typename T, typename U> inline bool operator!=(const Member<T>& a, cons
     t Persistent<U>& b) { return a.get() != b.get(); } | 
| 402 template<typename T, typename U> inline bool operator==(const Persistent<T>& a, 
     const Member<U>& b) { return a.get() == b.get(); } | 409 template<typename T, typename U> inline bool operator==(const Persistent<T>& a, 
     const Member<U>& b) { return a.get() == b.get(); } | 
| 403 template<typename T, typename U> inline bool operator!=(const Persistent<T>& a, 
     const Member<U>& b) { return a.get() != b.get(); } | 410 template<typename T, typename U> inline bool operator!=(const Persistent<T>& a, 
     const Member<U>& b) { return a.get() != b.get(); } | 
| 404 template<typename T, typename U> inline bool operator==(const Persistent<T>& a, 
     const Persistent<U>& b) { return a.get() == b.get(); } | 411 template<typename T, typename U> inline bool operator==(const Persistent<T>& a, 
     const Persistent<U>& b) { return a.get() == b.get(); } | 
| 405 template<typename T, typename U> inline bool operator!=(const Persistent<T>& a, 
     const Persistent<U>& b) { return a.get() != b.get(); } | 412 template<typename T, typename U> inline bool operator!=(const Persistent<T>& a, 
     const Persistent<U>& b) { return a.get() != b.get(); } | 
| 406 | 413 | 
|  | 414 // Template aliases for the transition period where we want to support | 
|  | 415 // both reference counting and garbage collection based on a | 
|  | 416 // compile-time flag. | 
|  | 417 // | 
|  | 418 // With clang we can use c++11 template aliases which is really what | 
|  | 419 // we want. For GCC and MSVC we simulate the template aliases with | 
|  | 420 // stylized macros until we can use template aliases. | 
|  | 421 #if ENABLE(OILPAN) | 
|  | 422 | 
|  | 423 #if COMPILER(CLANG) | 
|  | 424 template<typename T> using PassRefPtrWillBePtr = Ptr<T>; | 
|  | 425 template<typename T> using RefCountedWillBeGarbageCollected = GarbageCollected<T
     >; | 
|  | 426 template<typename T> using RefCountedWillBeGarbageCollectedFinalized = GarbageCo
     llectedFinalized<T>; | 
|  | 427 template<typename T> using RefPtrWillBePersistent = Persistent<T>; | 
|  | 428 template<typename T> using RefPtrWillBePtr = Ptr<T>; | 
|  | 429 template<typename T> using RefPtrWillBeMember = Member<T>; | 
|  | 430 template<typename T> using PtrWillBeMember = Member<T>; | 
|  | 431 template<typename T> using PtrWillBeWeakMember = WeakMember<T>; | 
|  | 432 template<typename T> using OwnPtrWillBeMember = Member<T>; | 
|  | 433 template<typename T> using PassOwnPtrWillBePtr = Ptr<T>; | 
|  | 434 template<typename T> using NoBaseWillBeGarbageCollected = GarbageCollected<T>; | 
|  | 435 template<typename T> using NoBaseWillBeGarbageCollectedFinalized = GarbageCollec
     tedFinalized<T>; | 
|  | 436 #else // !COMPILER(CLANG) | 
|  | 437 #define PassRefPtrWillBePtr Ptr | 
|  | 438 #define RefCountedWillBeGarbageCollected GarbageCollected | 
|  | 439 #define RefCountedWillBeGarbageCollectedFinalized GarbageCollectedFinalized | 
|  | 440 #define RefPtrWillBePersistent Persistent | 
|  | 441 #define RefPtrWillBePtr Ptr | 
|  | 442 #define RefPtrWillBeMember Member | 
|  | 443 #define PtrWillBeMember Member | 
|  | 444 #define PtrWillBeWeakMember WeakMember | 
|  | 445 #define OwnPtrWillBeMember Member | 
|  | 446 #define PassOwnPtrWillBePtr Ptr | 
|  | 447 #define NoBaseWillBeGarbageCollected GarbageCollected | 
|  | 448 #define NoBaseWillBeGarbageCollectedFinalized GarbageCollectedFinalized | 
|  | 449 #endif // COMPILER(CLANG) | 
|  | 450 | 
|  | 451 template<typename T> PassRefPtrWillBePtr<T> adoptRefWillBeNoop(T* ptr) { return 
     PassRefPtrWillBePtr<T>(ptr); } | 
|  | 452 template<typename T> PassOwnPtrWillBePtr<T> adoptPtrWillBeNoop(T* ptr) { return 
     PassOwnPtrWillBePtr<T>(ptr); } | 
|  | 453 | 
|  | 454 #else // !ENABLE(OILPAN) | 
|  | 455 | 
|  | 456 template<typename T> | 
|  | 457 class DummyBase { | 
|  | 458 public: | 
|  | 459     DummyBase() { } | 
|  | 460     ~DummyBase() { } | 
|  | 461 }; | 
|  | 462 | 
|  | 463 #if COMPILER(CLANG) | 
|  | 464 template<typename T> using PassRefPtrWillBePtr = PassRefPtr<T>; | 
|  | 465 template<typename T> using RefCountedWillBeGarbageCollected = RefCounted<T>; | 
|  | 466 template<typename T> using RefCountedWillBeGarbageCollectedFinalized = RefCounte
     d<T>; | 
|  | 467 template<typename T> using RefPtrWillBePersistent = RefPtr<T>; | 
|  | 468 template<typename T> using RefPtrWillBePtr = RefPtr<T>; | 
|  | 469 template<typename T> using RefPtrWillBeMember = RefPtr<T>; | 
|  | 470 template<typename T> using PtrWillBeMember = Ptr<T>; | 
|  | 471 template<typename T> using PtrWillBeWeakMember = Ptr<T>; | 
|  | 472 template<typename T> using OwnPtrWillBeMember = OwnPtr<T>; | 
|  | 473 template<typename T> using PassOwnPtrWillBePtr = PassOwnPtr<T>; | 
|  | 474 template<typename T> using NoBaseWillBeGarbageCollected = DummyBase<T>; | 
|  | 475 template<typename T> using NoBaseWillBeGarbageCollectedFinalized = DummyBase<T>; | 
|  | 476 #else // !COMPILER(CLANG) | 
|  | 477 #define PassRefPtrWillBePtr PassRefPtr | 
|  | 478 #define RefCountedWillBeGarbageCollected RefCounted | 
|  | 479 #define RefCountedWillBeGarbageCollectedFinalized RefCounted | 
|  | 480 #define RefPtrWillBePersistent RefPtr | 
|  | 481 #define RefPtrWillBePtr RefPtr | 
|  | 482 #define RefPtrWillBeMember RefPtr | 
|  | 483 #define PtrWillBeMember Ptr | 
|  | 484 #define PtrWillBeWeakMember Ptr | 
|  | 485 #define OwnPtrWillBeMember OwnPtr | 
|  | 486 #define PassOwnPtrWillBePtr PassOwnPtr | 
|  | 487 #define NoBaseWillBeGarbageCollected DummyBase | 
|  | 488 #define NoBaseWillBeGarbageCollectedFinalized DummyBase | 
|  | 489 #endif // COMPILER(CLANG) | 
|  | 490 | 
|  | 491 template<typename T> PassRefPtrWillBePtr<T> adoptRefWillBeNoop(T* ptr) { return 
     adoptRef(ptr); } | 
|  | 492 template<typename T> PassOwnPtrWillBePtr<T> adoptPtrWillBeNoop(T* ptr) { return 
     adoptPtr(ptr); } | 
|  | 493 | 
|  | 494 #endif // ENABLE(OILPAN) | 
|  | 495 | 
| 407 } // namespace WebCore | 496 } // namespace WebCore | 
| 408 | 497 | 
| 409 namespace WTF { | 498 namespace WTF { | 
| 410 | 499 | 
| 411 template <typename T> struct VectorTraits<WebCore::Member<T> > : VectorTraitsBas
     e<false, WebCore::Member<T> > { | 500 template <typename T> struct VectorTraits<WebCore::Member<T> > : VectorTraitsBas
     e<false, WebCore::Member<T> > { | 
| 412     static const bool needsDestruction = false; | 501     static const bool needsDestruction = false; | 
| 413     static const bool canInitializeWithMemset = true; | 502     static const bool canInitializeWithMemset = true; | 
| 414     static const bool canMoveWithMemcpy = true; | 503     static const bool canMoveWithMemcpy = true; | 
| 415 }; | 504 }; | 
| 416 | 505 | 
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 508 }; | 597 }; | 
| 509 | 598 | 
| 510 template<typename Key, typename Value, typename Extractor, typename Traits, type
     name KeyTraits> | 599 template<typename Key, typename Value, typename Extractor, typename Traits, type
     name KeyTraits> | 
| 511 struct IsWeak<WebCore::HeapHashTableBacking<Key, Value, Extractor, Traits, KeyTr
     aits> > { | 600 struct IsWeak<WebCore::HeapHashTableBacking<Key, Value, Extractor, Traits, KeyTr
     aits> > { | 
| 512     static const bool value = Traits::isWeak; | 601     static const bool value = Traits::isWeak; | 
| 513 }; | 602 }; | 
| 514 | 603 | 
| 515 } // namespace WTF | 604 } // namespace WTF | 
| 516 | 605 | 
| 517 #endif | 606 #endif | 
| OLD | NEW | 
|---|