Changeset 51998 in webkit
- Timestamp:
- Dec 11, 2009 9:21:14 AM (14 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r51995 r51998 1 2009-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 1 34 2009-12-11 anton muhin <antonm@chromium.org> 2 35 Reviewed by Adam Barth. -
trunk/WebCore/bindings/v8/DOMData.h
r50826 r51998 51 51 52 52 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); 54 54 55 55 void forgetDelayedObject(void* object) { m_delayedObjectMap.take(object); } … … 72 72 static void derefObject(V8ClassIndex::V8WrapperType type, void* domObject); 73 73 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 74 85 // Stores all the DOM objects that are delayed to be processed when the 75 86 // owning thread gains control. … … 85 96 86 97 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) 88 99 { 89 100 ASSERT(WTF::isMainThread()); … … 94 105 DOMDataStore::InternalDOMWrapperMap<T>* domMap = static_cast<DOMDataStore::InternalDOMWrapperMap<T>*>(store->getDOMWrapperMap(mapType)); 95 106 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)) { 100 108 ASSERT(store->domData()->owningThread() == WTF::currentThread()); 101 109 store->domData()->derefObject(V8DOMWrapper::domWrapperType(v8Object), domObject); … … 107 115 void DOMData::removeObjectsFromWrapperMap(DOMWrapperMap<T>& domMap) 108 116 { 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(); 122 120 } 123 121 -
trunk/WebCore/bindings/v8/DOMDataStore.cpp
r46462 r51998 147 147 v8::HandleScope scope; 148 148 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); 150 150 } 151 151 … … 154 154 v8::HandleScope scope; 155 155 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); 157 157 } 158 158 … … 167 167 for (size_t i = 0; i < list.size(); ++i) { 168 168 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 } 178 174 } 179 175 } … … 185 181 v8::HandleScope scope; 186 182 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)); 188 184 } 189 185 … … 192 188 v8::HandleScope scope; 193 189 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); 195 191 } 196 192 -
trunk/WebCore/bindings/v8/DOMDataStore.h
r46459 r51998 83 83 } 84 84 85 void forgetOnly(KeyType* object) { DOMWrapperMap<KeyType>::forget(object); }86 87 85 private: 88 86 DOMData* m_domData; -
trunk/WebCore/bindings/v8/V8DOMMap.cpp
r51599 r51998 146 146 continue; 147 147 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); 151 149 } 152 150 } … … 163 161 continue; 164 162 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); 168 164 } 169 165 } … … 180 176 continue; 181 177 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); 185 179 } 186 180 } … … 199 193 continue; 200 194 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); 204 196 } 205 197 } … … 216 208 continue; 217 209 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); 221 211 } 222 212 } -
trunk/WebCore/bindings/v8/V8DOMMap.h
r51599 r51998 82 82 } 83 83 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 84 100 bool contains(KeyType* obj) { return m_map.contains(obj); } 85 101 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 } 87 113 88 114 protected: … … 94 120 public: 95 121 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 };101 122 }; 102 123
Note: See TracChangeset
for help on using the changeset viewer.