diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-05-07 11:21:11 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-05-07 11:21:11 +0200 |
commit | 2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47 (patch) | |
tree | 988e8c5b116dd0466244ae2fe5af8ee9be926d76 /Source/JavaScriptCore/runtime/WeakGCMap.h | |
parent | dd91e772430dc294e3bf478c119ef8d43c0a3358 (diff) | |
download | qtwebkit-2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47.tar.gz |
Imported WebKit commit 7e538425aa020340619e927792f3d895061fb54b (http://svn.webkit.org/repository/webkit/trunk@116286)
Diffstat (limited to 'Source/JavaScriptCore/runtime/WeakGCMap.h')
-rw-r--r-- | Source/JavaScriptCore/runtime/WeakGCMap.h | 74 |
1 files changed, 27 insertions, 47 deletions
diff --git a/Source/JavaScriptCore/runtime/WeakGCMap.h b/Source/JavaScriptCore/runtime/WeakGCMap.h index 1bb3cd5bb..ec010fb4b 100644 --- a/Source/JavaScriptCore/runtime/WeakGCMap.h +++ b/Source/JavaScriptCore/runtime/WeakGCMap.h @@ -51,7 +51,7 @@ class WeakGCMap : private WeakHandleOwner { WTF_MAKE_FAST_ALLOCATED; WTF_MAKE_NONCOPYABLE(WeakGCMap); - typedef HashMap<KeyType, HandleSlot, HashArg, KeyTraitsArg> MapType; + typedef HashMap<KeyType, WeakImpl*, HashArg, KeyTraitsArg> MapType; typedef typename HandleTypes<MappedType>::ExternalType ExternalType; typedef typename MapType::iterator map_iterator; @@ -64,8 +64,7 @@ public: { } - std::pair<KeyType, ExternalType> get() const { return std::make_pair(m_iterator->first, HandleTypes<MappedType>::getFromSlot(m_iterator->second)); } - std::pair<KeyType, HandleSlot> getSlot() const { return *m_iterator; } + std::pair<KeyType, ExternalType> get() const { return std::make_pair(m_iterator->first, HandleTypes<MappedType>::getFromSlot(const_cast<JSValue*>(&m_iterator->second->jsValue()))); } iterator& operator++() { ++m_iterator; return *this; } @@ -79,6 +78,8 @@ public: map_iterator m_iterator; }; + typedef WTF::HashTableAddResult<iterator> AddResult; + WeakGCMap() { } @@ -88,7 +89,7 @@ public: { map_iterator end = m_map.end(); for (map_iterator ptr = m_map.begin(); ptr != end; ++ptr) - HandleHeap::heapFor(ptr->second)->deallocate(ptr->second); + WeakSet::deallocate(ptr->second); m_map.clear(); } @@ -105,63 +106,42 @@ public: void remove(iterator iter) { ASSERT(iter.m_iterator != m_map.end()); - HandleSlot slot = iter.m_iterator->second; - ASSERT(slot); - HandleHeap::heapFor(slot)->deallocate(slot); + WeakImpl* impl = iter.m_iterator->second; + ASSERT(impl); + WeakSet::deallocate(impl); m_map.remove(iter.m_iterator); } ExternalType get(const KeyType& key) const { - return HandleTypes<MappedType>::getFromSlot(m_map.get(key)); + return HandleTypes<MappedType>::getFromSlot(const_cast<JSValue*>(&m_map.get(key)->jsValue())); } - HandleSlot getSlot(const KeyType& key) const + AddResult add(JSGlobalData&, const KeyType& key, ExternalType value) { - return m_map.get(key); - } + typename MapType::AddResult result = m_map.add(key, 0); + if (result.isNewEntry) + result.iterator->second = WeakSet::allocate(value, this, FinalizerCallback::finalizerContextFor(key)); - pair<iterator, bool> add(JSGlobalData& globalData, const KeyType& key, ExternalType value) - { - pair<typename MapType::iterator, bool> iter = m_map.add(key, 0); - if (iter.second) { - HandleSlot slot = globalData.heap.handleHeap()->allocate(); - iter.first->second = slot; - HandleHeap::heapFor(slot)->makeWeak(slot, this, FinalizerCallback::finalizerContextFor(key)); - HandleHeap::heapFor(slot)->writeBarrier(slot, value); - *slot = value; - } - return iter; - } - - void set(iterator iter, ExternalType value) - { - HandleSlot slot = iter.m_iterator->second; - ASSERT(slot); - HandleHeap::heapFor(slot)->writeBarrier(slot, value); - *slot = value; + // WeakGCMap exposes a different iterator, so we need to wrap it and create our own AddResult. + return AddResult(iterator(result.iterator), result.isNewEntry); } - void set(JSGlobalData& globalData, const KeyType& key, ExternalType value) + void set(JSGlobalData&, const KeyType& key, ExternalType value) { - pair<typename MapType::iterator, bool> iter = m_map.add(key, 0); - HandleSlot slot = iter.first->second; - if (iter.second) { - slot = globalData.heap.handleHeap()->allocate(); - HandleHeap::heapFor(slot)->makeWeak(slot, this, key); - iter.first->second = slot; - } - HandleHeap::heapFor(slot)->writeBarrier(slot, value); - *slot = value; + typename MapType::AddResult result = m_map.add(key, 0); + if (!result.isNewEntry) + WeakSet::deallocate(result.iterator->second); + result.iterator->second = WeakSet::allocate(value, this, FinalizerCallback::finalizerContextFor(key)); } ExternalType take(const KeyType& key) { - HandleSlot slot = m_map.take(key); - if (!slot) + WeakImpl* impl = m_map.take(key); + if (!impl) return HashTraits<ExternalType>::emptyValue(); - ExternalType result = HandleTypes<MappedType>::getFromSlot(slot); - HandleHeap::heapFor(slot)->deallocate(slot); + ExternalType result = HandleTypes<MappedType>::getFromSlot(const_cast<JSValue*>(&impl->jsValue())); + WeakSet::deallocate(impl); return result; } @@ -178,9 +158,9 @@ public: private: virtual void finalize(Handle<Unknown> handle, void* context) { - HandleSlot slot = m_map.take(FinalizerCallback::keyForFinalizer(context, HandleTypes<MappedType>::getFromSlot(handle.slot()))); - ASSERT(slot); - HandleHeap::heapFor(slot)->deallocate(slot); + WeakImpl* impl = m_map.take(FinalizerCallback::keyForFinalizer(context, HandleTypes<MappedType>::getFromSlot(handle.slot()))); + ASSERT(impl); + WeakSet::deallocate(impl); } MapType m_map; |