162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// found in the LICENSE file. 462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#ifndef HEAP_STUBS_H_ 662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define HEAP_STUBS_H_ 762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "stddef.h" 962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define WTF_MAKE_FAST_ALLOCATED \ 1162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public: \ 1262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void* operator new(size_t, void* p); \ 1362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void* operator new[](size_t, void* p); \ 1462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void* operator new(size_t size); \ 1562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch private: \ 1662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef int __thisIsHereToForceASemicolonAfterThisMacro 1762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace WTF { 1962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 2062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> class RefCounted { }; 2162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 2262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> class RawPtr { 2362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic: 2462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch operator T*() const { return 0; } 2562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch T* operator->() { return 0; } 2662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 2762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 2862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> class RefPtr { 2962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic: 3062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ~RefPtr() { } 3162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch operator T*() const { return 0; } 3262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch T* operator->() { return 0; } 3362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 3462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 3562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> class OwnPtr { 3662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic: 3762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ~OwnPtr() { } 3862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch operator T*() const { return 0; } 3962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch T* operator->() { return 0; } 4062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 4162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 4262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass DefaultAllocator { 4362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic: 4462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const bool isGarbageCollected = false; 4562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 4662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 4762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> 4862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochstruct VectorTraits { 4962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const bool needsDestruction = true; 5062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 5162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 5262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<size_t inlineCapacity, bool isGarbageCollected, bool tNeedsDestruction> 5362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass VectorDestructorBase { 5462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic: 5562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ~VectorDestructorBase() {} 5662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 5762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 5862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<size_t inlineCapacity> 5962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass VectorDestructorBase<inlineCapacity, true, false> {}; 6062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 6162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<> 6262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass VectorDestructorBase<0, true, true> {}; 6362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 6462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate< 6562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typename T, 6662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch size_t inlineCapacity = 0, 6762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typename Allocator = DefaultAllocator> 6862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass Vector : public VectorDestructorBase<inlineCapacity, 6962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Allocator::isGarbageCollected, 7062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch VectorTraits<T>::needsDestruction> { 7162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public: 7262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch using iterator = T*; 7362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch using const_iterator = const T*; 7462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch using reverse_iterator = T*; 7562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch using const_reverse_iterator = const T*; 7662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 7762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch size_t size(); 7862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch T& operator[](size_t); 7962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 8062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 8162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate <typename T, 8262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch size_t inlineCapacity = 0, 8362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typename Allocator = DefaultAllocator> 8462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass Deque { 8562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public: 8662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch using iterator = T*; 8762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch using const_iterator = const T*; 8862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch using reverse_iterator = T*; 8962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch using const_reverse_iterator = const T*; 9062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 9162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 9262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate <typename ValueArg, 9362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typename HashArg = void, 9462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typename TraitsArg = void, 9562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typename Allocator = DefaultAllocator> 9662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass HashSet { 9762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public: 9862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef ValueArg* iterator; 9962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef const ValueArg* const_iterator; 10062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef ValueArg* reverse_iterator; 10162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef const ValueArg* const_reverse_iterator; 10262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 10362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 10462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate <typename ValueArg, 10562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typename HashArg = void, 10662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typename TraitsArg = void, 10762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typename Allocator = DefaultAllocator> 10862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass ListHashSet { 10962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public: 11062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef ValueArg* iterator; 11162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef const ValueArg* const_iterator; 11262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef ValueArg* reverse_iterator; 11362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef const ValueArg* const_reverse_iterator; 11462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 11562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 11662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate <typename ValueArg, 11762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typename HashArg = void, 11862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typename TraitsArg = void, 11962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typename Allocator = DefaultAllocator> 12062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass LinkedHashSet { 12162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public: 12262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef ValueArg* iterator; 12362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef const ValueArg* const_iterator; 12462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef ValueArg* reverse_iterator; 12562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef const ValueArg* const_reverse_iterator; 12662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 12762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 12862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate< 12962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typename ValueArg, 13062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typename HashArg = void, 13162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typename TraitsArg = void, 13262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typename Allocator = DefaultAllocator> 13362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass HashCountedSet {}; 13462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 13562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate <typename KeyArg, 13662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typename MappedArg, 13762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typename HashArg = void, 13862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typename KeyTraitsArg = void, 13962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typename MappedTraitsArg = void, 14062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typename Allocator = DefaultAllocator> 14162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass HashMap { 14262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public: 14362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef MappedArg* iterator; 14462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef const MappedArg* const_iterator; 14562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef MappedArg* reverse_iterator; 14662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef const MappedArg* const_reverse_iterator; 14762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 14862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 14962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 15062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Empty namespace declaration to exercise internal 15162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// handling of namespace equality. 15262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace std { 15362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch /* empty */ 15462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 15562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 15662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace std { 15762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 15862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> class unique_ptr { 15962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic: 16062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ~unique_ptr() { } 16162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch operator T*() const { return 0; } 16262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch T* operator->() { return 0; } 16362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 16462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 16562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 16662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 16762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace blink { 16862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 16962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochusing namespace WTF; 17062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 17162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define DISALLOW_NEW() \ 17262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch private: \ 17362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void* operator new(size_t) = delete; \ 17462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void* operator new(size_t, void*) = delete; 17562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 17662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define STACK_ALLOCATED() \ 17762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch private: \ 17862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch __attribute__((annotate("blink_stack_allocated"))) \ 17962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void* operator new(size_t) = delete; \ 18062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void* operator new(size_t, void*) = delete; 18162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 18262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define ALLOW_ONLY_INLINE_ALLOCATION() \ 18362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public: \ 18462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void* operator new(size_t, void*); \ 18562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch private: \ 18662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void* operator new(size_t) = delete; 18762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 18862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define GC_PLUGIN_IGNORE(bug) \ 18962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch __attribute__((annotate("blink_gc_plugin_ignore"))) 19062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 19162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define USING_GARBAGE_COLLECTED_MIXIN(type) \ 19262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic: \ 19362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch virtual void adjustAndMark(Visitor*) const override { } \ 19462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch virtual bool isHeapObjectAlive(Visitor*) const override { return 0; } 19562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 19662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define EAGERLY_FINALIZED() typedef int IsEagerlyFinalizedMarker 19762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 19862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> class GarbageCollected { }; 19962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 20062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> 20162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass GarbageCollectedFinalized : public GarbageCollected<T> { }; 20262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 20362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> 20462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass RefCountedGarbageCollected : public GarbageCollectedFinalized<T> { }; 20562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 20662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> class Member { 20762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic: 20862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch operator T*() const { return 0; } 20962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch T* operator->() { return 0; } 21062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool operator!() const { return false; } 21162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 21262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 21362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> class WeakMember { 21462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic: 21562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch operator T*() const { return 0; } 21662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch T* operator->() { return 0; } 21762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool operator!() const { return false; } 21862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 21962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 22062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> class Persistent { 22162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic: 22262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch operator T*() const { return 0; } 22362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch T* operator->() { return 0; } 22462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool operator!() const { return false; } 22562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 22662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 22762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> class WeakPersistent { 22862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic: 22962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch operator T*() const { return 0; } 23062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch T* operator->() { return 0; } 23162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool operator!() const { return false; } 23262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 23362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 23462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> class CrossThreadPersistent { 23562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic: 23662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch operator T*() const { return 0; } 23762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch T* operator->() { return 0; } 23862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool operator!() const { return false; } 23962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 24062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 24162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> class CrossThreadWeakPersistent { 24262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic: 24362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch operator T*() const { return 0; } 24462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch T* operator->() { return 0; } 24562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool operator!() const { return false; } 24662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 24762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 24862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass HeapAllocator { 24962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic: 25062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const bool isGarbageCollected = true; 25162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 25262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 25362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T, size_t inlineCapacity = 0> 25462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass HeapVector : public Vector<T, inlineCapacity, HeapAllocator> { }; 25562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 25662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T, size_t inlineCapacity = 0> 25762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass HeapDeque : public Vector<T, inlineCapacity, HeapAllocator> { }; 25862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 25962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> 26062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass HeapHashSet : public HashSet<T, void, void, HeapAllocator> { }; 26162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 26262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> 26362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass HeapListHashSet : public ListHashSet<T, void, void, HeapAllocator> { }; 26462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 26562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> 26662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass HeapLinkedHashSet : public LinkedHashSet<T, void, void, HeapAllocator> { 26762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 26862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 26962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> 27062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass HeapHashCountedSet : public HashCountedSet<T, void, void, HeapAllocator> { 27162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 27262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 27362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename K, typename V> 27462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass HeapHashMap : public HashMap<K, V, void, void, void, HeapAllocator> { }; 27562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 27662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> 27762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass PersistentHeapVector : public Vector<T, 0, HeapAllocator> { }; 27862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 27962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate <typename Derived> 28062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass VisitorHelper { 28162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic: 28262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch template<typename T> 28362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void trace(const T&); 28462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 28562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 28662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass Visitor : public VisitorHelper<Visitor> { 28762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic: 28862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch template<typename T, void (T::*method)(Visitor*)> 28962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void registerWeakMembers(const T* obj); 29062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 29162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 29262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass InlinedGlobalMarkingVisitor 29362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch : public VisitorHelper<InlinedGlobalMarkingVisitor> { 29462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic: 29562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch InlinedGlobalMarkingVisitor* operator->() { return this; } 29662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 29762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch template<typename T, void (T::*method)(Visitor*)> 29862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void registerWeakMembers(const T* obj); 29962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 30062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 30162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass GarbageCollectedMixin { 30262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochpublic: 30362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch virtual void adjustAndMark(Visitor*) const = 0; 30462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch virtual bool isHeapObjectAlive(Visitor*) const = 0; 30562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch virtual void trace(Visitor*) { } 30662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 30762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 30862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> 30962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochstruct TraceIfNeeded { 31062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static void trace(Visitor*, T*); 31162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 31262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 31362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 31462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 31562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace WTF { 31662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 31762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate<typename T> 31862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochstruct VectorTraits<blink::Member<T> > { 31962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const bool needsDestruction = false; 32062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 32162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 32262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 32362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 32462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#endif 325