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

Side by Side Diff: Source/core/dom/Node.cpp

Issue 265793017: Oilpan: move node/element rare data objects to the heap. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebased + have MutationObserver keep a weak ref to registrations 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) 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 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 Node::~Node() 259 Node::~Node()
260 { 260 {
261 #ifndef NDEBUG 261 #ifndef NDEBUG
262 nodeCounter.decrement(); 262 nodeCounter.decrement();
263 #endif 263 #endif
264 264
265 #if DUMP_NODE_STATISTICS 265 #if DUMP_NODE_STATISTICS
266 liveNodeSet.remove(this); 266 liveNodeSet.remove(this);
267 #endif 267 #endif
268 268
269 #if !ENABLE(OILPAN)
269 if (hasRareData()) 270 if (hasRareData())
270 clearRareData(); 271 clearRareData();
271 272
272 RELEASE_ASSERT(!renderer()); 273 RELEASE_ASSERT(!renderer());
273 274
274 #if !ENABLE(OILPAN)
275 if (!isContainerNode()) 275 if (!isContainerNode())
276 willBeDeletedFromDocument(); 276 willBeDeletedFromDocument();
277 277
278 if (m_previous) 278 if (m_previous)
279 m_previous->setNextSibling(0); 279 m_previous->setNextSibling(0);
280 if (m_next) 280 if (m_next)
281 m_next->setPreviousSibling(0); 281 m_next->setPreviousSibling(0);
282 282
283 if (m_treeScope) 283 if (m_treeScope)
284 m_treeScope->guardDeref(); 284 m_treeScope->guardDeref();
285 #else
286 // With Oilpan, the rare data finalizer also asserts for
287 // this condition (we cannot directly access it here.)
288 RELEASE_ASSERT(hasRareData() || !renderer());
285 #endif 289 #endif
286 290
287 InspectorCounters::decrementCounter(InspectorCounters::NodeCounter); 291 InspectorCounters::decrementCounter(InspectorCounters::NodeCounter);
288 292
289 if (getFlag(HasWeakReferencesFlag)) 293 if (getFlag(HasWeakReferencesFlag))
290 WeakNodeMap::notifyNodeDestroyed(this); 294 WeakNodeMap::notifyNodeDestroyed(this);
291 } 295 }
292 296
293 #if !ENABLE(OILPAN) 297 #if !ENABLE(OILPAN)
294 // With Oilpan all of this is handled with weak processing of the document. 298 // With Oilpan all of this is handled with weak processing of the document.
(...skipping 22 matching lines...) Expand all
317 { 321 {
318 ASSERT_WITH_SECURITY_IMPLICATION(hasRareData()); 322 ASSERT_WITH_SECURITY_IMPLICATION(hasRareData());
319 return static_cast<NodeRareData*>(m_data.m_rareData); 323 return static_cast<NodeRareData*>(m_data.m_rareData);
320 } 324 }
321 325
322 NodeRareData& Node::ensureRareData() 326 NodeRareData& Node::ensureRareData()
323 { 327 {
324 if (hasRareData()) 328 if (hasRareData())
325 return *rareData(); 329 return *rareData();
326 330
327 NodeRareData* data;
328 if (isElementNode()) 331 if (isElementNode())
329 data = ElementRareData::create(m_data.m_renderer).leakPtr(); 332 m_data.m_rareData = ElementRareData::create(m_data.m_renderer);
330 else 333 else
331 data = NodeRareData::create(m_data.m_renderer).leakPtr(); 334 m_data.m_rareData = NodeRareData::create(m_data.m_renderer);
332 ASSERT(data);
333 335
334 m_data.m_rareData = data; 336 ASSERT(m_data.m_rareData);
337
335 setFlag(HasRareDataFlag); 338 setFlag(HasRareDataFlag);
336 return *data; 339 return *rareData();
337 } 340 }
338 341
342 #if !ENABLE(OILPAN)
339 void Node::clearRareData() 343 void Node::clearRareData()
340 { 344 {
341 ASSERT(hasRareData()); 345 ASSERT(hasRareData());
342 ASSERT(!transientMutationObserverRegistry() || transientMutationObserverRegi stry()->isEmpty()); 346 ASSERT(!transientMutationObserverRegistry() || transientMutationObserverRegi stry()->isEmpty());
343 347
344 RenderObject* renderer = m_data.m_rareData->renderer(); 348 RenderObject* renderer = m_data.m_rareData->renderer();
345 if (isElementNode()) { 349 if (isElementNode())
346 ElementRareData* rareData = static_cast<ElementRareData*>(m_data.m_rareD ata); 350 delete static_cast<ElementRareData*>(m_data.m_rareData);
347 rareData->dispose(); 351 else
348 delete rareData; 352 delete static_cast<NodeRareData*>(m_data.m_rareData);
349 } else {
350 NodeRareData* rareData = static_cast<NodeRareData*>(m_data.m_rareData);
351 rareData->dispose();
352 delete rareData;
353 }
354 m_data.m_renderer = renderer; 353 m_data.m_renderer = renderer;
355 clearFlag(HasRareDataFlag); 354 clearFlag(HasRareDataFlag);
356 } 355 }
356 #endif
357 357
358 Node* Node::toNode() 358 Node* Node::toNode()
359 { 359 {
360 return this; 360 return this;
361 } 361 }
362 362
363 short Node::tabIndex() const 363 short Node::tabIndex() const
364 { 364 {
365 return 0; 365 return 0;
366 } 366 }
(...skipping 1762 matching lines...) Expand 10 before | Expand all | Expand 10 after
2129 MutationObserverRegistration* registration = 0; 2129 MutationObserverRegistration* registration = 0;
2130 WillBeHeapVector<OwnPtrWillBeMember<MutationObserverRegistration> >& registr y = ensureRareData().ensureMutationObserverData().registry; 2130 WillBeHeapVector<OwnPtrWillBeMember<MutationObserverRegistration> >& registr y = ensureRareData().ensureMutationObserverData().registry;
2131 for (size_t i = 0; i < registry.size(); ++i) { 2131 for (size_t i = 0; i < registry.size(); ++i) {
2132 if (&registry[i]->observer() == &observer) { 2132 if (&registry[i]->observer() == &observer) {
2133 registration = registry[i].get(); 2133 registration = registry[i].get();
2134 registration->resetObservation(options, attributeFilter); 2134 registration->resetObservation(options, attributeFilter);
2135 } 2135 }
2136 } 2136 }
2137 2137
2138 if (!registration) { 2138 if (!registration) {
2139 registry.append(MutationObserverRegistration::create(observer, *this, op tions, attributeFilter)); 2139 registry.append(MutationObserverRegistration::create(observer, this, opt ions, attributeFilter));
2140 registration = registry.last().get(); 2140 registration = registry.last().get();
2141 } 2141 }
2142 2142
2143 document().addMutationObserverTypes(registration->mutationTypes()); 2143 document().addMutationObserverTypes(registration->mutationTypes());
2144 } 2144 }
2145 2145
2146 void Node::unregisterMutationObserver(MutationObserverRegistration* registration ) 2146 void Node::unregisterMutationObserver(MutationObserverRegistration* registration )
2147 { 2147 {
2148 WillBeHeapVector<OwnPtrWillBeMember<MutationObserverRegistration> >* registr y = mutationObserverRegistry(); 2148 WillBeHeapVector<OwnPtrWillBeMember<MutationObserverRegistration> >* registr y = mutationObserverRegistry();
2149 ASSERT(registry); 2149 ASSERT(registry);
2150 if (!registry) 2150 if (!registry)
2151 return; 2151 return;
2152 2152
2153 size_t index = registry->find(registration); 2153 size_t index = registry->find(registration);
2154 ASSERT(index != kNotFound); 2154 ASSERT(index != kNotFound);
2155 if (index == kNotFound) 2155 if (index == kNotFound)
2156 return; 2156 return;
2157 2157
2158 // Deleting the registration may cause this node to be derefed, so we must m ake sure the Vector operation completes 2158 // Deleting the registration may cause this node to be derefed, so we must m ake sure the Vector operation completes
2159 // before that, in case |this| is destroyed (see MutationObserverRegistratio n::m_registrationNodeKeepAlive). 2159 // before that, in case |this| is destroyed (see MutationObserverRegistratio n::m_registrationNodeKeepAlive).
2160 // FIXME: Simplify the registration/transient registration logic to make thi s understandable by humans. 2160 // FIXME: Simplify the registration/transient registration logic to make thi s understandable by humans.
2161 RefPtr<Node> protect(this); 2161 RefPtr<Node> protect(this);
2162 // The explicit dispose() is motivated by Oilpan; the registration 2162 #if ENABLE(OILPAN)
2163 // object needs to unregister itself promptly. 2163 // The explicit dispose() is needed to have the registration
2164 // object unregister itself promptly.
2164 registration->dispose(); 2165 registration->dispose();
2166 #endif
2165 registry->remove(index); 2167 registry->remove(index);
2166 } 2168 }
2167 2169
2168 void Node::registerTransientMutationObserver(MutationObserverRegistration* regis tration) 2170 void Node::registerTransientMutationObserver(MutationObserverRegistration* regis tration)
2169 { 2171 {
2170 ensureRareData().ensureMutationObserverData().transientRegistry.add(registra tion); 2172 ensureRareData().ensureMutationObserverData().transientRegistry.add(registra tion);
2171 } 2173 }
2172 2174
2173 void Node::unregisterTransientMutationObserver(MutationObserverRegistration* reg istration) 2175 void Node::unregisterTransientMutationObserver(MutationObserverRegistration* reg istration)
2174 { 2176 {
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after
2558 2560
2559 if (oldState == NotCustomElement || newState == Upgraded) 2561 if (oldState == NotCustomElement || newState == Upgraded)
2560 setNeedsStyleRecalc(SubtreeStyleChange); // :unresolved has changed 2562 setNeedsStyleRecalc(SubtreeStyleChange); // :unresolved has changed
2561 } 2563 }
2562 2564
2563 void Node::trace(Visitor* visitor) 2565 void Node::trace(Visitor* visitor)
2564 { 2566 {
2565 visitor->trace(m_parentOrShadowHostNode); 2567 visitor->trace(m_parentOrShadowHostNode);
2566 visitor->trace(m_previous); 2568 visitor->trace(m_previous);
2567 visitor->trace(m_next); 2569 visitor->trace(m_next);
2570 if (hasRareData())
2571 visitor->trace(rareData());
2572
2568 visitor->trace(m_treeScope); 2573 visitor->trace(m_treeScope);
2569 } 2574 }
2570 2575
2571 } // namespace WebCore 2576 } // namespace WebCore
2572 2577
2573 #ifndef NDEBUG 2578 #ifndef NDEBUG
2574 2579
2575 void showNode(const WebCore::Node* node) 2580 void showNode(const WebCore::Node* node)
2576 { 2581 {
2577 if (node) 2582 if (node)
2578 node->showNode(""); 2583 node->showNode("");
2579 } 2584 }
2580 2585
2581 void showTree(const WebCore::Node* node) 2586 void showTree(const WebCore::Node* node)
2582 { 2587 {
2583 if (node) 2588 if (node)
2584 node->showTreeForThis(); 2589 node->showTreeForThis();
2585 } 2590 }
2586 2591
2587 void showNodePath(const WebCore::Node* node) 2592 void showNodePath(const WebCore::Node* node)
2588 { 2593 {
2589 if (node) 2594 if (node)
2590 node->showNodePathForThis(); 2595 node->showNodePathForThis();
2591 } 2596 }
2592 2597
2593 #endif 2598 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698