1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
10 #define WTF_MAKE_FAST_ALLOCATED \
12 void* operator new(size_t, void* p); \
13 void* operator new[](size_t, void* p); \
14 void* operator new(size_t size); \
16 typedef int __thisIsHereToForceASemicolonAfterThisMacro
20 template<typename T
> class RefCounted
{ };
22 template<typename T
> class RawPtr
{
24 operator T
*() const { return 0; }
25 T
* operator->() { return 0; }
28 template<typename T
> class RefPtr
{
31 operator T
*() const { return 0; }
32 T
* operator->() { return 0; }
35 template<typename T
> class OwnPtr
{
38 operator T
*() const { return 0; }
39 T
* operator->() { return 0; }
42 class DefaultAllocator
{
44 static const bool isGarbageCollected
= false;
49 static const bool needsDestruction
= true;
52 template<size_t inlineCapacity
, bool isGarbageCollected
, bool tNeedsDestruction
>
53 class VectorDestructorBase
{
55 ~VectorDestructorBase() {}
58 template<size_t inlineCapacity
>
59 class VectorDestructorBase
<inlineCapacity
, true, false> {};
62 class VectorDestructorBase
<0, true, true> {};
66 size_t inlineCapacity
= 0,
67 typename Allocator
= DefaultAllocator
>
68 class Vector
: public VectorDestructorBase
<inlineCapacity
,
69 Allocator::isGarbageCollected
,
70 VectorTraits
<T
>::needsDestruction
> {
73 T
& operator[](size_t);
78 size_t inlineCapacity
= 0,
79 typename Allocator
= DefaultAllocator
>
84 typename HashArg
= void,
85 typename TraitsArg
= void,
86 typename Allocator
= DefaultAllocator
>
91 typename HashArg
= void,
92 typename TraitsArg
= void,
93 typename Allocator
= DefaultAllocator
>
98 typename HashArg
= void,
99 typename TraitsArg
= void,
100 typename Allocator
= DefaultAllocator
>
101 class LinkedHashSet
{};
105 typename HashArg
= void,
106 typename TraitsArg
= void,
107 typename Allocator
= DefaultAllocator
>
108 class HashCountedSet
{};
113 typename HashArg
= void,
114 typename KeyTraitsArg
= void,
115 typename MappedTraitsArg
= void,
116 typename Allocator
= DefaultAllocator
>
125 #define DISALLOW_ALLOCATION() \
127 void* operator new(size_t) = delete; \
128 void* operator new(size_t, void*) = delete;
130 #define STACK_ALLOCATED() \
132 __attribute__((annotate("blink_stack_allocated"))) \
133 void* operator new(size_t) = delete; \
134 void* operator new(size_t, void*) = delete;
136 #define ALLOW_ONLY_INLINE_ALLOCATION() \
138 void* operator new(size_t, void*); \
140 void* operator new(size_t) = delete;
142 #define GC_PLUGIN_IGNORE(bug) \
143 __attribute__((annotate("blink_gc_plugin_ignore")))
145 #define USING_GARBAGE_COLLECTED_MIXIN(type) \
147 virtual void adjustAndMark(Visitor*) const override { } \
148 virtual bool isHeapObjectAlive(Visitor*) const override { return 0; }
150 #define EAGERLY_FINALIZED() typedef int IsEagerlyFinalizedMarker
152 template<typename T
> class GarbageCollected
{ };
155 class GarbageCollectedFinalized
: public GarbageCollected
<T
> { };
157 template<typename T
> class Member
{
159 operator T
*() const { return 0; }
160 T
* operator->() { return 0; }
161 bool operator!() const { return false; }
164 template<typename T
> class WeakMember
{
166 operator T
*() const { return 0; }
167 T
* operator->() { return 0; }
168 bool operator!() const { return false; }
171 template<typename T
> class Persistent
{
173 operator T
*() const { return 0; }
174 T
* operator->() { return 0; }
175 bool operator!() const { return false; }
178 class HeapAllocator
{
180 static const bool isGarbageCollected
= true;
183 template<typename T
, size_t inlineCapacity
= 0>
184 class HeapVector
: public Vector
<T
, inlineCapacity
, HeapAllocator
> { };
186 template<typename T
, size_t inlineCapacity
= 0>
187 class HeapDeque
: public Vector
<T
, inlineCapacity
, HeapAllocator
> { };
190 class HeapHashSet
: public HashSet
<T
, void, void, HeapAllocator
> { };
193 class HeapListHashSet
: public ListHashSet
<T
, void, void, HeapAllocator
> { };
196 class HeapLinkedHashSet
: public LinkedHashSet
<T
, void, void, HeapAllocator
> {
200 class HeapHashCountedSet
: public HashCountedSet
<T
, void, void, HeapAllocator
> {
203 template<typename K
, typename V
>
204 class HeapHashMap
: public HashMap
<K
, V
, void, void, void, HeapAllocator
> { };
207 class PersistentHeapVector
: public Vector
<T
, 0, HeapAllocator
> { };
209 template <typename Derived
>
210 class VisitorHelper
{
213 void trace(const T
&);
216 class Visitor
: public VisitorHelper
<Visitor
> {
218 template<typename T
, void (T::*method
)(Visitor
*)>
219 void registerWeakMembers(const T
* obj
);
222 class InlinedGlobalMarkingVisitor
223 : public VisitorHelper
<InlinedGlobalMarkingVisitor
> {
225 InlinedGlobalMarkingVisitor
* operator->() { return this; }
227 template<typename T
, void (T::*method
)(Visitor
*)>
228 void registerWeakMembers(const T
* obj
);
231 class GarbageCollectedMixin
{
233 virtual void adjustAndMark(Visitor
*) const = 0;
234 virtual bool isHeapObjectAlive(Visitor
*) const = 0;
235 virtual void trace(Visitor
*) { }
239 struct TraceIfNeeded
{
240 static void trace(Visitor
*, T
*);
243 // blink::ScriptWrappable receives special treatment
244 // so as to allow it to be used together with GarbageCollected<T>,
245 // even when its user-declared destructor is provided.
246 // As it is with Oilpan disabled.
247 class ScriptWrappable
{
249 ~ScriptWrappable() { /* user-declared, thus, non-trivial */ }
257 struct VectorTraits
<blink::Member
<T
> > {
258 static const bool needsDestruction
= false;