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