WeakGCMap should not inherit from HashMap
https://bugs.webkit.org/show_bug.cgi?id=121964

Reviewed by Geoffrey Garen.

Add the HashMap as a member variable instead and implement the missing member functions.

* runtime/WeakGCMap.h:

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@156476 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/JavaScriptCore/runtime/WeakGCMap.h b/Source/JavaScriptCore/runtime/WeakGCMap.h
index f741fa4..23f888b 100644
--- a/Source/JavaScriptCore/runtime/WeakGCMap.h
+++ b/Source/JavaScriptCore/runtime/WeakGCMap.h
@@ -35,39 +35,39 @@
 // 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> {
+    typename KeyTraitsArg = HashTraits<KeyArg>>
+class WeakGCMap {
     typedef Weak<RawMappedArg> MappedType;
-    typedef HashMap<KeyArg, MappedType, HashArg, KeyTraitsArg> Base;
-    typedef WeakGCMap<KeyArg, RawMappedArg, HashArg, KeyTraitsArg> Self;
+    typedef HashMap<KeyArg, MappedType, HashArg, KeyTraitsArg> HashMapType;
     typedef HashTraits<MappedType> MappedTraits;
     typedef typename MappedTraits::PassInType MappedPassInType;
 
 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;
+    typedef typename HashMapType::KeyType KeyType;
+    typedef typename HashMapType::AddResult AddResult;
+    typedef typename HashMapType::iterator iterator;
+    typedef typename HashMapType::const_iterator const_iterator;
 
     WeakGCMap()
         : m_gcThreshold(minGCThreshold)
     {
     }
 
+    RawMappedArg* get(const KeyType& key) const
+    {
+        return m_map.get(key);
+    }
+
     AddResult set(const KeyType& key, MappedPassInType value)
     {
         gcMapIfNeeded();
-        return Base::set(key, value);
+        return m_map.set(key, value);
     }
 
     AddResult add(const KeyType& key, MappedPassInType value)
     {
         gcMapIfNeeded();
-        AddResult addResult = Base::add(key, nullptr);
+        AddResult addResult = m_map.add(key, nullptr);
         if (!addResult.iterator->value) { // New value or found a zombie value.
             addResult.isNewEntry = true;
             addResult.iterator->value = value;
@@ -75,10 +75,20 @@
         return addResult;
     }
 
+    bool remove(const KeyType& key)
+    {
+        return m_map.remove(key);
+    }
+
+    void clear()
+    {
+        m_map.clear();
+    }
+
     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,12 +96,12 @@
 
     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
     {
-        return find(key) != end();
+        return find(key) != m_map.end();
     }
 
 private:
@@ -100,24 +110,26 @@
     void gcMap()
     {
         Vector<KeyType, 4> zombies;
-        iterator end = this->end();
-        for (iterator it = begin(); it != end; ++it) {
+
+        for (iterator it = m_map.begin(), end = m_map.end(); it != end; ++it) {
             if (!it->value)
                 zombies.append(it->key);
         }
+
         for (size_t i = 0; i < zombies.size(); ++i)
-            remove(zombies[i]);
+            m_map.remove(zombies[i]);
     }
 
     void gcMapIfNeeded()
     {
-        if (size() < m_gcThreshold)
+        if (m_map.size() < m_gcThreshold)
             return;
 
         gcMap();
-        m_gcThreshold = std::max(minGCThreshold, size() * 2 - 1);
+        m_gcThreshold = std::max(minGCThreshold, m_map.size() * 2 - 1);
     }
 
+    HashMapType m_map;
     int m_gcThreshold;
 };