blob: 5e07c2366e05cacfc3f874c8fdc03eb25517c6ab [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef HEAP_STUBS_H_
#define HEAP_STUBS_H_
#include "stddef.h"
#define WTF_MAKE_FAST_ALLOCATED \
public: \
void* operator new(size_t, void* p); \
void* operator new[](size_t, void* p); \
void* operator new(size_t size); \
private: \
typedef int __thisIsHereToForceASemicolonAfterThisMacro
namespace WTF {
template<typename T> class RefCounted { };
template<typename T> class RawPtr {
public:
operator T*() const { return 0; }
T* operator->() { return 0; }
};
template<typename T> class RefPtr {
public:
~RefPtr() { }
operator T*() const { return 0; }
T* operator->() { return 0; }
};
template<typename T> class OwnPtr {
public:
~OwnPtr() { }
operator T*() const { return 0; }
T* operator->() { return 0; }
};
class DefaultAllocator {
public:
static const bool isGarbageCollected = false;
};
template<typename T>
struct VectorTraits {
static const bool needsDestruction = true;
};
template<size_t inlineCapacity, bool isGarbageCollected, bool tNeedsDestruction>
class VectorDestructorBase {
public:
~VectorDestructorBase() {}
};
template<size_t inlineCapacity>
class VectorDestructorBase<inlineCapacity, true, false> {};
template<>
class VectorDestructorBase<0, true, true> {};
template<
typename T,
size_t inlineCapacity = 0,
typename Allocator = DefaultAllocator>
class Vector : public VectorDestructorBase<inlineCapacity,
Allocator::isGarbageCollected,
VectorTraits<T>::needsDestruction> {
public:
size_t size();
T& operator[](size_t);
};
template<
typename T,
size_t inlineCapacity = 0,
typename Allocator = DefaultAllocator>
class Deque {};
template<
typename ValueArg,
typename HashArg = void,
typename TraitsArg = void,
typename Allocator = DefaultAllocator>
class HashSet {};
template<
typename ValueArg,
typename HashArg = void,
typename TraitsArg = void,
typename Allocator = DefaultAllocator>
class ListHashSet {};
template<
typename ValueArg,
typename HashArg = void,
typename TraitsArg = void,
typename Allocator = DefaultAllocator>
class LinkedHashSet {};
template<
typename ValueArg,
typename HashArg = void,
typename TraitsArg = void,
typename Allocator = DefaultAllocator>
class HashCountedSet {};
template<
typename KeyArg,
typename MappedArg,
typename HashArg = void,
typename KeyTraitsArg = void,
typename MappedTraitsArg = void,
typename Allocator = DefaultAllocator>
class HashMap {};
}
namespace blink {
using namespace WTF;
#define DISALLOW_ALLOCATION() \
private: \
void* operator new(size_t) = delete; \
void* operator new(size_t, void*) = delete;
#define STACK_ALLOCATED() \
private: \
__attribute__((annotate("blink_stack_allocated"))) \
void* operator new(size_t) = delete; \
void* operator new(size_t, void*) = delete;
#define ALLOW_ONLY_INLINE_ALLOCATION() \
public: \
void* operator new(size_t, void*); \
private: \
void* operator new(size_t) = delete;
#define GC_PLUGIN_IGNORE(bug) \
__attribute__((annotate("blink_gc_plugin_ignore")))
#define USING_GARBAGE_COLLECTED_MIXIN(type) \
public: \
virtual void adjustAndMark(Visitor*) const override { } \
virtual bool isHeapObjectAlive(Visitor*) const override { return 0; }
#define EAGERLY_FINALIZED() typedef int IsEagerlyFinalizedMarker
template<typename T> class GarbageCollected { };
template<typename T>
class GarbageCollectedFinalized : public GarbageCollected<T> { };
template<typename T> class Member {
public:
operator T*() const { return 0; }
T* operator->() { return 0; }
bool operator!() const { return false; }
};
template<typename T> class WeakMember {
public:
operator T*() const { return 0; }
T* operator->() { return 0; }
bool operator!() const { return false; }
};
template<typename T> class Persistent {
public:
operator T*() const { return 0; }
T* operator->() { return 0; }
bool operator!() const { return false; }
};
class HeapAllocator {
public:
static const bool isGarbageCollected = true;
};
template<typename T, size_t inlineCapacity = 0>
class HeapVector : public Vector<T, inlineCapacity, HeapAllocator> { };
template<typename T, size_t inlineCapacity = 0>
class HeapDeque : public Vector<T, inlineCapacity, HeapAllocator> { };
template<typename T>
class HeapHashSet : public HashSet<T, void, void, HeapAllocator> { };
template<typename T>
class HeapListHashSet : public ListHashSet<T, void, void, HeapAllocator> { };
template<typename T>
class HeapLinkedHashSet : public LinkedHashSet<T, void, void, HeapAllocator> {
};
template<typename T>
class HeapHashCountedSet : public HashCountedSet<T, void, void, HeapAllocator> {
};
template<typename K, typename V>
class HeapHashMap : public HashMap<K, V, void, void, void, HeapAllocator> { };
template<typename T>
class PersistentHeapVector : public Vector<T, 0, HeapAllocator> { };
template <typename Derived>
class VisitorHelper {
public:
template<typename T>
void trace(const T&);
};
class Visitor : public VisitorHelper<Visitor> {
public:
template<typename T, void (T::*method)(Visitor*)>
void registerWeakMembers(const T* obj);
};
class InlinedGlobalMarkingVisitor
: public VisitorHelper<InlinedGlobalMarkingVisitor> {
public:
InlinedGlobalMarkingVisitor* operator->() { return this; }
template<typename T, void (T::*method)(Visitor*)>
void registerWeakMembers(const T* obj);
};
class GarbageCollectedMixin {
public:
virtual void adjustAndMark(Visitor*) const = 0;
virtual bool isHeapObjectAlive(Visitor*) const = 0;
virtual void trace(Visitor*) { }
};
template<typename T>
struct TraceIfNeeded {
static void trace(Visitor*, T*);
};
// blink::ScriptWrappable receives special treatment
// so as to allow it to be used together with GarbageCollected<T>,
// even when its user-declared destructor is provided.
// As it is with Oilpan disabled.
class ScriptWrappable {
public:
~ScriptWrappable() { /* user-declared, thus, non-trivial */ }
};
}
namespace WTF {
template<typename T>
struct VectorTraits<blink::Member<T> > {
static const bool needsDestruction = false;
};
}
#endif