diff options
Diffstat (limited to 'Source/JavaScriptCore/runtime/WeakGCMap.h')
| -rw-r--r-- | Source/JavaScriptCore/runtime/WeakGCMap.h | 72 |
1 files changed, 27 insertions, 45 deletions
diff --git a/Source/JavaScriptCore/runtime/WeakGCMap.h b/Source/JavaScriptCore/runtime/WeakGCMap.h index d9c1fb63e..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 @@ -37,6 +37,7 @@ namespace JSC { 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; @@ -46,10 +47,8 @@ public: typedef typename HashMapType::iterator iterator; typedef typename HashMapType::const_iterator const_iterator; - WeakGCMap() - : m_gcThreshold(minGCThreshold) - { - } + explicit WeakGCMap(VM&); + ~WeakGCMap(); ValueArg* get(const KeyType& key) const { @@ -58,19 +57,7 @@ public: AddResult set(const KeyType& key, ValueType value) { - gcMapIfNeeded(); - return m_map.set(key, std::move(value)); - } - - AddResult add(const KeyType& key, ValueType value) - { - gcMapIfNeeded(); - AddResult addResult = m_map.add(key, nullptr); - if (!addResult.iterator->value) { // New value or found a zombie value. - addResult.isNewEntry = true; - addResult.iterator->value = std::move(value); - } - return addResult; + return m_map.set(key, WTFMove(value)); } bool remove(const KeyType& key) @@ -83,6 +70,17 @@ public: 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 false; + } + iterator find(const KeyType& key) { iterator it = m_map.find(key); @@ -97,43 +95,27 @@ public: return const_cast<WeakGCMap*>(this)->find(key); } - bool contains(const KeyType& key) const + template<typename Functor> + void forEach(Functor functor) { - return find(key) != m_map.end(); - } - -private: - static const int minGCThreshold = 3; - - void gcMap() - { - Vector<KeyType, 4> zombies; - - for (iterator it = m_map.begin(), end = m_map.end(); 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) - m_map.remove(zombies[i]); } - void gcMapIfNeeded() + bool contains(const KeyType& key) const { - if (m_map.size() < m_gcThreshold) - return; - - gcMap(); - m_gcThreshold = std::max(minGCThreshold, m_map.size() * 2 - 1); + return find(key) != m_map.end(); } + void pruneStaleEntries(); + +private: HashMapType m_map; - int m_gcThreshold; + VM& m_vm; }; -template<typename KeyArg, typename RawMappedArg, typename HashArg, typename KeyTraitsArg> -const int WeakGCMap<KeyArg, RawMappedArg, HashArg, KeyTraitsArg>::minGCThreshold; - } // namespace JSC #endif // WeakGCMap_h |
