Title: [159034] trunk/Source/WebCore
Revision
159034
Author
wei...@apple.com
Date
2013-11-10 16:22:38 -0800 (Sun, 10 Nov 2013)

Log Message

Reduce the size of RenderBlockFlow by making its rare data inherit from RenderBlockRareData
https://bugs.webkit.org/show_bug.cgi?id=124124

Reviewed by Anders Carlsson.

Reduce RenderBlockFlow by one word.

* rendering/RenderBlock.cpp:
* rendering/RenderBlock.h:
* rendering/RenderBlockFlow.cpp:
* rendering/RenderBlockFlow.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (159033 => 159034)


--- trunk/Source/WebCore/ChangeLog	2013-11-11 00:13:11 UTC (rev 159033)
+++ trunk/Source/WebCore/ChangeLog	2013-11-11 00:22:38 UTC (rev 159034)
@@ -1,3 +1,17 @@
+2013-11-10  Sam Weinig  <s...@webkit.org>
+
+        Reduce the size of RenderBlockFlow by making its rare data inherit from RenderBlockRareData
+        https://bugs.webkit.org/show_bug.cgi?id=124124
+
+        Reviewed by Anders Carlsson.
+
+        Reduce RenderBlockFlow by one word.
+
+        * rendering/RenderBlock.cpp:
+        * rendering/RenderBlock.h:
+        * rendering/RenderBlockFlow.cpp:
+        * rendering/RenderBlockFlow.h:
+
 2013-11-10  Antti Koivisto  <an...@apple.com>
 
         Use start/end instead of textOffset/textLength for simple text runs

Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (159033 => 159034)


--- trunk/Source/WebCore/rendering/RenderBlock.cpp	2013-11-11 00:13:11 UTC (rev 159033)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp	2013-11-11 00:22:38 UTC (rev 159034)
@@ -46,6 +46,7 @@
 #include "OverflowEvent.h"
 #include "Page.h"
 #include "PaintInfo.h"
+#include "RenderBlockFlow.h"
 #include "RenderBoxRegionInfo.h"
 #include "RenderCombineText.h"
 #include "RenderDeprecatedFlexibleBox.h"
@@ -4918,22 +4919,24 @@
 
 void RenderBlock::setPaginationStrut(LayoutUnit strut)
 {
-    if (!m_rareData) {
+    if (!hasRareData()) {
         if (!strut)
             return;
-        m_rareData = adoptPtr(new RenderBlockRareData());
+        materializeRareData();
     }
-    m_rareData->m_paginationStrut = strut;
+
+    rareData()->m_paginationStrut = strut;
 }
 
 void RenderBlock::setPageLogicalOffset(LayoutUnit logicalOffset)
 {
-    if (!m_rareData) {
+    if (!hasRareData()) {
         if (!logicalOffset)
             return;
-        m_rareData = adoptPtr(new RenderBlockRareData());
+        materializeRareData();
     }
-    m_rareData->m_pageLogicalOffset = logicalOffset;
+
+    rareData()->m_pageLogicalOffset = logicalOffset;
 }
 
 void RenderBlock::absoluteRects(Vector<IntRect>& rects, const LayoutPoint& accumulatedOffset) const
@@ -5540,4 +5543,23 @@
 }
 #endif // ENABLE(IOS_TEXT_AUTOSIZING)
 
+RenderBlock::RenderBlockRareData& RenderBlock::ensureRareData()
+{
+    if (hasRareData())
+        return *m_rareData;
+
+    materializeRareData();
+    return *m_rareData;
+}
+
+void RenderBlock::materializeRareData()
+{
+    ASSERT(!hasRareData());
+
+    if (isRenderBlockFlow())
+        m_rareData = std::make_unique<RenderBlockFlow::RenderBlockFlowRareData>(toRenderBlockFlow(*this));
+    else
+        m_rareData = std::make_unique<RenderBlock::RenderBlockRareData>();
+}
+
 } // namespace WebCore

