diff options
Diffstat (limited to 'Source/JavaScriptCore/runtime/WeakGCMap.h')
-rw-r--r-- | Source/JavaScriptCore/runtime/WeakGCMap.h | 114 |
1 files changed, 53 insertions, 61 deletions
diff --git a/Source/JavaScriptCore/runtime/WeakGCMap.h b/Source/JavaScriptCore/runtime/WeakGCMap.h index f741fa4c4..2627030e0 100644 --- a/Source/JavaScriptCore/runtime/WeakGCMap.h +++ b/Source/JavaScriptCore/runtime/WeakGCMap.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Apple Inc. All rights reserved. + * Copyright (C) 2009, 2015 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,59 +26,65 @@ #ifndef WeakGCMap_h #define WeakGCMap_h -#include <heap/Weak.h> -#include <heap/WeakInlines.h> +#include "Weak.h" +#include "WeakInlines.h" #include <wtf/HashMap.h> namespace JSC { // A HashMap with Weak<JSCell> values, which automatically removes values once they're garbage collected. -template<typename KeyArg, typename RawMappedArg, typename HashArg = typename DefaultHash<KeyArg>::Hash, - typename KeyTraitsArg = HashTraits<KeyArg> > -class WeakGCMap : public HashMap<KeyArg, Weak<RawMappedArg>, HashArg, KeyTraitsArg> { - typedef Weak<RawMappedArg> MappedType; - typedef HashMap<KeyArg, MappedType, HashArg, KeyTraitsArg> Base; - typedef WeakGCMap<KeyArg, RawMappedArg, HashArg, KeyTraitsArg> Self; - typedef HashTraits<MappedType> MappedTraits; - typedef typename MappedTraits::PassInType MappedPassInType; +template<typename KeyArg, typename ValueArg, typename HashArg = typename DefaultHash<KeyArg>::Hash, + typename KeyTraitsArg = HashTraits<KeyArg>> +class WeakGCMap { + WTF_MAKE_FAST_ALLOCATED; + typedef Weak<ValueArg> ValueType; + typedef HashMap<KeyArg, ValueType, HashArg, KeyTraitsArg> HashMapType; public: - typedef typename Base::KeyType KeyType; - typedef typename Base::AddResult AddResult; - typedef typename Base::iterator iterator; - typedef typename Base::const_iterator const_iterator; - using Base::begin; - using Base::end; - using Base::size; - using Base::remove; - - WeakGCMap() - : m_gcThreshold(minGCThreshold) + typedef typename HashMapType::KeyType KeyType; + typedef typename HashMapType::AddResult AddResult; + typedef typename HashMapType::iterator iterator; + typedef typename HashMapType::const_iterator const_iterator; + + explicit WeakGCMap(VM&); + ~WeakGCMap(); + + ValueArg* get(const KeyType& key) const + { + return m_map.get(key); + } + + AddResult set(const KeyType& key, ValueType value) { + return m_map.set(key, WTFMove(value)); } - AddResult set(const KeyType& key, MappedPassInType value) + bool remove(const KeyType& key) { - gcMapIfNeeded(); - return Base::set(key, value); + return m_map.remove(key); } - AddResult add(const KeyType& key, MappedPassInType value) + void clear() { - gcMapIfNeeded(); - AddResult addResult = Base::add(key, nullptr); - if (!addResult.iterator->value) { // New value or found a zombie value. - addResult.isNewEntry = true; - addResult.iterator->value = value; + m_map.clear(); + } + + bool isEmpty() const + { + const_iterator it = m_map.begin(); + const_iterator end = m_map.end(); + while (it != end) { + if (it->value) + return true; } - return addResult; + return false; } iterator find(const KeyType& key) { - iterator it = Base::find(key); - iterator end = Base::end(); + iterator it = m_map.find(key); + iterator end = m_map.end(); if (it != end && !it->value) // Found a zombie value. return end; return it; @@ -86,43 +92,29 @@ public: const_iterator find(const KeyType& key) const { - return const_cast<Self*>(this)->find(key); + return const_cast<WeakGCMap*>(this)->find(key); } - bool contains(const KeyType& key) const + template<typename Functor> + void forEach(Functor functor) { - return find(key) != end(); - } - -private: - static const int minGCThreshold = 3; - - void gcMap() - { - Vector<KeyType, 4> zombies; - iterator end = this->end(); - for (iterator it = begin(); it != end; ++it) { - if (!it->value) - zombies.append(it->key); + for (auto& pair : m_map) { + if (pair.value) + functor(pair.key, pair.value.get()); } - for (size_t i = 0; i < zombies.size(); ++i) - remove(zombies[i]); } - void gcMapIfNeeded() + bool contains(const KeyType& key) const { - if (size() < m_gcThreshold) - return; - - gcMap(); - m_gcThreshold = std::max(minGCThreshold, size() * 2 - 1); + return find(key) != m_map.end(); } - int m_gcThreshold; -}; + void pruneStaleEntries(); -template<typename KeyArg, typename RawMappedArg, typename HashArg, typename KeyTraitsArg> -const int WeakGCMap<KeyArg, RawMappedArg, HashArg, KeyTraitsArg>::minGCThreshold; +private: + HashMapType m_map; + VM& m_vm; +}; } // namespace JSC |