Changeset 51998 in webkit


Ignore:
Timestamp:
Dec 11, 2009 9:21:14 AM (14 years ago)
Author:
eric@webkit.org
Message:

2009-12-11 anton muhin <antonm@chromium.org>

Reviewed by Adam Barth.

[v8] refactor WeakReferenceMap.
Move common bits of functionality to reduce duplication.

https://bugs.webkit.org/show_bug.cgi?id=32389

Should be covered by buildbots.

  • bindings/v8/DOMData.h: (WebCore::DOMData::WrapperMapObjectRemover::visitDOMWrapper): (WebCore::DOMData::handleWeakObject): (WebCore::DOMData::removeObjectsFromWrapperMap):
  • bindings/v8/DOMDataStore.cpp: (WebCore::DOMDataStore::weakDOMObjectCallback): (WebCore::DOMDataStore::weakActiveDOMObjectCallback): (WebCore::DOMDataStore::weakNodeCallback): (WebCore::DOMDataStore::weakSVGElementInstanceCallback): (WebCore::DOMDataStore::weakSVGObjectWithContextCallback):
  • bindings/v8/DOMDataStore.h:
  • bindings/v8/V8DOMMap.cpp: (WebCore::visitDOMNodesInCurrentThread): (WebCore::visitDOMObjectsInCurrentThread): (WebCore::visitActiveDOMObjectsInCurrentThread): (WebCore::visitDOMSVGElementInstancesInCurrentThread): (WebCore::visitSVGObjectsInCurrentThread):
  • bindings/v8/V8DOMMap.h: (WebCore::WeakReferenceMap::removeIfPresent): (WebCore::WeakReferenceMap::clear): (WebCore::WeakReferenceMap::visit):