Modified: trunk/Source/WebCore/rendering/RenderBlock.h (159033 => 159034)


--- trunk/Source/WebCore/rendering/RenderBlock.h	2013-11-11 00:13:11 UTC (rev 159033)
+++ trunk/Source/WebCore/rendering/RenderBlock.h	2013-11-11 00:22:38 UTC (rev 159034)
@@ -299,12 +299,12 @@
     unsigned columnCount(ColumnInfo*) const;
     LayoutRect columnRectAt(ColumnInfo*, unsigned) const;
 
-    LayoutUnit paginationStrut() const { return m_rareData ? m_rareData->m_paginationStrut : LayoutUnit(); }
+    LayoutUnit paginationStrut() const { return hasRareData() ? rareData()->m_paginationStrut : LayoutUnit(); }
     void setPaginationStrut(LayoutUnit);
 
     // The page logical offset is the object's offset from the top of the page in the page progression
     // direction (so an x-offset in vertical text and a y-offset for horizontal text).
-    LayoutUnit pageLogicalOffset() const { return m_rareData ? m_rareData->m_pageLogicalOffset : LayoutUnit(); }
+    LayoutUnit pageLogicalOffset() const { return hasRareData() ? rareData()->m_pageLogicalOffset : LayoutUnit(); }
     void setPageLogicalOffset(LayoutUnit);
 
     // Accessors for logical width/height and margins in the containing block's block-flow direction.
@@ -393,22 +393,20 @@
 #if ENABLE(CSS_SHAPES)
     ShapeInsideInfo* ensureShapeInsideInfo()
     {
-        if (!m_rareData || !m_rareData->m_shapeInsideInfo)
+        if (!hasRareData() || !rareData()->m_shapeInsideInfo)
             setShapeInsideInfo(ShapeInsideInfo::createInfo(this));
-        return m_rareData->m_shapeInsideInfo.get();
+        return rareData()->m_shapeInsideInfo.get();
     }
 
     ShapeInsideInfo* shapeInsideInfo() const
     {
-        if (!m_rareData || !m_rareData->m_shapeInsideInfo)
-            return 0;
-        return ShapeInsideInfo::isEnabledFor(this) ? m_rareData->m_shapeInsideInfo.get() : 0;
+        if (!hasRareData() || !rareData()->m_shapeInsideInfo)
+            return nullptr;
+        return ShapeInsideInfo::isEnabledFor(this) ? rareData()->m_shapeInsideInfo.get() : nullptr;
     }
     void setShapeInsideInfo(PassOwnPtr<ShapeInsideInfo> value)
     {
-        if (!m_rareData)
-            m_rareData = adoptPtr(new RenderBlockRareData());
-        m_rareData->m_shapeInsideInfo = value;
+        ensureRareData().m_shapeInsideInfo = value;
     }
     void markShapeInsideDescendantsForLayout();
     ShapeInsideInfo* layoutShapeInsideInfo() const;
@@ -674,16 +672,25 @@
         { 
         }
 
+        virtual ~RenderBlockRareData()
+        {
+        }
+
         LayoutUnit m_paginationStrut;
         LayoutUnit m_pageLogicalOffset;
 
 #if ENABLE(CSS_SHAPES)
         OwnPtr<ShapeInsideInfo> m_shapeInsideInfo;
 #endif
-     };
+    };
 
+    bool hasRareData() const { return m_rareData.get(); }
+    RenderBlockRareData* rareData() const { ASSERT_WITH_SECURITY_IMPLICATION(hasRareData()); return m_rareData.get(); }
+    RenderBlockRareData& ensureRareData();
+    void materializeRareData();
+
 protected:
-    OwnPtr<RenderBlockRareData> m_rareData;
+    std::unique_ptr<RenderBlockRareData> m_rareData;
 
     mutable signed m_lineHeight : 25;
     unsigned m_hasMarginBeforeQuirk : 1; // Note these quirk values can't be put in RenderBlockRareData since they are set too frequently.

