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.h114
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