/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- * vim: set ts=8 sts=4 et sw=4 tw=99: * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef js_SweepingAPI_h #define js_SweepingAPI_h #include "js/HeapAPI.h" namespace JS { template class WeakCache; namespace shadow { JS_PUBLIC_API(void) RegisterWeakCache(JS::Zone* zone, JS::WeakCache* cachep); JS_PUBLIC_API(void) RegisterWeakCache(JSRuntime* rt, JS::WeakCache* cachep); } // namespace shadow // A WeakCache stores the given Sweepable container and links itself into a // list of such caches that are swept during each GC. A WeakCache can be // specific to a zone, or across a whole runtime, depending on which // constructor is used. template class WeakCache : public js::MutableWrappedPtrOperations>, private mozilla::LinkedListElement> { friend class mozilla::LinkedListElement>; friend class mozilla::LinkedList>; WeakCache() = delete; WeakCache(const WeakCache&) = delete; using SweepFn = void (*)(T*); SweepFn sweeper; T cache; public: using Type = T; template WeakCache(Zone* zone, U&& initial) : cache(mozilla::Forward(initial)) { sweeper = GCPolicy::sweep; shadow::RegisterWeakCache(zone, reinterpret_cast*>(this)); } template WeakCache(JSRuntime* rt, U&& initial) : cache(mozilla::Forward(initial)) { sweeper = GCPolicy::sweep; shadow::RegisterWeakCache(rt, reinterpret_cast*>(this)); } WeakCache(WeakCache&& other) : sweeper(other.sweeper), cache(mozilla::Move(other.cache)) { } const T& get() const { return cache; } T& get() { return cache; } void sweep() { sweeper(&cache); } }; } // namespace JS #endif // js_SweepingAPI_h