Modified: trunk/Source/WebCore/rendering/RenderBlockFlow.cpp (159033 => 159034)


--- trunk/Source/WebCore/rendering/RenderBlockFlow.cpp	2013-11-11 00:13:11 UTC (rev 159033)
+++ trunk/Source/WebCore/rendering/RenderBlockFlow.cpp	2013-11-11 00:22:38 UTC (rev 159034)
@@ -1172,24 +1172,26 @@
 
 void RenderBlockFlow::setMaxMarginBeforeValues(LayoutUnit pos, LayoutUnit neg)
 {
-    if (!m_rareData) {
+    if (!hasRareData()) {
         if (pos == RenderBlockFlowRareData::positiveMarginBeforeDefault(*this) && neg == RenderBlockFlowRareData::negativeMarginBeforeDefault(*this))
             return;
-        m_rareData = adoptPtr(new RenderBlockFlowRareData(*this));
+        materializeRareData();
     }
-    m_rareData->m_margins.setPositiveMarginBefore(pos);
-    m_rareData->m_margins.setNegativeMarginBefore(neg);
+
+    rareData()->m_margins.setPositiveMarginBefore(pos);
+    rareData()->m_margins.setNegativeMarginBefore(neg);
 }
 
 void RenderBlockFlow::setMaxMarginAfterValues(LayoutUnit pos, LayoutUnit neg)
 {
-    if (!m_rareData) {
+    if (!hasRareData()) {
         if (pos == RenderBlockFlowRareData::positiveMarginAfterDefault(*this) && neg == RenderBlockFlowRareData::negativeMarginAfterDefault(*this))
             return;
-        m_rareData = adoptPtr(new RenderBlockFlowRareData(*this));
+        materializeRareData();
     }
-    m_rareData->m_margins.setPositiveMarginAfter(pos);
-    m_rareData->m_margins.setNegativeMarginAfter(neg);
+
+    rareData()->m_margins.setPositiveMarginAfter(pos);
+    rareData()->m_margins.setNegativeMarginAfter(neg);
 }
 
 void RenderBlockFlow::setMustDiscardMarginBefore(bool value)
@@ -1198,14 +1200,14 @@
         ASSERT(value);
         return;
     }
-    
-    if (!m_rareData && !value)
-        return;
 
-    if (!m_rareData)
-        m_rareData = adoptPtr(new RenderBlockFlowRareData(*this));
+    if (!hasRareData()) {
+        if (!value)
+            return;
+        materializeRareData();
+    }
 
-    m_rareData->m_discardMarginBefore = value;
+    rareData()->m_discardMarginBefore = value;
 }
 
 void RenderBlockFlow::setMustDiscardMarginAfter(bool value)
@@ -1215,23 +1217,23 @@
         return;
     }
 
-    if (!m_rareData && !value)
-        return;
+    if (!hasRareData()) {
+        if (!value)
+            return;
+        materializeRareData();
+    }
 
-    if (!m_rareData)
-        m_rareData = adoptPtr(new RenderBlockFlowRareData(*this));
-
-    m_rareData->m_discardMarginAfter = value;
+    rareData()->m_discardMarginAfter = value;
 }
 
 bool RenderBlockFlow::mustDiscardMarginBefore() const
 {
-    return style().marginBeforeCollapse() == MDISCARD || (m_rareData && m_rareData->m_discardMarginBefore);
+    return style().marginBeforeCollapse() == MDISCARD || (hasRareData() && rareData()->m_discardMarginBefore);
 }
 
 bool RenderBlockFlow::mustDiscardMarginAfter() const
 {
-    return style().marginAfterCollapse() == MDISCARD || (m_rareData && m_rareData->m_discardMarginAfter);
+    return style().marginAfterCollapse() == MDISCARD || (hasRareData() && rareData()->m_discardMarginAfter);
 }
 
 bool RenderBlockFlow::mustDiscardMarginBeforeForChild(const RenderBox& child) const
