summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/runtime/WeakGCMap.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/runtime/WeakGCMap.h')
-rw-r--r--Source/JavaScriptCore/runtime/WeakGCMap.h72
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