Changeset 73907 in webkit
- Timestamp:
- Dec 13, 2010 5:34:00 AM (13 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r73904 r73907 1 2010-12-13 Anton Muhin <antonm@chromium.org> 2 3 Reviewed by Pavel Feldman. 4 5 [v8] More CSS wrappers GC work: keep document's style sheets, style sheet and css rule lists' items in proper object groups 6 https://bugs.webkit.org/show_bug.cgi?id=50828 7 8 * bindings/v8/DOMData.h: 9 (WebCore::DOMData::WrapperMapObjectRemover::visitDOMWrapper): 10 (WebCore::DOMData::removeObjectsFromWrapperMap): 11 * bindings/v8/DOMDataStore.h: 12 (WebCore::ChunkedTable::visit): 13 (WebCore::ChunkedTable::visitEntries): 14 (WebCore::DOMDataStore::IntrusiveDOMWrapperMap::visit): 15 (WebCore::DOMDataStore::IntrusiveDOMWrapperMap::ChunkedTableTraits::visit): 16 * bindings/v8/V8DOMMap.cpp: 17 (WebCore::removeAllDOMObjectsInCurrentThread): 18 (WebCore::visitDOMNodesInCurrentThread): 19 (WebCore::visitDOMObjectsInCurrentThread): 20 (WebCore::visitActiveDOMObjectsInCurrentThread): 21 (WebCore::visitDOMSVGElementInstancesInCurrentThread): 22 * bindings/v8/V8DOMMap.h: 23 (WebCore::WeakReferenceMap::visit): 24 * bindings/v8/V8GCController.cpp: 25 (WebCore::DOMObjectVisitor::visitDOMWrapper): 26 (WebCore::EnsureWeakDOMNodeVisitor::visitDOMWrapper): 27 (WebCore::GCPrologueVisitor::visitDOMWrapper): 28 (WebCore::NodeGrouperVisitor::visitDOMWrapper): 29 (WebCore::NodeGrouperVisitor::applyGrouping): 30 (WebCore::DOMObjectGrouperVisitor::visitDOMWrapper): 31 (WebCore::GCEpilogueVisitor::visitDOMWrapper): 32 1 33 2010-12-13 Zoltan Herczeg <zherczeg@webkit.org> 2 34 -
trunk/WebCore/bindings/v8/DOMData.h
r63751 r73907 56 56 57 57 template<typename T> 58 static void removeObjectsFromWrapperMap( AbstractWeakReferenceMap<T, v8::Object>& domMap);58 static void removeObjectsFromWrapperMap(DOMDataStore* store, AbstractWeakReferenceMap<T, v8::Object>& domMap); 59 59 60 60 ThreadIdentifier owningThread() const { return m_owningThread; } … … 66 66 class WrapperMapObjectRemover : public WeakReferenceMap<T, v8::Object>::Visitor { 67 67 public: 68 virtual void visitDOMWrapper( T* domObject, v8::Persistent<v8::Object> v8Object)68 virtual void visitDOMWrapper(DOMDataStore* store, T* domObject, v8::Persistent<v8::Object> v8Object) 69 69 { 70 70 WrapperTypeInfo* type = V8DOMWrapper::domWrapperType(v8Object); … … 103 103 104 104 template<typename T> 105 void DOMData::removeObjectsFromWrapperMap( AbstractWeakReferenceMap<T, v8::Object>& domMap)105 void DOMData::removeObjectsFromWrapperMap(DOMDataStore* store, AbstractWeakReferenceMap<T, v8::Object>& domMap) 106 106 { 107 107 WrapperMapObjectRemover<T> remover; 108 domMap.visit( &remover);108 domMap.visit(store, &remover); 109 109 domMap.clear(); 110 110 } -
trunk/WebCore/bindings/v8/DOMDataStore.h
r72390 r73907 107 107 } 108 108 109 void visit( typename Traits::Visitor* visitor)109 void visit(DOMDataStore* store, typename Traits::Visitor* visitor) 110 110 { 111 111 if (!m_chunks) 112 112 return; 113 113 114 visitEntries( m_chunks->m_entries, m_current, visitor);114 visitEntries(store, m_chunks->m_entries, m_current, visitor); 115 115 for (Chunk* chunk = m_chunks->m_previous; chunk; chunk = chunk->m_previous) 116 visitEntries( chunk->m_entries, chunk->m_entries + CHUNK_SIZE, visitor);116 visitEntries(store, chunk->m_entries, chunk->m_entries + CHUNK_SIZE, visitor); 117 117 } 118 118 … … 130 130 } 131 131 132 static void visitEntries( T* first, T* last, typename Traits::Visitor* visitor)132 static void visitEntries(DOMDataStore* store, T* first, T* last, typename Traits::Visitor* visitor) 133 133 { 134 134 for (T* entry = first; entry < last; entry++) 135 Traits::visit( entry, visitor);135 Traits::visit(store, entry, visitor); 136 136 } 137 137 … … 186 186 } 187 187 188 virtual void visit( Visitor* visitor)189 { 190 m_table.visit( visitor);188 virtual void visit(DOMDataStore* store, Visitor* visitor) 189 { 190 m_table.visit(store, visitor); 191 191 } 192 192 … … 221 221 } 222 222 223 static void visit( v8::Persistent<v8::Object>* entry, Visitor* visitor)223 static void visit(DOMDataStore* store, v8::Persistent<v8::Object>* entry, Visitor* visitor) 224 224 { 225 225 Node* node = V8Node::toNative(*entry); 226 226 ASSERT(node->wrapper() == entry); 227 227 228 visitor->visitDOMWrapper( node, *entry);228 visitor->visitDOMWrapper(store, node, *entry); 229 229 } 230 230 }; -
trunk/WebCore/bindings/v8/V8DOMMap.cpp
r72390 r73907 91 91 void removeAllDOMObjectsInCurrentThread() 92 92 { 93 DOMDataStore& store = getDOMDataStore(); 94 93 95 v8::HandleScope scope; 94 96 … … 96 98 if (WTF::isMainThread()) { 97 99 // Remove all DOM nodes. 98 DOMData::removeObjectsFromWrapperMap<Node>( getDOMNodeMap());100 DOMData::removeObjectsFromWrapperMap<Node>(&store, store.domNodeMap()); 99 101 100 102 #if ENABLE(SVG) 101 103 // Remove all SVG element instances in the wrapper map. 102 DOMData::removeObjectsFromWrapperMap<SVGElementInstance>( getDOMSVGElementInstanceMap());104 DOMData::removeObjectsFromWrapperMap<SVGElementInstance>(&store, store.domSvgElementInstanceMap()); 103 105 #endif 104 106 } 105 107 106 108 // Remove all DOM objects in the wrapper map. 107 DOMData::removeObjectsFromWrapperMap<void>( getDOMObjectMap());109 DOMData::removeObjectsFromWrapperMap<void>(&store, store.domObjectMap()); 108 110 109 111 // Remove all active DOM objects in the wrapper map. 110 DOMData::removeObjectsFromWrapperMap<void>( getActiveDOMObjectMap());112 DOMData::removeObjectsFromWrapperMap<void>(&store, store.activeDomObjectMap()); 111 113 } 112 114 … … 122 124 continue; 123 125 124 store->domNodeMap().visit( visitor);126 store->domNodeMap().visit(store, visitor); 125 127 } 126 128 } … … 137 139 continue; 138 140 139 store->domObjectMap().visit( visitor);141 store->domObjectMap().visit(store, visitor); 140 142 } 141 143 } … … 152 154 continue; 153 155 154 store->activeDomObjectMap().visit( visitor);156 store->activeDomObjectMap().visit(store, visitor); 155 157 } 156 158 } … … 169 171 continue; 170 172 171 store->domSvgElementInstanceMap().visit( visitor);173 store->domSvgElementInstanceMap().visit(store, visitor); 172 174 } 173 175 } -
trunk/WebCore/bindings/v8/V8DOMMap.h
r73491 r73907 37 37 38 38 namespace WebCore { 39 class DOMDataStore; 39 40 class Node; 40 41 #if ENABLE(SVG) … … 51 52 virtual void startMap() { } 52 53 virtual void endMap() { } 53 virtual void visitDOMWrapper( KeyType* key, v8::Persistent<ValueType> object) = 0;54 virtual void visitDOMWrapper(DOMDataStore* store, KeyType* key, v8::Persistent<ValueType> object) = 0; 54 55 protected: 55 56 virtual ~Visitor() { } … … 59 60 virtual void set(KeyType* obj, v8::Persistent<ValueType> wrapper) = 0; 60 61 virtual bool contains(KeyType* obj) = 0; 61 virtual void visit( Visitor* visitor) = 0;62 virtual void visit(DOMDataStore* store, Visitor* visitor) = 0; 62 63 virtual bool removeIfPresent(KeyType* key, v8::Persistent<v8::Data> value) = 0; 63 64 virtual void clear() = 0; … … 123 124 bool contains(KeyType* obj) { return m_map.contains(obj); } 124 125 125 virtual void visit( typename Parent::Visitor* visitor)126 virtual void visit(DOMDataStore* store, typename Parent::Visitor* visitor) 126 127 { 127 128 visitor->startMap(); 128 129 typename HashMap<KeyType*, ValueType*>::iterator it = m_map.begin(); 129 130 for (; it != m_map.end(); ++it) 130 visitor->visitDOMWrapper( it->first, v8::Persistent<ValueType>(it->second));131 visitor->visitDOMWrapper(store, it->first, v8::Persistent<ValueType>(it->second)); 131 132 visitor->endMap(); 132 133 } -
trunk/WebCore/bindings/v8/V8GCController.cpp
r73491 r73907 46 46 #include "V8CSSImportRule.h" 47 47 #include "V8CSSMediaRule.h" 48 #include "V8CSSRuleList.h" 48 49 #include "V8CSSStyleRule.h" 49 50 #include "V8CSSStyleSheet.h" … … 51 52 #include "V8MessagePort.h" 52 53 #include "V8Proxy.h" 54 #include "V8StyleSheetList.h" 53 55 #include "WrapperTypeInfo.h" 54 56 … … 136 138 class DOMObjectVisitor : public DOMWrapperMap<void>::Visitor { 137 139 public: 138 void visitDOMWrapper( void* object, v8::Persistent<v8::Object> wrapper)140 void visitDOMWrapper(DOMDataStore* store, void* object, v8::Persistent<v8::Object> wrapper) 139 141 { 140 142 WrapperTypeInfo* type = V8DOMWrapper::domWrapperType(wrapper); … … 146 148 class EnsureWeakDOMNodeVisitor : public DOMWrapperMap<Node>::Visitor { 147 149 public: 148 void visitDOMWrapper( Node* object, v8::Persistent<v8::Object> wrapper)150 void visitDOMWrapper(DOMDataStore* store, Node* object, v8::Persistent<v8::Object> wrapper) 149 151 { 150 152 UNUSED_PARAM(object); … … 194 196 class GCPrologueVisitor : public DOMWrapperMap<void>::Visitor { 195 197 public: 196 void visitDOMWrapper( void* object, v8::Persistent<v8::Object> wrapper)198 void visitDOMWrapper(DOMDataStore* store, void* object, v8::Persistent<v8::Object> wrapper) 197 199 { 198 200 WrapperTypeInfo* typeInfo = V8DOMWrapper::domWrapperType(wrapper); … … 288 290 } 289 291 290 void visitDOMWrapper( Node* node, v8::Persistent<v8::Object> wrapper)292 void visitDOMWrapper(DOMDataStore* store, Node* node, v8::Persistent<v8::Object> wrapper) 291 293 { 292 294 // If the node is in document, put it in the ownerDocument's object group. … … 321 323 } 322 324 m_grouper.append(GrouperItem(groupId, wrapper)); 323 }324 325 void applyGrouping()326 {327 /* FIXME: Re-enabled this code to avoid GCing these wrappers!328 Currently this depends on looking up the wrapper329 during a GC, but we don't know which isolated world330 we're in, so it's unclear which map to look in...331 325 332 326 // If the node is styled and there is a wrapper for the inline … … 334 328 // wrapper alive as well, so we add it to the object group. 335 329 if (node->isStyledElement()) { 336 StyledElement* element = reinterpret_cast<StyledElement*>(node); 337 CSSStyleDeclaration* style = element->inlineStyleDecl(); 338 if (style != NULL) { 339 wrapper = getDOMObjectMap().get(style); 330 StyledElement* element = reinterpret_cast<StyledElement*>(node); 331 CSSStyleDeclaration* style = element->inlineStyleDecl(); 332 if (style) { 333 wrapper = store->domObjectMap().get(style); 334 if (!wrapper.IsEmpty()) 335 m_grouper.append(GrouperItem(groupId, wrapper)); 336 } 337 } 338 339 if (node->isDocumentNode()) { 340 Document* document = reinterpret_cast<Document*>(node); 341 wrapper = store->domObjectMap().get(document->styleSheets()); 340 342 if (!wrapper.IsEmpty()) 341 group.append(wrapper); 342 } 343 } 344 */ 343 m_grouper.append(GrouperItem(groupId, wrapper)); 344 } 345 } 346 347 void applyGrouping() 348 { 345 349 makeV8ObjectGroups(m_grouper); 346 350 } … … 366 370 } 367 371 368 void visitDOMWrapper( void* object, v8::Persistent<v8::Object> wrapper)372 void visitDOMWrapper(DOMDataStore* store, void* object, v8::Persistent<v8::Object> wrapper) 369 373 { 370 374 WrapperTypeInfo* typeInfo = V8DOMWrapper::domWrapperType(wrapper); 371 // FIXME: extend WrapperTypeInfo with isStyle to simplify the check below. 375 // FIXME: extend WrapperTypeInfo with isStyle to simplify the check below or consider 376 // adding a virtual method to WrapperTypeInfo which would know how to group objects. 372 377 // FIXME: check if there are other StyleBase wrappers we should care of. 373 if (!V8CSSStyleSheet::info.equals(typeInfo) 374 && !V8CSSCharsetRule::info.equals(typeInfo) 375 && !V8CSSFontFaceRule::info.equals(typeInfo) 376 && !V8CSSStyleRule::info.equals(typeInfo) 377 && !V8CSSImportRule::info.equals(typeInfo) 378 && !V8CSSMediaRule::info.equals(typeInfo)) { 379 return; 380 } 381 StyleBase* styleBase = static_cast<StyleBase*>(object); 382 383 // We put the whole tree of style elements into a single object group. 384 // To achieve that we group elements by the roots of their trees. 385 StyleBase* root = styleBase; 386 ASSERT(root); 387 while (true) { 388 StyleBase* parent = root->parent(); 389 if (!parent) 390 break; 391 root = parent; 392 } 393 // Group id is an address of the root. 394 uintptr_t groupId = reinterpret_cast<uintptr_t>(root); 395 m_grouper.append(GrouperItem(groupId, wrapper)); 378 if (V8CSSStyleSheet::info.equals(typeInfo) 379 || V8CSSCharsetRule::info.equals(typeInfo) 380 || V8CSSFontFaceRule::info.equals(typeInfo) 381 || V8CSSStyleRule::info.equals(typeInfo) 382 || V8CSSImportRule::info.equals(typeInfo) 383 || V8CSSMediaRule::info.equals(typeInfo)) { 384 StyleBase* styleBase = static_cast<StyleBase*>(object); 385 386 // We put the whole tree of style elements into a single object group. 387 // To achieve that we group elements by the roots of their trees. 388 StyleBase* root = styleBase; 389 ASSERT(root); 390 while (true) { 391 StyleBase* parent = root->parent(); 392 if (!parent) 393 break; 394 root = parent; 395 } 396 // Group id is an address of the root. 397 uintptr_t groupId = reinterpret_cast<uintptr_t>(root); 398 m_grouper.append(GrouperItem(groupId, wrapper)); 399 } else if (V8StyleSheetList::info.equals(typeInfo)) { 400 StyleSheetList* styleSheetList = static_cast<StyleSheetList*>(object); 401 uintptr_t groupId = reinterpret_cast<uintptr_t>(styleSheetList); 402 m_grouper.append(GrouperItem(groupId, wrapper)); 403 for (unsigned i = 0; i < styleSheetList->length(); i++) { 404 StyleSheet* styleSheet = styleSheetList->item(i); 405 wrapper = store->domObjectMap().get(styleSheet); 406 if (!wrapper.IsEmpty()) 407 m_grouper.append(GrouperItem(groupId, wrapper)); 408 } 409 } else if (V8CSSRuleList::info.equals(typeInfo)) { 410 CSSRuleList* cssRuleList = static_cast<CSSRuleList*>(object); 411 uintptr_t groupId = reinterpret_cast<uintptr_t>(cssRuleList); 412 m_grouper.append(GrouperItem(groupId, wrapper)); 413 for (unsigned i = 0; i < cssRuleList->length(); i++) { 414 CSSRule* cssRule = cssRuleList->item(i); 415 wrapper = store->domObjectMap().get(cssRule); 416 if (!wrapper.IsEmpty()) 417 m_grouper.append(GrouperItem(groupId, wrapper)); 418 } 419 } 396 420 } 397 421 … … 430 454 class GCEpilogueVisitor : public DOMWrapperMap<void>::Visitor { 431 455 public: 432 void visitDOMWrapper( void* object, v8::Persistent<v8::Object> wrapper)456 void visitDOMWrapper(DOMDataStore* store, void* object, v8::Persistent<v8::Object> wrapper) 433 457 { 434 458 WrapperTypeInfo* typeInfo = V8DOMWrapper::domWrapperType(wrapper);
Note: See TracChangeset
for help on using the changeset viewer.