@@ -1517,37 +1519,34 @@
 void RenderBlockFlow::setBreakAtLineToAvoidWidow(int lineToBreak)
 {
     ASSERT(lineToBreak >= 0);
-    if (!m_rareData)
-        m_rareData = adoptPtr(new RenderBlockFlowRareData(*this));
-
-    ASSERT(!m_rareData->m_didBreakAtLineToAvoidWidow);
-    m_rareData->m_lineBreakToAvoidWidow = lineToBreak;
+    ASSERT(!ensureRareData().m_didBreakAtLineToAvoidWidow);
+    ensureRareData().m_lineBreakToAvoidWidow = lineToBreak;
 }
 
 void RenderBlockFlow::setDidBreakAtLineToAvoidWidow()
 {
     ASSERT(!shouldBreakAtLineToAvoidWidow());
-    if (!m_rareData)
+    if (!hasRareData())
         return;
 
-    m_rareData->m_didBreakAtLineToAvoidWidow = true;
+    rareData()->m_didBreakAtLineToAvoidWidow = true;
 }
 
 void RenderBlockFlow::clearDidBreakAtLineToAvoidWidow()
 {
-    if (!m_rareData)
+    if (!hasRareData())
         return;
 
-    m_rareData->m_didBreakAtLineToAvoidWidow = false;
+    rareData()->m_didBreakAtLineToAvoidWidow = false;
 }
 
 void RenderBlockFlow::clearShouldBreakAtLineToAvoidWidow() const
 {
     ASSERT(shouldBreakAtLineToAvoidWidow());
-    if (!m_rareData)
+    if (!hasRareData())
         return;
 
-    m_rareData->m_lineBreakToAvoidWidow = -1;
+    rareData()->m_lineBreakToAvoidWidow = -1;
 }
 
 bool RenderBlockFlow::relayoutToAvoidWidows(LayoutStateMaintainer& statePusher)
@@ -2823,16 +2822,6 @@
     rareData.m_renderNamedFlowFragment = flowFragment;
 }
 
