Title: [157306] trunk/Source/WebCore
Revision
157306
Author
[email protected]
Date
2013-10-11 09:54:27 -0700 (Fri, 11 Oct 2013)

Log Message

Unreviewed, rolling out r157297.
http://trac.webkit.org/changeset/157297
https://bugs.webkit.org/show_bug.cgi?id=122651

Caused crashes on multiple platform/mac-wk2/tiled-drawing
tests (Requested by ap on #webkit).

* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::operator new):
(WebCore::RenderLayer::operator delete):
(WebCore::RenderLayer::destroy):
* rendering/RenderLayer.h:
* rendering/RenderLayerModelObject.cpp:
(WebCore::RenderLayerModelObject::RenderLayerModelObject):
(WebCore::RenderLayerModelObject::destroyLayer):
(WebCore::RenderLayerModelObject::ensureLayer):
* rendering/RenderLayerModelObject.h:
(WebCore::RenderLayerModelObject::layer):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (157305 => 157306)


--- trunk/Source/WebCore/ChangeLog	2013-10-11 16:53:07 UTC (rev 157305)
+++ trunk/Source/WebCore/ChangeLog	2013-10-11 16:54:27 UTC (rev 157306)
@@ -1,3 +1,24 @@
+2013-10-11  Commit Queue  <[email protected]>
+
+        Unreviewed, rolling out r157297.
+        http://trac.webkit.org/changeset/157297
+        https://bugs.webkit.org/show_bug.cgi?id=122651
+
+        Caused crashes on multiple platform/mac-wk2/tiled-drawing
+        tests (Requested by ap on #webkit).
+
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::operator new):
+        (WebCore::RenderLayer::operator delete):
+        (WebCore::RenderLayer::destroy):
+        * rendering/RenderLayer.h:
+        * rendering/RenderLayerModelObject.cpp:
+        (WebCore::RenderLayerModelObject::RenderLayerModelObject):
+        (WebCore::RenderLayerModelObject::destroyLayer):
+        (WebCore::RenderLayerModelObject::ensureLayer):
+        * rendering/RenderLayerModelObject.h:
+        (WebCore::RenderLayerModelObject::layer):
+
 2013-10-11  Darin Adler  <[email protected]>
 
         Fix build.

Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (157305 => 157306)


--- trunk/Source/WebCore/rendering/RenderLayer.cpp	2013-10-11 16:53:07 UTC (rev 157305)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp	2013-10-11 16:54:27 UTC (rev 157306)
@@ -1731,6 +1731,25 @@
     }
 }
 
+void* RenderLayer::operator new(size_t sz, RenderArena& renderArena)
+{
+    return renderArena.allocate(sz);
+}
+
+void RenderLayer::operator delete(void* ptr, size_t sz)
+{
+    // Stash size where destroy can find it.
+    *(size_t *)ptr = sz;
+}
+
+void RenderLayer::destroy(RenderArena& renderArena)
+{
+    delete this;
+
+    // Recover the size left there for us by operator delete and free the memory.
+    renderArena.free(*(size_t *)this, this);
+}
+
 void RenderLayer::addChild(RenderLayer* child, RenderLayer* beforeChild)
 {
     RenderLayer* prevSibling = beforeChild ? beforeChild->previousSibling() : lastChild();

Modified: trunk/Source/WebCore/rendering/RenderLayer.h (157305 => 157306)


--- trunk/Source/WebCore/rendering/RenderLayer.h	2013-10-11 16:53:07 UTC (rev 157305)
+++ trunk/Source/WebCore/rendering/RenderLayer.h	2013-10-11 16:54:27 UTC (rev 157306)
@@ -748,6 +748,13 @@
     bool hasBlendMode() const { return false; }
 #endif
 
+    // Overloaded new operator. Derived classes must override operator new
+    // in order to allocate out of the RenderArena.
+    void* operator new(size_t, RenderArena&);
+
+    // Overridden to prevent the normal delete from being called.
+    void operator delete(void*, size_t);
+
 #if USE(ACCELERATED_COMPOSITING)
     bool isComposited() const { return m_backing != 0; }
     bool hasCompositedMask() const;
@@ -880,6 +887,9 @@
 
     IntSize clampScrollOffset(const IntSize&) const;
 
+    // The normal operator new is disallowed on all render objects.
+    void* operator new(size_t) throw();
+
     void setNextSibling(RenderLayer* next) { m_next = next; }
     void setPreviousSibling(RenderLayer* prev) { m_previous = prev; }
     void setParent(RenderLayer* parent);
@@ -1107,6 +1117,9 @@
     friend class RenderLayerCompositor;
     friend class RenderLayerModelObject;
 
+    // Only safe to call from RenderBoxModelObject::destroyLayer(RenderArena&)
+    void destroy(RenderArena&);
+
     LayoutUnit overflowTop() const;
     LayoutUnit overflowBottom() const;
     LayoutUnit overflowLeft() const;

Modified: trunk/Source/WebCore/rendering/RenderLayerModelObject.cpp (157305 => 157306)


--- trunk/Source/WebCore/rendering/RenderLayerModelObject.cpp	2013-10-11 16:53:07 UTC (rev 157305)
+++ trunk/Source/WebCore/rendering/RenderLayerModelObject.cpp	2013-10-11 16:54:27 UTC (rev 157306)
@@ -39,6 +39,7 @@
 
 RenderLayerModelObject::RenderLayerModelObject(Element* element, unsigned baseTypeFlags)
     : RenderElement(element, baseTypeFlags | RenderLayerModelObjectFlag)
+    , m_layer(0)
 {
 }
 
@@ -53,7 +54,8 @@
 {
     ASSERT(!hasLayer()); // Callers should have already called setHasLayer(false)
     ASSERT(m_layer);
-    m_layer = nullptr;
+    m_layer->destroy(renderArena());
+    m_layer = 0;
 }
 
 void RenderLayerModelObject::ensureLayer()
@@ -61,7 +63,7 @@
     if (m_layer)
         return;
 
-    m_layer = std::make_unique<RenderLayer>(*this);
+    m_layer = new (renderArena()) RenderLayer(*this);
     setHasLayer(true);
     m_layer->insertOnlyThisLayer();
 }

Modified: trunk/Source/WebCore/rendering/RenderLayerModelObject.h (157305 => 157306)


--- trunk/Source/WebCore/rendering/RenderLayerModelObject.h	2013-10-11 16:53:07 UTC (rev 157305)
+++ trunk/Source/WebCore/rendering/RenderLayerModelObject.h	2013-10-11 16:54:27 UTC (rev 157306)
@@ -38,7 +38,7 @@
     void destroyLayer();
 
     bool hasSelfPaintingLayer() const;
-    RenderLayer* layer() const { return m_layer.get(); }
+    RenderLayer* layer() const { return m_layer; }
 
     virtual void styleWillChange(StyleDifference, const RenderStyle* newStyle) OVERRIDE;
     virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle) OVERRIDE;
@@ -56,7 +56,7 @@
     virtual void willBeDestroyed() OVERRIDE;
 
 private:
-    std::unique_ptr<RenderLayer> m_layer;
+    RenderLayer* m_layer;
 
     // Used to store state between styleWillChange and styleDidChange
     static bool s_wasFloating;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to