Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(121)

Side by Side Diff: Source/core/dom/NodeRareData.h

Issue 280123002: Oilpan: move LiveNodeList collections to the heap. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Add extra weak processing Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2008, 2010 Apple Inc. All rights reserved. 2 * Copyright (C) 2008, 2010 Apple Inc. All rights reserved.
3 * Copyright (C) 2008 David Smith <catfish.man@gmail.com> 3 * Copyright (C) 2008 David Smith <catfish.man@gmail.com>
4 * 4 *
5 * This library is free software; you can redistribute it and/or 5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public 6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either 7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version. 8 * version 2 of the License, or (at your option) any later version.
9 * 9 *
10 * This library is distributed in the hope that it will be useful, 10 * This library is distributed in the hope that it will be useful,
(...skipping 24 matching lines...) Expand all
35 #include "wtf/PassOwnPtr.h" 35 #include "wtf/PassOwnPtr.h"
36 #include "wtf/text/AtomicString.h" 36 #include "wtf/text/AtomicString.h"
37 #include "wtf/text/StringHash.h" 37 #include "wtf/text/StringHash.h"
38 38
39 namespace WebCore { 39 namespace WebCore {
40 40
41 class LabelsNodeList; 41 class LabelsNodeList;
42 class RadioNodeList; 42 class RadioNodeList;
43 class TreeScope; 43 class TreeScope;
44 44
45 class NodeListsNodeData { 45 class NodeListsNodeData FINAL : public NoBaseWillBeGarbageCollectedFinalized<Nod eListsNodeData> {
46 WTF_MAKE_NONCOPYABLE(NodeListsNodeData); WTF_MAKE_FAST_ALLOCATED; 46 WTF_MAKE_NONCOPYABLE(NodeListsNodeData);
47 WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED;
47 public: 48 public:
48 void clearChildNodeListCache() 49 void clearChildNodeListCache()
49 { 50 {
50 if (m_childNodeList && m_childNodeList->isChildNodeList()) 51 if (m_childNodeList && m_childNodeList->isChildNodeList())
51 toChildNodeList(m_childNodeList)->invalidateCache(); 52 toChildNodeList(m_childNodeList)->invalidateCache();
52 } 53 }
53 54
54 PassRefPtr<ChildNodeList> ensureChildNodeList(ContainerNode& node) 55 PassRefPtrWillBeRawPtr<ChildNodeList> ensureChildNodeList(ContainerNode& nod e)
55 { 56 {
56 if (m_childNodeList) 57 if (m_childNodeList)
57 return toChildNodeList(m_childNodeList); 58 return toChildNodeList(m_childNodeList);
58 RefPtr<ChildNodeList> list = ChildNodeList::create(node); 59 RefPtrWillBeRawPtr<ChildNodeList> list = ChildNodeList::create(node);
59 m_childNodeList = list.get(); 60 m_childNodeList = list.get();
60 return list.release(); 61 return list.release();
61 } 62 }
62 63
63 PassRefPtr<EmptyNodeList> ensureEmptyChildNodeList(Node& node) 64 PassRefPtrWillBeRawPtr<EmptyNodeList> ensureEmptyChildNodeList(Node& node)
64 { 65 {
65 if (m_childNodeList) 66 if (m_childNodeList)
66 return toEmptyNodeList(m_childNodeList); 67 return toEmptyNodeList(m_childNodeList);
67 RefPtr<EmptyNodeList> list = EmptyNodeList::create(node); 68 RefPtrWillBeRawPtr<EmptyNodeList> list = EmptyNodeList::create(node);
68 m_childNodeList = list.get(); 69 m_childNodeList = list.get();
69 return list.release(); 70 return list.release();
70 } 71 }
71 72
73 #if !ENABLE(OILPAN)
72 void removeChildNodeList(ChildNodeList* list) 74 void removeChildNodeList(ChildNodeList* list)
73 { 75 {
74 ASSERT(m_childNodeList == list); 76 ASSERT(m_childNodeList == list);
75 if (deleteThisAndUpdateNodeRareDataIfAboutToRemoveLastList(list->ownerNo de())) 77 if (deleteThisAndUpdateNodeRareDataIfAboutToRemoveLastList(list->ownerNo de()))
76 return; 78 return;
77 m_childNodeList = 0; 79 m_childNodeList = nullptr;
78 } 80 }
79 81
80 void removeEmptyChildNodeList(EmptyNodeList* list) 82 void removeEmptyChildNodeList(EmptyNodeList* list)
81 { 83 {
82 ASSERT(m_childNodeList == list); 84 ASSERT(m_childNodeList == list);
83 if (deleteThisAndUpdateNodeRareDataIfAboutToRemoveLastList(list->ownerNo de())) 85 if (deleteThisAndUpdateNodeRareDataIfAboutToRemoveLastList(list->ownerNo de()))
84 return; 86 return;
85 m_childNodeList = 0; 87 m_childNodeList = nullptr;
86 } 88 }
89 #endif
87 90
88 struct NodeListAtomicCacheMapEntryHash { 91 struct NodeListAtomicCacheMapEntryHash {
89 static unsigned hash(const std::pair<unsigned char, StringImpl*>& entry) 92 static unsigned hash(const std::pair<unsigned char, StringImpl*>& entry)
90 { 93 {
91 return DefaultHash<StringImpl*>::Hash::hash(entry.second) + entry.fi rst; 94 return DefaultHash<StringImpl*>::Hash::hash(entry.second) + entry.fi rst;
92 } 95 }
93 static bool equal(const std::pair<unsigned char, StringImpl*>& a, const std::pair<unsigned char, StringImpl*>& b) { return a == b; } 96 static bool equal(const std::pair<unsigned char, StringImpl*>& a, const std::pair<unsigned char, StringImpl*>& b) { return a == b; }
94 static const bool safeToCompareToEmptyOrDeleted = DefaultHash<StringImpl *>::Hash::safeToCompareToEmptyOrDeleted; 97 static const bool safeToCompareToEmptyOrDeleted = DefaultHash<StringImpl *>::Hash::safeToCompareToEmptyOrDeleted;
95 }; 98 };
96 99
97 typedef HashMap<std::pair<unsigned char, StringImpl*>, LiveNodeListBase*, No deListAtomicCacheMapEntryHash> NodeListAtomicNameCacheMap; 100 // Oilpan: keep a weak reference to the collection objects.
98 typedef HashMap<QualifiedName, TagCollection*> TagCollectionCacheNS; 101 // Explicit object unregistration in a non-Oilpan setting
102 // on object destruction is replaced by the garbage collector
103 // clearing out their weak reference.
104 typedef WillBeHeapHashMap<std::pair<unsigned char, StringImpl*>, RawPtrWillB eWeakMember<LiveNodeListBase>, NodeListAtomicCacheMapEntryHash> NodeListAtomicNa meCacheMap;
105 typedef WillBeHeapHashMap<QualifiedName, RawPtrWillBeWeakMember<TagCollectio n> > TagCollectionCacheNS;
99 106
100 template<typename T> 107 template<typename T>
101 PassRefPtr<T> addCache(ContainerNode& node, CollectionType collectionType, c onst AtomicString& name) 108 PassRefPtrWillBeRawPtr<T> addCache(ContainerNode& node, CollectionType colle ctionType, const AtomicString& name)
102 { 109 {
103 NodeListAtomicNameCacheMap::AddResult result = m_atomicNameCaches.add(na medNodeListKey(collectionType, name), 0); 110 NodeListAtomicNameCacheMap::AddResult result = m_atomicNameCaches.add(na medNodeListKey(collectionType, name), nullptr);
104 if (!result.isNewEntry) 111 if (!result.isNewEntry)
105 return static_cast<T*>(result.storedValue->value); 112 return static_cast<T*>(result.storedValue->value.get());
106 113
107 RefPtr<T> list = T::create(node, collectionType, name); 114 RefPtrWillBeRawPtr<T> list = T::create(node, collectionType, name);
108 result.storedValue->value = list.get(); 115 result.storedValue->value = list.get();
109 return list.release(); 116 return list.release();
110 } 117 }
111 118
112 template<typename T> 119 template<typename T>
113 PassRefPtr<T> addCache(ContainerNode& node, CollectionType collectionType) 120 PassRefPtrWillBeRawPtr<T> addCache(ContainerNode& node, CollectionType colle ctionType)
114 { 121 {
115 NodeListAtomicNameCacheMap::AddResult result = m_atomicNameCaches.add(na medNodeListKey(collectionType, starAtom), 0); 122 NodeListAtomicNameCacheMap::AddResult result = m_atomicNameCaches.add(na medNodeListKey(collectionType, starAtom), nullptr);
116 if (!result.isNewEntry) 123 if (!result.isNewEntry)
117 return static_cast<T*>(result.storedValue->value); 124 return static_cast<T*>(result.storedValue->value.get());
118 125
119 RefPtr<T> list = T::create(node, collectionType); 126 RefPtrWillBeRawPtr<T> list = T::create(node, collectionType);
120 result.storedValue->value = list.get(); 127 result.storedValue->value = list.get();
121 return list.release(); 128 return list.release();
122 } 129 }
123 130
124 template<typename T> 131 template<typename T>
125 T* cached(CollectionType collectionType) 132 T* cached(CollectionType collectionType)
126 { 133 {
134 #if ENABLE(OILPAN)
135 // FIXME: Oilpan: unify, if possible. The lookup resolves to a T& with O ilpan,
136 // whereas non-Oilpan resolves to RawPtr<T>.
127 return static_cast<T*>(m_atomicNameCaches.get(namedNodeListKey(collectio nType, starAtom))); 137 return static_cast<T*>(m_atomicNameCaches.get(namedNodeListKey(collectio nType, starAtom)));
138 #else
139 return static_cast<T*>(m_atomicNameCaches.get(namedNodeListKey(collectio nType, starAtom)).get());
140 #endif
128 } 141 }
129 142
130 PassRefPtr<TagCollection> addCache(ContainerNode& node, const AtomicString& namespaceURI, const AtomicString& localName) 143 PassRefPtrWillBeRawPtr<TagCollection> addCache(ContainerNode& node, const At omicString& namespaceURI, const AtomicString& localName)
131 { 144 {
132 QualifiedName name(nullAtom, localName, namespaceURI); 145 QualifiedName name(nullAtom, localName, namespaceURI);
133 TagCollectionCacheNS::AddResult result = m_tagCollectionCacheNS.add(name , 0); 146 TagCollectionCacheNS::AddResult result = m_tagCollectionCacheNS.add(name , nullptr);
134 if (!result.isNewEntry) 147 if (!result.isNewEntry)
135 return result.storedValue->value; 148 return result.storedValue->value;
136 149
137 RefPtr<TagCollection> list = TagCollection::create(node, namespaceURI, l ocalName); 150 RefPtrWillBeRawPtr<TagCollection> list = TagCollection::create(node, nam espaceURI, localName);
138 result.storedValue->value = list.get(); 151 result.storedValue->value = list.get();
139 return list.release(); 152 return list.release();
140 } 153 }
141 154
155 #if !ENABLE(OILPAN)
142 void removeCache(LiveNodeListBase* list, CollectionType collectionType, cons t AtomicString& name = starAtom) 156 void removeCache(LiveNodeListBase* list, CollectionType collectionType, cons t AtomicString& name = starAtom)
143 { 157 {
144 ASSERT(list == m_atomicNameCaches.get(namedNodeListKey(collectionType, n ame))); 158 ASSERT(list == m_atomicNameCaches.get(namedNodeListKey(collectionType, n ame)));
145 if (deleteThisAndUpdateNodeRareDataIfAboutToRemoveLastList(list->ownerNo de())) 159 if (deleteThisAndUpdateNodeRareDataIfAboutToRemoveLastList(list->ownerNo de()))
146 return; 160 return;
147 m_atomicNameCaches.remove(namedNodeListKey(collectionType, name)); 161 m_atomicNameCaches.remove(namedNodeListKey(collectionType, name));
148 } 162 }
149 163
150 void removeCache(LiveNodeListBase* list, const AtomicString& namespaceURI, c onst AtomicString& localName) 164 void removeCache(LiveNodeListBase* list, const AtomicString& namespaceURI, c onst AtomicString& localName)
151 { 165 {
152 QualifiedName name(nullAtom, localName, namespaceURI); 166 QualifiedName name(nullAtom, localName, namespaceURI);
153 ASSERT(list == m_tagCollectionCacheNS.get(name)); 167 ASSERT(list == m_tagCollectionCacheNS.get(name));
154 if (deleteThisAndUpdateNodeRareDataIfAboutToRemoveLastList(list->ownerNo de())) 168 if (deleteThisAndUpdateNodeRareDataIfAboutToRemoveLastList(list->ownerNo de()))
155 return; 169 return;
156 m_tagCollectionCacheNS.remove(name); 170 m_tagCollectionCacheNS.remove(name);
157 } 171 }
172 #endif
158 173
159 static PassOwnPtr<NodeListsNodeData> create() 174 #if ENABLE(OILPAN)
175 static PassOwnPtrWillBeRawPtr<NodeListsNodeData> create(NodeRareData* owner)
Mads Ager (chromium) 2014/05/20 06:58:57 Since we have the #if around the entire definition
sof 2014/05/20 08:27:49 Done.
160 { 176 {
161 return adoptPtr(new NodeListsNodeData); 177 return adoptPtrWillBeNoop(new NodeListsNodeData(owner));
162 } 178 }
179 #else
180 static PassOwnPtrWillBeRawPtr<NodeListsNodeData> create()
181 {
182 return adoptPtrWillBeNoop(new NodeListsNodeData);
183 }
184 #endif
163 185
164 void invalidateCaches(const QualifiedName* attrName = 0); 186 void invalidateCaches(const QualifiedName* attrName = 0);
165 bool isEmpty() const 187 bool isEmpty() const
166 { 188 {
167 return m_atomicNameCaches.isEmpty() && m_tagCollectionCacheNS.isEmpty(); 189 return m_atomicNameCaches.isEmpty() && m_tagCollectionCacheNS.isEmpty();
168 } 190 }
169 191
170 void adoptTreeScope() 192 void adoptTreeScope()
171 { 193 {
172 invalidateCaches(); 194 invalidateCaches();
(...skipping 10 matching lines...) Expand all
183 } 205 }
184 206
185 TagCollectionCacheNS::const_iterator tagEnd = m_tagCollectionCacheNS.end (); 207 TagCollectionCacheNS::const_iterator tagEnd = m_tagCollectionCacheNS.end ();
186 for (TagCollectionCacheNS::const_iterator it = m_tagCollectionCacheNS.be gin(); it != tagEnd; ++it) { 208 for (TagCollectionCacheNS::const_iterator it = m_tagCollectionCacheNS.be gin(); it != tagEnd; ++it) {
187 LiveNodeListBase* list = it->value; 209 LiveNodeListBase* list = it->value;
188 ASSERT(!list->isRootedAtDocument()); 210 ASSERT(!list->isRootedAtDocument());
189 list->didMoveToDocument(oldDocument, newDocument); 211 list->didMoveToDocument(oldDocument, newDocument);
190 } 212 }
191 } 213 }
192 214
215 #if ENABLE(OILPAN)
Mads Ager (chromium) 2014/05/20 06:58:57 Nit: For Document and friends I have not used #if
sof 2014/05/20 08:27:49 I will leave it out for non-Oilpan for now, unpret
216 void clearWeakMembers(Visitor*);
217 #endif
218
219 void trace(Visitor* visitor)
220 {
221 visitor->trace(m_childNodeList);
222 visitor->trace(m_atomicNameCaches);
223 visitor->trace(m_tagCollectionCacheNS);
224 #if ENABLE(OILPAN)
Mads Ager (chromium) 2014/05/20 06:58:57 Nit: Maybe we should just #if out the entire body
sof 2014/05/20 08:27:49 Done.
225 visitor->trace(m_owner);
sof 2014/05/19 21:40:49 Not sure about this trace() call (and the one for
Erik Corry 2014/05/19 21:45:01 I think you just have to mention the fields in the
zerny-chromium 2014/05/20 06:07:43 This is fine as is. The plugin will/should identif
sof 2014/05/20 06:23:59 Oh, that sounds encouraging. I used isAlive() over
zerny-chromium 2014/05/20 07:58:00 I think it is. The plugin checks trace methods eve
sof 2014/05/20 08:27:49 You're quite right, not reported as trace() proble
226 visitor->registerWeakMembers<NodeListsNodeData, &NodeListsNodeData::clea rWeakMembers>(this);
227 #endif
228 }
229
193 private: 230 private:
231 #if ENABLE(OILPAN)
232 NodeListsNodeData(NodeRareData* owner)
Mads Ager (chromium) 2014/05/20 06:58:57 explicit
sof 2014/05/20 08:27:49 Done.
233 #else
194 NodeListsNodeData() 234 NodeListsNodeData()
195 : m_childNodeList(0) 235 #endif
236 : m_childNodeList(nullptr)
237 #if ENABLE(OILPAN)
238 , m_owner(owner)
239 #endif
196 { } 240 { }
197 241
198 std::pair<unsigned char, StringImpl*> namedNodeListKey(CollectionType type, const AtomicString& name) 242 std::pair<unsigned char, StringImpl*> namedNodeListKey(CollectionType type, const AtomicString& name)
199 { 243 {
200 // Holding the raw StringImpl is safe because |name| is retained by the NodeList and the NodeList 244 // Holding the raw StringImpl is safe because |name| is retained by the NodeList and the NodeList
201 // is reponsible for removing itself from the cache on deletion. 245 // is reponsible for removing itself from the cache on deletion.
202 return std::pair<unsigned char, StringImpl*>(type, name.impl()); 246 return std::pair<unsigned char, StringImpl*>(type, name.impl());
203 } 247 }
204 248
249 #if !ENABLE(OILPAN)
205 bool deleteThisAndUpdateNodeRareDataIfAboutToRemoveLastList(Node&); 250 bool deleteThisAndUpdateNodeRareDataIfAboutToRemoveLastList(Node&);
251 #endif
206 252
207 // Can be a ChildNodeList or an EmptyNodeList. 253 // Can be a ChildNodeList or an EmptyNodeList.
208 NodeList* m_childNodeList; 254 RawPtrWillBeWeakMember<NodeList> m_childNodeList;
209 NodeListAtomicNameCacheMap m_atomicNameCaches; 255 NodeListAtomicNameCacheMap m_atomicNameCaches;
210 TagCollectionCacheNS m_tagCollectionCacheNS; 256 TagCollectionCacheNS m_tagCollectionCacheNS;
257 #if ENABLE(OILPAN)
258 WeakMember<NodeRareData> m_owner;
Mads Ager (chromium) 2014/05/20 06:58:57 The NodeRareData owns the NodeListNodeData and the
sof 2014/05/20 08:27:49 thanks for bringing clarity; that makes good sense
259 #endif
211 }; 260 };
212 261
213 class NodeMutationObserverData FINAL : public NoBaseWillBeGarbageCollected<NodeM utationObserverData> { 262 class NodeMutationObserverData FINAL : public NoBaseWillBeGarbageCollected<NodeM utationObserverData> {
214 WTF_MAKE_NONCOPYABLE(NodeMutationObserverData); 263 WTF_MAKE_NONCOPYABLE(NodeMutationObserverData);
215 WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED; 264 WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED;
216 public: 265 public:
217 WillBeHeapVector<OwnPtrWillBeMember<MutationObserverRegistration> > registry ; 266 WillBeHeapVector<OwnPtrWillBeMember<MutationObserverRegistration> > registry ;
218 WillBeHeapHashSet<RawPtrWillBeMember<MutationObserverRegistration> > transie ntRegistry; 267 WillBeHeapHashSet<RawPtrWillBeMember<MutationObserverRegistration> > transie ntRegistry;
219 268
220 static PassOwnPtrWillBeRawPtr<NodeMutationObserverData> create() 269 static PassOwnPtrWillBeRawPtr<NodeMutationObserverData> create()
(...skipping 17 matching lines...) Expand all
238 public: 287 public:
239 static NodeRareData* create(RenderObject* renderer) 288 static NodeRareData* create(RenderObject* renderer)
240 { 289 {
241 return new NodeRareData(renderer); 290 return new NodeRareData(renderer);
242 } 291 }
243 292
244 void clearNodeLists() { m_nodeLists.clear(); } 293 void clearNodeLists() { m_nodeLists.clear(); }
245 NodeListsNodeData* nodeLists() const { return m_nodeLists.get(); } 294 NodeListsNodeData* nodeLists() const { return m_nodeLists.get(); }
246 NodeListsNodeData& ensureNodeLists() 295 NodeListsNodeData& ensureNodeLists()
247 { 296 {
248 if (!m_nodeLists) 297 if (!m_nodeLists) {
298 #if ENABLE(OILPAN)
299 m_nodeLists = NodeListsNodeData::create(this);
300 #else
249 m_nodeLists = NodeListsNodeData::create(); 301 m_nodeLists = NodeListsNodeData::create();
302 #endif
303 }
250 return *m_nodeLists; 304 return *m_nodeLists;
251 } 305 }
252 306
253 NodeMutationObserverData* mutationObserverData() { return m_mutationObserver Data.get(); } 307 NodeMutationObserverData* mutationObserverData() { return m_mutationObserver Data.get(); }
254 NodeMutationObserverData& ensureMutationObserverData() 308 NodeMutationObserverData& ensureMutationObserverData()
255 { 309 {
256 if (!m_mutationObserverData) 310 if (!m_mutationObserverData)
257 m_mutationObserverData = NodeMutationObserverData::create(); 311 m_mutationObserverData = NodeMutationObserverData::create();
258 return *m_mutationObserverData; 312 return *m_mutationObserverData;
259 } 313 }
(...skipping 22 matching lines...) Expand all
282 enum { 336 enum {
283 ConnectedFrameCountBits = 10, // Must fit Page::maxNumberOfFrames. 337 ConnectedFrameCountBits = 10, // Must fit Page::maxNumberOfFrames.
284 }; 338 };
285 339
286 void trace(Visitor*); 340 void trace(Visitor*);
287 341
288 void traceAfterDispatch(Visitor*); 342 void traceAfterDispatch(Visitor*);
289 void finalizeGarbageCollectedObject(); 343 void finalizeGarbageCollectedObject();
290 344
291 protected: 345 protected:
292 NodeRareData(RenderObject* renderer) 346 explicit NodeRareData(RenderObject* renderer)
293 : NodeRareDataBase(renderer) 347 : NodeRareDataBase(renderer)
294 , m_connectedFrameCount(0) 348 , m_connectedFrameCount(0)
295 , m_elementFlags(0) 349 , m_elementFlags(0)
296 , m_restyleFlags(0) 350 , m_restyleFlags(0)
297 , m_isElementRareData(false) 351 , m_isElementRareData(false)
298 { } 352 { }
299 353
300 private: 354 private:
301 OwnPtr<NodeListsNodeData> m_nodeLists; 355 OwnPtrWillBeMember<NodeListsNodeData> m_nodeLists;
302 OwnPtrWillBeMember<NodeMutationObserverData> m_mutationObserverData; 356 OwnPtrWillBeMember<NodeMutationObserverData> m_mutationObserverData;
303 357
304 unsigned m_connectedFrameCount : ConnectedFrameCountBits; 358 unsigned m_connectedFrameCount : ConnectedFrameCountBits;
305 unsigned m_elementFlags : NumberOfElementFlags; 359 unsigned m_elementFlags : NumberOfElementFlags;
306 unsigned m_restyleFlags : NumberOfDynamicRestyleFlags; 360 unsigned m_restyleFlags : NumberOfDynamicRestyleFlags;
307 protected: 361 protected:
308 unsigned m_isElementRareData : 1; 362 unsigned m_isElementRareData : 1;
309 }; 363 };
310 364
365 #if !ENABLE(OILPAN)
311 inline bool NodeListsNodeData::deleteThisAndUpdateNodeRareDataIfAboutToRemoveLas tList(Node& ownerNode) 366 inline bool NodeListsNodeData::deleteThisAndUpdateNodeRareDataIfAboutToRemoveLas tList(Node& ownerNode)
312 { 367 {
313 ASSERT(ownerNode.nodeLists() == this); 368 ASSERT(ownerNode.nodeLists() == this);
314 if ((m_childNodeList ? 1 : 0) + m_atomicNameCaches.size() + m_tagCollectionC acheNS.size() != 1) 369 if ((m_childNodeList ? 1 : 0) + m_atomicNameCaches.size() + m_tagCollectionC acheNS.size() != 1)
315 return false; 370 return false;
316 ownerNode.clearNodeLists(); 371 ownerNode.clearNodeLists();
317 return true; 372 return true;
318 } 373 }
374 #endif
319 375
320 } // namespace WebCore 376 } // namespace WebCore
321 377
322 #endif // NodeRareData_h 378 #endif // NodeRareData_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698