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.h74
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;