Location:
trunk/WebCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r51995 r51998  
     12009-12-11  anton muhin  <antonm@chromium.org>
     2
     3        Reviewed by Adam Barth.
     4
     5        [v8] refactor WeakReferenceMap.
     6        Move common bits of functionality to reduce duplication.
     7
     8        https://bugs.webkit.org/show_bug.cgi?id=32389
     9
     10        Should be covered by buildbots.
     11
     12        * bindings/v8/DOMData.h:
     13        (WebCore::DOMData::WrapperMapObjectRemover::visitDOMWrapper):
     14        (WebCore::DOMData::handleWeakObject):
     15        (WebCore::DOMData::removeObjectsFromWrapperMap):
     16        * bindings/v8/DOMDataStore.cpp:
     17        (WebCore::DOMDataStore::weakDOMObjectCallback):
     18        (WebCore::DOMDataStore::weakActiveDOMObjectCallback):
     19        (WebCore::DOMDataStore::weakNodeCallback):
     20        (WebCore::DOMDataStore::weakSVGElementInstanceCallback):
     21        (WebCore::DOMDataStore::weakSVGObjectWithContextCallback):
     22        * bindings/v8/DOMDataStore.h:
     23        * bindings/v8/V8DOMMap.cpp:
     24        (WebCore::visitDOMNodesInCurrentThread):
     25        (WebCore::visitDOMObjectsInCurrentThread):
     26        (WebCore::visitActiveDOMObjectsInCurrentThread):
     27        (WebCore::visitDOMSVGElementInstancesInCurrentThread):
     28        (WebCore::visitSVGObjectsInCurrentThread):
     29        * bindings/v8/V8DOMMap.h:
     30        (WebCore::WeakReferenceMap::removeIfPresent):
     31        (WebCore::WeakReferenceMap::clear):
     32        (WebCore::WeakReferenceMap::visit):
     33
    1342009-12-11  anton muhin  <antonm@chromium.org>
    235        Reviewed by Adam Barth.
  • trunk/WebCore/bindings/v8/DOMData.h

    r50826 r51998  
    5151
    5252        template<typename T>
    53         static void handleWeakObject(DOMDataStore::DOMWrapperMapType, v8::Handle<v8::Object>, T* domObject);
     53        static void handleWeakObject(DOMDataStore::DOMWrapperMapType, v8::Persistent<v8::Object>, T* domObject);
    5454
    5555        void forgetDelayedObject(void* object) { m_delayedObjectMap.take(object); }
     
    7272        static void derefObject(V8ClassIndex::V8WrapperType type, void* domObject);
    7373
     74        template<typename T>
     75        class WrapperMapObjectRemover : public WeakReferenceMap<T, v8::Object>::Visitor {
     76        public:
     77            virtual void visitDOMWrapper(T* domObject, v8::Persistent<v8::Object> v8Object)
     78            {
     79                V8ClassIndex::V8WrapperType type = V8DOMWrapper::domWrapperType(v8Object);
     80                derefObject(type, domObject);
     81                v8Object.Dispose();
     82            }
     83        };
     84
    7485        // Stores all the DOM objects that are delayed to be processed when the
    7586        // owning thread gains control.
     
    8596
    8697    template<typename T>
    87     void DOMData::handleWeakObject(DOMDataStore::DOMWrapperMapType mapType, v8::Handle<v8::Object> v8Object, T* domObject)
     98    void DOMData::handleWeakObject(DOMDataStore::DOMWrapperMapType mapType, v8::Persistent<v8::Object> v8Object, T* domObject)
    8899    {
    89100        ASSERT(WTF::isMainThread());
     
    94105            DOMDataStore::InternalDOMWrapperMap<T>* domMap = static_cast<DOMDataStore::InternalDOMWrapperMap<T>*>(store->getDOMWrapperMap(mapType));
    95106
    96             v8::Handle<v8::Object> wrapper = domMap->get(domObject);
    97             if (*wrapper == *v8Object) {
    98                 // Clear the JS reference.
    99                 domMap->forgetOnly(domObject);
     107            if (domMap->removeIfPresent(domObject, v8Object)) {
    100108                ASSERT(store->domData()->owningThread() == WTF::currentThread());
    101109                store->domData()->derefObject(V8DOMWrapper::domWrapperType(v8Object), domObject);
     
    107115    void DOMData::removeObjectsFromWrapperMap(DOMWrapperMap<T>& domMap)
    108116    {
    109         for (typename WTF::HashMap<T*, v8::Object*>::iterator iter(domMap.impl().begin()); iter != domMap.impl().end(); ++iter) {
    110             T* domObject = static_cast<T*>(iter->first);
    111             v8::Persistent<v8::Object> v8Object(iter->second);
    112 
    113             V8ClassIndex::V8WrapperType type = V8DOMWrapper::domWrapperType(v8::Handle<v8::Object>::Cast(v8Object));
    114 
    115             // Deref the DOM object.
    116             derefObject(type, domObject);
    117 
    118             // Clear the JS wrapper.
    119             v8Object.Dispose();
    120         }
    121         domMap.impl().clear();
     117        WrapperMapObjectRemover<T> remover;
     118        domMap.visit(&remover);
     119        domMap.clear();
    122120    }
    123121
  • trunk/WebCore/bindings/v8/DOMDataStore.cpp

    r46462 r51998  
    147147    v8::HandleScope scope;
    148148    ASSERT(v8Object->IsObject());
    149     DOMData::handleWeakObject(DOMDataStore::DOMObjectMap, v8::Handle<v8::Object>::Cast(v8Object), domObject);
     149    DOMData::handleWeakObject(DOMDataStore::DOMObjectMap, v8::Persistent<v8::Object>::Cast(v8Object), domObject);
    150150}
    151151
     
    154154    v8::HandleScope scope;
    155155    ASSERT(v8Object->IsObject());
    156     DOMData::handleWeakObject(DOMDataStore::ActiveDOMObjectMap, v8::Handle<v8::Object>::Cast(v8Object), domObject);
     156    DOMData::handleWeakObject(DOMDataStore::ActiveDOMObjectMap, v8::Persistent<v8::Object>::Cast(v8Object), domObject);
    157157}
    158158
     
    167167    for (size_t i = 0; i < list.size(); ++i) {
    168168        DOMDataStore* store = list[i];
    169         HashMap<Node*, v8::Object*>& domMapImpl = store->domNodeMap().impl();
    170         HashMap<Node*, v8::Object*>::iterator it = domMapImpl.find(node);
    171         if (it == domMapImpl.end() || it->second != *v8Object)
    172             continue;
    173         ASSERT(store->domData()->owningThread() == WTF::currentThread());
    174         v8Object.Dispose();
    175         domMapImpl.remove(it);
    176         node->deref();  // Nobody overrides Node::deref so it's safe
    177         break;  // There might be at most one wrapper for the node in world's maps
     169        if (store->domNodeMap().removeIfPresent(node, v8Object)) {
     170            ASSERT(store->domData()->owningThread() == WTF::currentThread());
     171            node->deref();  // Nobody overrides Node::deref so it's safe
     172            break;  // There might be at most one wrapper for the node in world's maps
     173        }
    178174    }
    179175}
     
    185181    v8::HandleScope scope;
    186182    ASSERT(v8Object->IsObject());
    187     DOMData::handleWeakObject(DOMDataStore::DOMSVGElementInstanceMap, v8::Handle<v8::Object>::Cast(v8Object), static_cast<SVGElementInstance*>(domObject));
     183    DOMData::handleWeakObject(DOMDataStore::DOMSVGElementInstanceMap, v8::Persistent<v8::Object>::Cast(v8Object), static_cast<SVGElementInstance*>(domObject));
    188184}
    189185
     
    192188    v8::HandleScope scope;
    193189    ASSERT(v8Object->IsObject());
    194     DOMData::handleWeakObject(DOMDataStore::DOMSVGObjectWithContextMap, v8::Handle<v8::Object>::Cast(v8Object), domObject);
     190    DOMData::handleWeakObject(DOMDataStore::DOMSVGObjectWithContextMap, v8::Persistent<v8::Object>::Cast(v8Object), domObject);
    195191}
    196192
  • trunk/WebCore/bindings/v8/DOMDataStore.h

    r46459 r51998  
    8383            }
    8484
    85             void forgetOnly(KeyType* object) { DOMWrapperMap<KeyType>::forget(object); }
    86 
    8785        private:
    8886            DOMData* m_domData;
  • trunk/WebCore/bindings/v8/V8DOMMap.cpp

    r51599 r51998  
    146146            continue;
    147147
    148         HashMap<Node*, v8::Object*>& map = store->domNodeMap().impl();
    149         for (HashMap<Node*, v8::Object*>::iterator it = map.begin(); it != map.end(); ++it)
    150             visitor->visitDOMWrapper(it->first, v8::Persistent<v8::Object>(it->second));
     148        store->domNodeMap().visit(visitor);
    151149    }
    152150}
     
    163161            continue;
    164162
    165         HashMap<void*, v8::Object*> & map = store->domObjectMap().impl();
    166         for (HashMap<void*, v8::Object*>::iterator it = map.begin(); it != map.end(); ++it)
    167             visitor->visitDOMWrapper(it->first, v8::Persistent<v8::Object>(it->second));
     163        store->domObjectMap().visit(visitor);
    168164    }
    169165}
     
    180176            continue;
    181177
    182         HashMap<void*, v8::Object*>& map = store->activeDomObjectMap().impl();
    183         for (HashMap<void*, v8::Object*>::iterator it = map.begin(); it != map.end(); ++it)
    184             visitor->visitDOMWrapper(it->first, v8::Persistent<v8::Object>(it->second));
     178        store->activeDomObjectMap().visit(visitor);
    185179    }
    186180}
     
    199193            continue;
    200194
    201         HashMap<SVGElementInstance*, v8::Object*> & map = store->domSvgElementInstanceMap().impl();
    202         for (HashMap<SVGElementInstance*, v8::Object*>::iterator it = map.begin(); it != map.end(); ++it)
    203             visitor->visitDOMWrapper(it->first, v8::Persistent<v8::Object>(it->second));
     195        store->domSvgElementInstanceMap().visit(visitor);
    204196    }
    205197}
     
    216208            continue;
    217209
    218         HashMap<void*, v8::Object*>& map = store->domSvgObjectWithContextMap().impl();
    219         for (HashMap<void*, v8::Object*>::iterator it = map.begin(); it != map.end(); ++it)
    220             visitor->visitDOMWrapper(it->first, v8::Persistent<v8::Object>(it->second));
     210        store->domSvgObjectWithContextMap().visit(visitor);
    221211    }
    222212}
  • trunk/WebCore/bindings/v8/V8DOMMap.h

    r51599 r51998  
    8282        }
    8383
     84        bool removeIfPresent(KeyType* key, v8::Persistent<v8::Data> value)
     85        {
     86            typename HashMap<KeyType*, ValueType*>::iterator it = m_map.find(key);
     87            if (it == m_map.end() || it->second != *value)
     88                return false;
     89
     90            m_map.remove(it);
     91            value.Dispose();
     92            return true;
     93        }
     94
     95        void clear()
     96        {
     97            m_map.clear();
     98        }
     99
    84100        bool contains(KeyType* obj) { return m_map.contains(obj); }
    85101
    86         HashMap<KeyType*, ValueType*>& impl() { return m_map; }
     102        class Visitor {
     103        public:
     104            virtual void visitDOMWrapper(KeyType*, v8::Persistent<ValueType>) = 0;
     105        };
     106
     107        virtual void visit(Visitor* visitor)
     108        {
     109            typename HashMap<KeyType*, ValueType*>::iterator it = m_map.begin();
     110            for (; it != m_map.end(); ++it)
     111                visitor->visitDOMWrapper(it->first, v8::Persistent<ValueType>(it->second));
     112        }
    87113
    88114    protected:
     
    94120    public:
    95121        DOMWrapperMap(v8::WeakReferenceCallback callback) : WeakReferenceMap<KeyType, v8::Object>(callback) { }
    96 
    97         class Visitor {
    98         public:
    99           virtual void visitDOMWrapper(KeyType* key, v8::Persistent<v8::Object> object) = 0;
    100         };
    101122    };
    102123
Note: See TracChangeset for help on using the changeset viewer.