OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ights reserved. | 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ights reserved. |
6 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) | 6 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) |
7 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo
bile.com/) | 7 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo
bile.com/) |
8 * | 8 * |
9 * This library is free software; you can redistribute it and/or | 9 * This library is free software; you can redistribute it and/or |
10 * modify it under the terms of the GNU Library General Public | 10 * modify it under the terms of the GNU Library General Public |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
110 } | 110 } |
111 | 111 |
112 void Node::operator delete(void* ptr) | 112 void Node::operator delete(void* ptr) |
113 { | 113 { |
114 ASSERT(isMainThread()); | 114 ASSERT(isMainThread()); |
115 partitionFree(ptr); | 115 partitionFree(ptr); |
116 } | 116 } |
117 #endif | 117 #endif |
118 | 118 |
119 #if DUMP_NODE_STATISTICS | 119 #if DUMP_NODE_STATISTICS |
120 static HashSet<Node*> liveNodeSet; | 120 static HashSet<Node*>& liveNodeSet() |
| 121 { |
| 122 DEFINE_STATIC_LOCAL(HashSet<Node*>, s_liveNodeSet, ()); |
| 123 return s_liveNodeSet; |
| 124 } |
121 #endif | 125 #endif |
122 | 126 |
123 void Node::dumpStatistics() | 127 void Node::dumpStatistics() |
124 { | 128 { |
125 #if DUMP_NODE_STATISTICS | 129 #if DUMP_NODE_STATISTICS |
126 size_t nodesWithRareData = 0; | 130 size_t nodesWithRareData = 0; |
127 | 131 |
128 size_t elementNodes = 0; | 132 size_t elementNodes = 0; |
129 size_t attrNodes = 0; | 133 size_t attrNodes = 0; |
130 size_t textNodes = 0; | 134 size_t textNodes = 0; |
131 size_t cdataNodes = 0; | 135 size_t cdataNodes = 0; |
132 size_t commentNodes = 0; | 136 size_t commentNodes = 0; |
133 size_t piNodes = 0; | 137 size_t piNodes = 0; |
134 size_t documentNodes = 0; | 138 size_t documentNodes = 0; |
135 size_t docTypeNodes = 0; | 139 size_t docTypeNodes = 0; |
136 size_t fragmentNodes = 0; | 140 size_t fragmentNodes = 0; |
137 size_t shadowRootNodes = 0; | 141 size_t shadowRootNodes = 0; |
138 | 142 |
139 HashMap<String, size_t> perTagCount; | 143 HashMap<String, size_t> perTagCount; |
140 | 144 |
141 size_t attributes = 0; | 145 size_t attributes = 0; |
142 size_t attributesWithAttr = 0; | |
143 size_t elementsWithAttributeStorage = 0; | 146 size_t elementsWithAttributeStorage = 0; |
144 size_t elementsWithRareData = 0; | 147 size_t elementsWithRareData = 0; |
145 size_t elementsWithNamedNodeMap = 0; | 148 size_t elementsWithNamedNodeMap = 0; |
146 | 149 |
147 for (HashSet<Node*>::iterator it = liveNodeSet.begin(); it != liveNodeSet.en
d(); ++it) { | 150 for (HashSet<Node*>::iterator it = liveNodeSet().begin(); it != liveNodeSet(
).end(); ++it) { |
148 Node* node = *it; | 151 Node* node = *it; |
149 | 152 |
150 if (node->hasRareData()) { | 153 if (node->hasRareData()) { |
151 ++nodesWithRareData; | 154 ++nodesWithRareData; |
152 if (node->isElementNode()) { | 155 if (node->isElementNode()) { |
153 ++elementsWithRareData; | 156 ++elementsWithRareData; |
154 if (toElement(node)->hasNamedNodeMap()) | 157 if (toElement(node)->hasNamedNodeMap()) |
155 ++elementsWithNamedNodeMap; | 158 ++elementsWithNamedNodeMap; |
156 } | 159 } |
157 } | 160 } |
158 | 161 |
159 switch (node->nodeType()) { | 162 switch (node->nodeType()) { |
160 case ELEMENT_NODE: { | 163 case ELEMENT_NODE: { |
161 ++elementNodes; | 164 ++elementNodes; |
162 | 165 |
163 // Tag stats | 166 // Tag stats |
164 Element* element = toElement(node); | 167 Element* element = toElement(node); |
165 HashMap<String, size_t>::AddResult result = perTagCount.add(elem
ent->tagName(), 1); | 168 HashMap<String, size_t>::AddResult result = perTagCount.add(elem
ent->tagName(), 1); |
166 if (!result.isNewEntry) | 169 if (!result.isNewEntry) |
167 result.storedValue->value++; | 170 result.storedValue->value++; |
168 | 171 |
169 if (ElementData* elementData = element->elementData()) { | 172 if (const ElementData* elementData = element->elementData()) { |
170 attributes += elementData->length(); | 173 attributes += elementData->length(); |
171 ++elementsWithAttributeStorage; | 174 ++elementsWithAttributeStorage; |
172 for (unsigned i = 0; i < elementData->length(); ++i) { | |
173 Attribute* attr = elementData->attributeItem(i); | |
174 if (attr->attr()) | |
175 ++attributesWithAttr; | |
176 } | |
177 } | 175 } |
178 break; | 176 break; |
179 } | 177 } |
180 case ATTRIBUTE_NODE: { | 178 case ATTRIBUTE_NODE: { |
181 ++attrNodes; | 179 ++attrNodes; |
182 break; | 180 break; |
183 } | 181 } |
184 case TEXT_NODE: { | 182 case TEXT_NODE: { |
185 ++textNodes; | 183 ++textNodes; |
186 break; | 184 break; |
(...skipping 21 matching lines...) Expand all Loading... |
208 case DOCUMENT_FRAGMENT_NODE: { | 206 case DOCUMENT_FRAGMENT_NODE: { |
209 if (node->isShadowRoot()) | 207 if (node->isShadowRoot()) |
210 ++shadowRootNodes; | 208 ++shadowRootNodes; |
211 else | 209 else |
212 ++fragmentNodes; | 210 ++fragmentNodes; |
213 break; | 211 break; |
214 } | 212 } |
215 } | 213 } |
216 } | 214 } |
217 | 215 |
218 printf("Number of Nodes: %d\n\n", liveNodeSet.size()); | 216 printf("Number of Nodes: %d\n\n", liveNodeSet().size()); |
219 printf("Number of Nodes with RareData: %zu\n\n", nodesWithRareData); | 217 printf("Number of Nodes with RareData: %zu\n\n", nodesWithRareData); |
220 | 218 |
221 printf("NodeType distribution:\n"); | 219 printf("NodeType distribution:\n"); |
222 printf(" Number of Element nodes: %zu\n", elementNodes); | 220 printf(" Number of Element nodes: %zu\n", elementNodes); |
223 printf(" Number of Attribute nodes: %zu\n", attrNodes); | 221 printf(" Number of Attribute nodes: %zu\n", attrNodes); |
224 printf(" Number of Text nodes: %zu\n", textNodes); | 222 printf(" Number of Text nodes: %zu\n", textNodes); |
225 printf(" Number of CDATASection nodes: %zu\n", cdataNodes); | 223 printf(" Number of CDATASection nodes: %zu\n", cdataNodes); |
226 printf(" Number of Comment nodes: %zu\n", commentNodes); | 224 printf(" Number of Comment nodes: %zu\n", commentNodes); |
227 printf(" Number of ProcessingInstruction nodes: %zu\n", piNodes); | 225 printf(" Number of ProcessingInstruction nodes: %zu\n", piNodes); |
228 printf(" Number of Document nodes: %zu\n", documentNodes); | 226 printf(" Number of Document nodes: %zu\n", documentNodes); |
229 printf(" Number of DocumentType nodes: %zu\n", docTypeNodes); | 227 printf(" Number of DocumentType nodes: %zu\n", docTypeNodes); |
230 printf(" Number of DocumentFragment nodes: %zu\n", fragmentNodes); | 228 printf(" Number of DocumentFragment nodes: %zu\n", fragmentNodes); |
231 printf(" Number of ShadowRoot nodes: %zu\n", shadowRootNodes); | 229 printf(" Number of ShadowRoot nodes: %zu\n", shadowRootNodes); |
232 | 230 |
233 printf("Element tag name distibution:\n"); | 231 printf("Element tag name distibution:\n"); |
234 for (HashMap<String, size_t>::iterator it = perTagCount.begin(); it != perTa
gCount.end(); ++it) | 232 for (HashMap<String, size_t>::iterator it = perTagCount.begin(); it != perTa
gCount.end(); ++it) |
235 printf(" Number of <%s> tags: %zu\n", it->key.utf8().data(), it->value)
; | 233 printf(" Number of <%s> tags: %zu\n", it->key.utf8().data(), it->value)
; |
236 | 234 |
237 printf("Attributes:\n"); | 235 printf("Attributes:\n"); |
238 printf(" Number of Attributes (non-Node and Node): %zu [%zu]\n", attributes
, sizeof(Attribute)); | 236 printf(" Number of Attributes (non-Node and Node): %zu [%zu]\n", attributes
, sizeof(Attribute)); |
239 printf(" Number of Attributes with an Attr: %zu\n", attributesWithAttr); | |
240 printf(" Number of Elements with attribute storage: %zu [%zu]\n", elementsW
ithAttributeStorage, sizeof(ElementData)); | 237 printf(" Number of Elements with attribute storage: %zu [%zu]\n", elementsW
ithAttributeStorage, sizeof(ElementData)); |
241 printf(" Number of Elements with RareData: %zu\n", elementsWithRareData); | 238 printf(" Number of Elements with RareData: %zu\n", elementsWithRareData); |
242 printf(" Number of Elements with NamedNodeMap: %zu [%zu]\n", elementsWithNa
medNodeMap, sizeof(NamedNodeMap)); | 239 printf(" Number of Elements with NamedNodeMap: %zu [%zu]\n", elementsWithNa
medNodeMap, sizeof(NamedNodeMap)); |
243 #endif | 240 #endif |
244 } | 241 } |
245 | 242 |
246 DEFINE_DEBUG_ONLY_GLOBAL(WTF::RefCountedLeakCounter, nodeCounter, ("WebCoreNode"
)); | 243 DEFINE_DEBUG_ONLY_GLOBAL(WTF::RefCountedLeakCounter, nodeCounter, ("WebCoreNode"
)); |
247 | 244 |
248 void Node::trackForDebugging() | 245 void Node::trackForDebugging() |
249 { | 246 { |
250 #ifndef NDEBUG | 247 #ifndef NDEBUG |
251 nodeCounter.increment(); | 248 nodeCounter.increment(); |
252 #endif | 249 #endif |
253 | 250 |
254 #if DUMP_NODE_STATISTICS | 251 #if DUMP_NODE_STATISTICS |
255 liveNodeSet.add(this); | 252 liveNodeSet().add(this); |
256 #endif | 253 #endif |
257 } | 254 } |
258 | 255 |
259 Node::~Node() | 256 Node::~Node() |
260 { | 257 { |
261 #ifndef NDEBUG | 258 #ifndef NDEBUG |
262 nodeCounter.decrement(); | 259 nodeCounter.decrement(); |
263 #endif | 260 #endif |
264 | 261 |
265 #if DUMP_NODE_STATISTICS | 262 #if DUMP_NODE_STATISTICS |
266 liveNodeSet.remove(this); | 263 liveNodeSet().remove(this); |
267 #endif | 264 #endif |
268 | 265 |
269 #if !ENABLE(OILPAN) | 266 #if !ENABLE(OILPAN) |
270 if (hasRareData()) | 267 if (hasRareData()) |
271 clearRareData(); | 268 clearRareData(); |
272 | 269 |
273 RELEASE_ASSERT(!renderer()); | 270 RELEASE_ASSERT(!renderer()); |
274 | 271 |
275 if (!isContainerNode()) | 272 if (!isContainerNode()) |
276 willBeDeletedFromDocument(); | 273 willBeDeletedFromDocument(); |
(...skipping 2301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2578 node->showTreeForThis(); | 2575 node->showTreeForThis(); |
2579 } | 2576 } |
2580 | 2577 |
2581 void showNodePath(const WebCore::Node* node) | 2578 void showNodePath(const WebCore::Node* node) |
2582 { | 2579 { |
2583 if (node) | 2580 if (node) |
2584 node->showNodePathForThis(); | 2581 node->showNodePathForThis(); |
2585 } | 2582 } |
2586 | 2583 |
2587 #endif | 2584 #endif |
OLD | NEW |