Home | History | Annotate | Download | only in heap
      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.
      4 
      5 #ifndef HEAP_STUBS_H_
      6 #define HEAP_STUBS_H_
      7 
      8 #include "stddef.h"
      9 
     10 #define WTF_MAKE_FAST_ALLOCATED                 \
     11     public:                                     \
     12     void* operator new(size_t, void* p);        \
     13     void* operator new[](size_t, void* p);      \
     14     void* operator new(size_t size);            \
     15     private:                                    \
     16     typedef int __thisIsHereToForceASemicolonAfterThisMacro
     17 
     18 namespace WTF {
     19 
     20 template<typename T> class RefCounted { };
     21 
     22 template<typename T> class RawPtr {
     23 public:
     24     operator T*() const { return 0; }
     25     T* operator->() { return 0; }
     26 };
     27 
     28 template<typename T> class RefPtr {
     29 public:
     30     ~RefPtr() { }
     31     operator T*() const { return 0; }
     32     T* operator->() { return 0; }
     33 };
     34 
     35 template<typename T> class OwnPtr {
     36 public:
     37     ~OwnPtr() { }
     38     operator T*() const { return 0; }
     39     T* operator->() { return 0; }
     40 };
     41 
     42 class DefaultAllocator {
     43 public:
     44     static const bool isGarbageCollected = false;
     45 };
     46 
     47 template<typename T>
     48 struct VectorTraits {
     49     static const bool needsDestruction = true;
     50 };
     51 
     52 template<size_t inlineCapacity, bool isGarbageCollected, bool tNeedsDestruction>
     53 class VectorDestructorBase {
     54 public:
     55     ~VectorDestructorBase() {}
     56 };
     57 
     58 template<size_t inlineCapacity>
     59 class VectorDestructorBase<inlineCapacity, true, false> {};
     60 
     61 template<>
     62 class VectorDestructorBase<0, true, true> {};
     63 
     64 template<
     65     typename T,
     66     size_t inlineCapacity = 0,
     67     typename Allocator = DefaultAllocator>
     68 class Vector : public VectorDestructorBase<inlineCapacity,
     69                                            Allocator::isGarbageCollected,
     70                                            VectorTraits<T>::needsDestruction> {
     71 public:
     72     size_t size();
     73     T& operator[](size_t);
     74 };
     75 
     76 template<
     77     typename T,
     78     size_t inlineCapacity = 0,
     79     typename Allocator = DefaultAllocator>
     80 class Deque {};
     81 
     82 template<
     83     typename ValueArg,
     84     typename HashArg = void,
     85     typename TraitsArg = void,
     86     typename Allocator = DefaultAllocator>
     87 class HashSet {};
     88 
     89 template<
     90     typename ValueArg,
     91     typename HashArg = void,
     92     typename TraitsArg = void,
     93     typename Allocator = DefaultAllocator>
     94 class ListHashSet {};
     95 
     96 template<
     97     typename ValueArg,
     98     typename HashArg = void,
     99     typename TraitsArg = void,
    100     typename Allocator = DefaultAllocator>
    101 class LinkedHashSet {};
    102 
    103 template<
    104     typename ValueArg,
    105     typename HashArg = void,
    106     typename TraitsArg = void,
    107     typename Allocator = DefaultAllocator>
    108 class HashCountedSet {};
    109 
    110 template<
    111     typename KeyArg,
    112     typename MappedArg,
    113     typename HashArg = void,
    114     typename KeyTraitsArg = void,
    115     typename MappedTraitsArg = void,
    116     typename Allocator = DefaultAllocator>
    117 class HashMap {};
    118 
    119 }
    120 
    121 namespace WebCore {
    122 
    123 using namespace WTF;
    124 
    125 #define DISALLOW_ALLOCATION()                   \
    126     private:                                    \
    127     void* operator new(size_t) = delete;        \
    128     void* operator new(size_t, void*) = delete;
    129 
    130 #define STACK_ALLOCATED()                                   \
    131     private:                                                \
    132     __attribute__((annotate("blink_stack_allocated")))      \
    133     void* operator new(size_t) = delete;                    \
    134     void* operator new(size_t, void*) = delete;
    135 
    136 #define ALLOW_ONLY_INLINE_ALLOCATION()    \
    137     public:                               \
    138     void* operator new(size_t, void*);    \
    139     private:                              \
    140     void* operator new(size_t) = delete;
    141 
    142 #define GC_PLUGIN_IGNORE(bug)                           \
    143     __attribute__((annotate("blink_gc_plugin_ignore")))
    144 
    145 #define USING_GARBAGE_COLLECTED_MIXIN(type)             \
    146     public:                                             \
    147     virtual void adjustAndMark(Visitor*) const {}       \
    148     virtual bool isAlive(Visitor*) const { return 0; }
    149 
    150 template<typename T> class GarbageCollected { };
    151 
    152 template<typename T>
    153 class GarbageCollectedFinalized : public GarbageCollected<T> { };
    154 
    155 template<typename T> class Member {
    156 public:
    157     operator T*() const { return 0; }
    158     T* operator->() { return 0; }
    159     bool operator!() const { return false; }
    160 };
    161 
    162 template<typename T> class WeakMember {
    163 public:
    164     operator T*() const { return 0; }
    165     T* operator->() { return 0; }
    166     bool operator!() const { return false; }
    167 };
    168 
    169 template<typename T> class Persistent {
    170 public:
    171     operator T*() const { return 0; }
    172     T* operator->() { return 0; }
    173     bool operator!() const { return false; }
    174 };
    175 
    176 class HeapAllocator {
    177 public:
    178     static const bool isGarbageCollected = true;
    179 };
    180 
    181 template<typename T, size_t inlineCapacity = 0>
    182 class HeapVector : public Vector<T, inlineCapacity, HeapAllocator> { };
    183 
    184 template<typename T, size_t inlineCapacity = 0>
    185 class HeapDeque : public Vector<T, inlineCapacity, HeapAllocator> { };
    186 
    187 template<typename T>
    188 class HeapHashSet : public HashSet<T, void, void, HeapAllocator> { };
    189 
    190 template<typename T>
    191 class HeapListHashSet : public ListHashSet<T, void, void, HeapAllocator> { };
    192 
    193 template<typename T>
    194 class HeapLinkedHashSet : public LinkedHashSet<T, void, void, HeapAllocator> {
    195 };
    196 
    197 template<typename T>
    198 class HeapHashCountedSet : public HashCountedSet<T, void, void, HeapAllocator> {
    199 };
    200 
    201 template<typename K, typename V>
    202 class HeapHashMap : public HashMap<K, V, void, void, void, HeapAllocator> { };
    203 
    204 template<typename T>
    205 class PersistentHeapVector : public Vector<T, 0, HeapAllocator> { };
    206 
    207 class Visitor {
    208 public:
    209     template<typename T>
    210     void trace(const T&);
    211 
    212     template<typename T, void (T::*method)(Visitor*)>
    213     void registerWeakMembers(const T* obj);
    214 };
    215 
    216 class GarbageCollectedMixin {
    217     virtual void adjustAndMark(Visitor*) const = 0;
    218     virtual bool isAlive(Visitor*) const = 0;
    219 };
    220 
    221 }
    222 
    223 namespace WTF {
    224 
    225 template<typename T>
    226 struct VectorTraits<WebCore::Member<T> > {
    227     static const bool needsDestruction = false;
    228 };
    229 
    230 }
    231 
    232 #endif
    233