Index: Source/core/dom/Node.cpp |
diff --git a/Source/core/dom/Node.cpp b/Source/core/dom/Node.cpp |
index 0798dda6c5b079fdd35680c844fb3a3dd533d867..8d3cb74b95d525c2638c5d367556aa5070209657 100644 |
--- a/Source/core/dom/Node.cpp |
+++ b/Source/core/dom/Node.cpp |
@@ -266,14 +266,18 @@ Node::~Node() |
liveNodeSet.remove(this); |
#endif |
+#if !ENABLE(OILPAN) |
if (hasRareData()) |
clearRareData(); |
RELEASE_ASSERT(!renderer()); |
-#if !ENABLE(OILPAN) |
if (!isContainerNode()) |
willBeDeletedFromDocument(); |
+#else |
+ // With Oilpan, the rare data finalizer also asserts for |
+ // this condition (we cannot directly access it here.) |
+ RELEASE_ASSERT(hasRareData() || !renderer()); |
#endif |
if (m_previous) |
@@ -326,36 +330,32 @@ NodeRareData& Node::ensureRareData() |
if (hasRareData()) |
return *rareData(); |
- NodeRareData* data; |
if (isElementNode()) |
- data = ElementRareData::create(m_data.m_renderer).leakPtr(); |
+ m_data.m_rareData = ElementRareData::create(m_data.m_renderer); |
else |
- data = NodeRareData::create(m_data.m_renderer).leakPtr(); |
- ASSERT(data); |
+ m_data.m_rareData = NodeRareData::create(m_data.m_renderer); |
+ |
+ ASSERT(m_data.m_rareData); |
- m_data.m_rareData = data; |
setFlag(HasRareDataFlag); |
- return *data; |
+ return *rareData(); |
} |
+#if !ENABLE(OILPAN) |
void Node::clearRareData() |
{ |
ASSERT(hasRareData()); |
ASSERT(!transientMutationObserverRegistry() || transientMutationObserverRegistry()->isEmpty()); |
RenderObject* renderer = m_data.m_rareData->renderer(); |
- if (isElementNode()) { |
- ElementRareData* rareData = static_cast<ElementRareData*>(m_data.m_rareData); |
- rareData->dispose(); |
- delete rareData; |
- } else { |
- NodeRareData* rareData = static_cast<NodeRareData*>(m_data.m_rareData); |
- rareData->dispose(); |
- delete rareData; |
- } |
+ if (isElementNode()) |
+ delete static_cast<ElementRareData*>(m_data.m_rareData); |
+ else |
+ delete static_cast<NodeRareData*>(m_data.m_rareData); |
m_data.m_renderer = renderer; |
clearFlag(HasRareDataFlag); |
} |
+#endif |
Node* Node::toNode() |
{ |
@@ -2571,6 +2571,9 @@ void Node::setCustomElementState(CustomElementState newState) |
void Node::trace(Visitor* visitor) |
{ |
+ if (hasRareData()) |
+ visitor->trace(rareData()); |
+ |
visitor->trace(m_treeScope); |
} |