-// FIXME: Use this function in more places.
-RenderBlockFlow::RenderBlockFlowRareData& RenderBlockFlow::ensureRareData()
-{
-    if (m_rareData)
-        return *m_rareData;
-
-    m_rareData = adoptPtr(new RenderBlockFlowRareData(*this));
-    return *m_rareData;
-}
-
 static bool shouldCheckLines(RenderObject& obj)
 {
     return !obj.isFloatingOrOutOfFlowPositioned() && !obj.isRunIn() && obj.isRenderBlockFlow() && obj.style().height().isAuto() && (!obj.isDeprecatedFlexibleBox() || obj.style().boxOrient() == VERTICAL);

Modified: trunk/Source/WebCore/rendering/RenderBlockFlow.h (159033 => 159034)


--- trunk/Source/WebCore/rendering/RenderBlockFlow.h	2013-11-11 00:13:11 UTC (rev 159033)
+++ trunk/Source/WebCore/rendering/RenderBlockFlow.h	2013-11-11 00:22:38 UTC (rev 159034)
@@ -71,7 +71,8 @@
             , m_negativeMarginBefore(beforeNeg)
             , m_positiveMarginAfter(afterPos)
             , m_negativeMarginAfter(afterNeg)
-        { }
+        {
+        }
         
         LayoutUnit positiveMarginBefore() const { return m_positiveMarginBefore; }
         LayoutUnit negativeMarginBefore() const { return m_negativeMarginBefore; }
@@ -92,7 +93,7 @@
     MarginValues marginValuesForChild(RenderBox& child) const;
 
     // Allocated only when some of these fields have non-default values
-    struct RenderBlockFlowRareData {
+    struct RenderBlockFlowRareData : public RenderBlockRareData {
         WTF_MAKE_NONCOPYABLE(RenderBlockFlowRareData); WTF_MAKE_FAST_ALLOCATED;
     public:
         RenderBlockFlowRareData(const RenderBlockFlow& block)
@@ -105,6 +106,10 @@
         { 
         }
 
+        virtual ~RenderBlockFlowRareData()
+        {
+        }
+
         static LayoutUnit positiveMarginBeforeDefault(const RenderBlock& block)
         { 
             return std::max<LayoutUnit>(block.marginBefore(), 0);
@@ -132,6 +137,9 @@
         bool m_didBreakAtLineToAvoidWidow : 1;
     };
 
+    RenderBlockFlowRareData* rareData() const { return static_cast<RenderBlockFlowRareData*>(RenderBlock::rareData()); }
+    RenderBlockFlowRareData& ensureRareData() { return static_cast<RenderBlockFlowRareData&>(RenderBlock::ensureRareData()); }
+
     class MarginInfo {
         // Collapsing flags for whether we can collapse our margins with our children's margins.
         bool m_canCollapseWithChildren : 1;
@@ -225,27 +233,25 @@
     void handleAfterSideOfBlock(LayoutUnit top, LayoutUnit bottom, MarginInfo&);
     void setCollapsedBottomMargin(const MarginInfo&);
 
-    bool shouldBreakAtLineToAvoidWidow() const { return m_rareData && m_rareData->m_lineBreakToAvoidWidow >= 0; }
+    bool shouldBreakAtLineToAvoidWidow() const { return hasRareData() && rareData()->m_lineBreakToAvoidWidow >= 0; }
     void clearShouldBreakAtLineToAvoidWidow() const;
-    int lineBreakToAvoidWidow() const { return m_rareData ? m_rareData->m_lineBreakToAvoidWidow : -1; }
+    int lineBreakToAvoidWidow() const { return hasRareData() ? rareData()->m_lineBreakToAvoidWidow : -1; }
     void setBreakAtLineToAvoidWidow(int);
     void clearDidBreakAtLineToAvoidWidow();
     void setDidBreakAtLineToAvoidWidow();
-    bool didBreakAtLineToAvoidWidow() const { return m_rareData && m_rareData->m_didBreakAtLineToAvoidWidow; }
+    bool didBreakAtLineToAvoidWidow() const { return hasRareData() && rareData()->m_didBreakAtLineToAvoidWidow; }
     bool relayoutToAvoidWidows(LayoutStateMaintainer&);
 
     virtual bool canHaveGeneratedChildren() const OVERRIDE;
 
-    RootInlineBox* lineGridBox() const { return m_rareData ? m_rareData->m_lineGridBox.get() : nullptr; }
+    RootInlineBox* lineGridBox() const { return hasRareData() ? rareData()->m_lineGridBox.get() : nullptr; }
     void setLineGridBox(std::unique_ptr<RootInlineBox> box)
     {
-        if (!m_rareData)
-            m_rareData = adoptPtr(new RenderBlockFlowRareData(*this));
-        m_rareData->m_lineGridBox = std::move(box);
+        ensureRareData().m_lineGridBox = std::move(box);
     }
     void layoutLineGridBox();
 
-    RenderNamedFlowFragment* renderNamedFlowFragment() const { return m_rareData ? m_rareData->m_renderNamedFlowFragment : 0; }
+    RenderNamedFlowFragment* renderNamedFlowFragment() const { return hasRareData() ? rareData()->m_renderNamedFlowFragment : nullptr; }
     void setRenderNamedFlowFragment(RenderNamedFlowFragment*);
 
     bool containsFloats() const OVERRIDE { return m_floatingObjects && !m_floatingObjects->set().isEmpty(); }
@@ -360,19 +366,20 @@
     LayoutUnit applyBeforeBreak(RenderBox& child, LayoutUnit logicalOffset); // If the child has a before break, then return a new yPos that shifts to the top of the next page/column.
     LayoutUnit applyAfterBreak(RenderBox& child, LayoutUnit logicalOffset, MarginInfo&); // If the child has an after break, then return a new offset that shifts to the top of the next page/column.
 
-    LayoutUnit maxPositiveMarginBefore() const { return m_rareData ? m_rareData->m_margins.positiveMarginBefore() : RenderBlockFlowRareData::positiveMarginBeforeDefault(*this); }
-    LayoutUnit maxNegativeMarginBefore() const { return m_rareData ? m_rareData->m_margins.negativeMarginBefore() : RenderBlockFlowRareData::negativeMarginBeforeDefault(*this); }
-    LayoutUnit maxPositiveMarginAfter() const { return m_rareData ? m_rareData->m_margins.positiveMarginAfter() : RenderBlockFlowRareData::positiveMarginAfterDefault(*this); }
-    LayoutUnit maxNegativeMarginAfter() const { return m_rareData ? m_rareData->m_margins.negativeMarginAfter() : RenderBlockFlowRareData::negativeMarginAfterDefault(*this); }
+    LayoutUnit maxPositiveMarginBefore() const { return hasRareData() ? rareData()->m_margins.positiveMarginBefore() : RenderBlockFlowRareData::positiveMarginBeforeDefault(*this); }
+    LayoutUnit maxNegativeMarginBefore() const { return hasRareData() ? rareData()->m_margins.negativeMarginBefore() : RenderBlockFlowRareData::negativeMarginBeforeDefault(*this); }
+    LayoutUnit maxPositiveMarginAfter() const { return hasRareData() ? rareData()->m_margins.positiveMarginAfter() : RenderBlockFlowRareData::positiveMarginAfterDefault(*this); }
+    LayoutUnit maxNegativeMarginAfter() const { return hasRareData() ? rareData()->m_margins.negativeMarginAfter() : RenderBlockFlowRareData::negativeMarginAfterDefault(*this); }
 
     void initMaxMarginValues()
     {
-        if (!m_rareData)
+        if (!hasRareData())
             return;
-        m_rareData->m_margins = MarginValues(RenderBlockFlowRareData::positiveMarginBeforeDefault(*this) , RenderBlockFlowRareData::negativeMarginBeforeDefault(*this),
+
+        rareData()->m_margins = MarginValues(RenderBlockFlowRareData::positiveMarginBeforeDefault(*this) , RenderBlockFlowRareData::negativeMarginBeforeDefault(*this),
             RenderBlockFlowRareData::positiveMarginAfterDefault(*this), RenderBlockFlowRareData::negativeMarginAfterDefault(*this));
-        m_rareData->m_discardMarginBefore = false;
-        m_rareData->m_discardMarginAfter = false;
+        rareData()->m_discardMarginBefore = false;
+        rareData()->m_discardMarginAfter = false;
     }
 
     void setMaxMarginBeforeValues(LayoutUnit pos, LayoutUnit neg);
@@ -448,7 +455,6 @@
     
     Position positionForBox(InlineBox*, bool start = true) const;
     virtual VisiblePosition positionForPointWithInlineChildren(const LayoutPoint& pointInLogicalContents) OVERRIDE;
-    RenderBlockFlowRareData& ensureRareData();
     virtual void addFocusRingRectsForInlineChildren(Vector<IntRect>& rects, const LayoutPoint& additionalOffset, const RenderLayerModelObject*) OVERRIDE;
 
 // FIXME-BLOCKFLOW: These methods have implementations in
@@ -516,7 +522,6 @@
 
 protected:
     OwnPtr<FloatingObjects> m_floatingObjects;
-    OwnPtr<RenderBlockFlowRareData> m_rareData;
     RenderLineBoxList m_lineBoxes;
     std::unique_ptr<SimpleLineLayout::Layout> m_simpleLineLayout;
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to