1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef HEAP_STUBS_H_ 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define HEAP_STUBS_H_ 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "stddef.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define WTF_MAKE_FAST_ALLOCATED \ 11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public: \ 12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void* operator new(size_t, void* p); \ 13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void* operator new[](size_t, void* p); \ 14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void* operator new(size_t size); \ 15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private: \ 16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typedef int __thisIsHereToForceASemicolonAfterThisMacro 17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace WTF { 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template<typename T> class RefCounted { }; 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template<typename T> class RawPtr { 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)public: 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) operator T*() const { return 0; } 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) T* operator->() { return 0; } 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template<typename T> class RefPtr { 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)public: 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ~RefPtr() { } 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) operator T*() const { return 0; } 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) T* operator->() { return 0; } 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template<typename T> class OwnPtr { 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)public: 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ~OwnPtr() { } 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) operator T*() const { return 0; } 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) T* operator->() { return 0; } 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class DefaultAllocator { 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)public: 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static const bool isGarbageCollected = false; 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template<typename T> 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)struct VectorTraits { 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static const bool needsDestruction = true; 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template<size_t inlineCapacity, bool isGarbageCollected, bool tNeedsDestruction> 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class VectorDestructorBase { 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)public: 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ~VectorDestructorBase() {} 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template<size_t inlineCapacity> 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class VectorDestructorBase<inlineCapacity, true, false> {}; 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template<> 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class VectorDestructorBase<0, true, true> {}; 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)template< 65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename T, 66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) size_t inlineCapacity = 0, 67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename Allocator = DefaultAllocator> 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Vector : public VectorDestructorBase<inlineCapacity, 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Allocator::isGarbageCollected, 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) VectorTraits<T>::needsDestruction> { 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)public: 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t size(); 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) T& operator[](size_t); 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)template< 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename T, 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) size_t inlineCapacity = 0, 79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename Allocator = DefaultAllocator> 80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class Deque {}; 81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)template< 83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename ValueArg, 84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename HashArg = void, 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename TraitsArg = void, 86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename Allocator = DefaultAllocator> 87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class HashSet {}; 88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)template< 90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename ValueArg, 91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename HashArg = void, 92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename TraitsArg = void, 93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename Allocator = DefaultAllocator> 94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class ListHashSet {}; 95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)template< 97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename ValueArg, 98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename HashArg = void, 99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename TraitsArg = void, 100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename Allocator = DefaultAllocator> 101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class LinkedHashSet {}; 102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)template< 104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename ValueArg, 105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename HashArg = void, 106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename TraitsArg = void, 107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename Allocator = DefaultAllocator> 108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class HashCountedSet {}; 109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)template< 111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename KeyArg, 112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename MappedArg, 113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename HashArg = void, 114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename KeyTraitsArg = void, 115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename MappedTraitsArg = void, 116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typename Allocator = DefaultAllocator> 117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class HashMap {}; 118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace blink { 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using namespace WTF; 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define DISALLOW_ALLOCATION() \ 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: \ 12723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) void* operator new(size_t) = delete; \ 12823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) void* operator new(size_t, void*) = delete; 12923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 13023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define STACK_ALLOCATED() \ 13123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) private: \ 13223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) __attribute__((annotate("blink_stack_allocated"))) \ 13323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) void* operator new(size_t) = delete; \ 13423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) void* operator new(size_t, void*) = delete; 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define ALLOW_ONLY_INLINE_ALLOCATION() \ 137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public: \ 138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void* operator new(size_t, void*); \ 139effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private: \ 140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void* operator new(size_t) = delete; 141effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define GC_PLUGIN_IGNORE(bug) \ 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) __attribute__((annotate("blink_gc_plugin_ignore"))) 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define USING_GARBAGE_COLLECTED_MIXIN(type) \ 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: \ 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void adjustAndMark(Visitor*) const {} \ 148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool isAlive(Visitor*) const { return 0; } 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template<typename T> class GarbageCollected { }; 151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template<typename T> 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class GarbageCollectedFinalized : public GarbageCollected<T> { }; 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template<typename T> class Member { 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)public: 157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) operator T*() const { return 0; } 158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) T* operator->() { return 0; } 159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool operator!() const { return false; } 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)template<typename T> class WeakMember { 163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)public: 164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) operator T*() const { return 0; } 165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) T* operator->() { return 0; } 166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool operator!() const { return false; } 167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template<typename T> class Persistent { 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)public: 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) operator T*() const { return 0; } 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) T* operator->() { return 0; } 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool operator!() const { return false; } 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class HeapAllocator { 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)public: 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static const bool isGarbageCollected = true; 179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template<typename T, size_t inlineCapacity = 0> 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class HeapVector : public Vector<T, inlineCapacity, HeapAllocator> { }; 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)template<typename T, size_t inlineCapacity = 0> 185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class HeapDeque : public Vector<T, inlineCapacity, HeapAllocator> { }; 186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)template<typename T> 188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class HeapHashSet : public HashSet<T, void, void, HeapAllocator> { }; 189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)template<typename T> 191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class HeapListHashSet : public ListHashSet<T, void, void, HeapAllocator> { }; 192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)template<typename T> 194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class HeapLinkedHashSet : public LinkedHashSet<T, void, void, HeapAllocator> { 195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)template<typename T> 198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class HeapHashCountedSet : public HashCountedSet<T, void, void, HeapAllocator> { 199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)template<typename K, typename V> 202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class HeapHashMap : public HashMap<K, V, void, void, void, HeapAllocator> { }; 203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template<typename T> 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class PersistentHeapVector : public Vector<T, 0, HeapAllocator> { }; 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Visitor { 208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)public: 209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) template<typename T> 210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void trace(const T&); 211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) template<typename T, void (T::*method)(Visitor*)> 213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void registerWeakMembers(const T* obj); 214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class GarbageCollectedMixin { 217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void adjustAndMark(Visitor*) const = 0; 218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool isAlive(Visitor*) const = 0; 2196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void trace(Visitor*) { } 220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template<typename T> 2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)struct TraceIfNeeded { 2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) static void trace(Visitor*, T*); 2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// blink::ScriptWrappable receives special treatment 228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// so as to allow it to be used together with GarbageCollected<T>, 229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// even when its user-declared destructor is provided. 230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// As it is with Oilpan disabled. 231116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ScriptWrappable { 232116680a4aac90f2aa7413d9095a592090648e557Ben Murdochpublic: 233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ~ScriptWrappable() { /* user-declared, thus, non-trivial */ } 234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace WTF { 239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template<typename T> 241116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstruct VectorTraits<blink::Member<T> > { 242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static const bool needsDestruction = false; 243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 248