Title: [159150] trunk/Source/WebCore
Revision
159150
Author
[email protected]
Date
2013-11-12 14:51:12 -0800 (Tue, 12 Nov 2013)

Log Message

Make RenderBlockRareData be in a hashtable instead of being a member variable.
https://bugs.webkit.org/show_bug.cgi?id=124056

Reviewed by Anders Carlsson.

Right now RenderBlock has 4 bytes taken up by a m_rareData member that is almost
never allocated. This is better off in a separate hash, so that RenderBlock can
get 4 bytes back.
        
Since RenderBlockFlow's rare data member was recently removed and folded into
RenderBlock, we need to undo that change and put the rare data member back in
RenderBlockFlow. RenderBlockFlowRareData inheriting from RenderBlockRareData
was not a good idea anyway, since RenderBlockFlows also very rarely need the
RenderBlockRareData members, and were thus paying a heavier cost when the rare
data was created than was necessary.
 
* rendering/RenderBlock.cpp:
(WebCore::RenderBlockRareData::RenderBlockRareData):
(WebCore::RenderBlock::~RenderBlock):
(WebCore::RenderBlock::hasRareData):
(WebCore::getRareData):
(WebCore::ensureRareData):
(WebCore::RenderBlock::ensureShapeInsideInfo):
(WebCore::RenderBlock::shapeInsideInfo):
(WebCore::RenderBlock::setShapeInsideInfo):
(WebCore::RenderBlock::paginationStrut):
(WebCore::RenderBlock::pageLogicalOffset):
(WebCore::RenderBlock::setPaginationStrut):
(WebCore::RenderBlock::setPageLogicalOffset):
* rendering/RenderBlock.h:
* rendering/RenderBlockFlow.cpp:
(WebCore::RenderBlockFlow::setMaxMarginBeforeValues):
(WebCore::RenderBlockFlow::setMaxMarginAfterValues):
(WebCore::RenderBlockFlow::setMustDiscardMarginBefore):
(WebCore::RenderBlockFlow::setMustDiscardMarginAfter):
(WebCore::RenderBlockFlow::mustDiscardMarginBefore):
(WebCore::RenderBlockFlow::mustDiscardMarginAfter):
(WebCore::RenderBlockFlow::setBreakAtLineToAvoidWidow):
(WebCore::RenderBlockFlow::setDidBreakAtLineToAvoidWidow):
(WebCore::RenderBlockFlow::clearDidBreakAtLineToAvoidWidow):
(WebCore::RenderBlockFlow::clearShouldBreakAtLineToAvoidWidow):
(WebCore::RenderBlockFlow::setRenderNamedFlowFragment):
(WebCore::RenderBlockFlow::ensureRareBlockFlowData):
(WebCore::RenderBlockFlow::materializeRareBlockFlowData):
* rendering/RenderBlockFlow.h:
(WebCore::RenderBlockFlow::shouldBreakAtLineToAvoidWidow):
(WebCore::RenderBlockFlow::lineBreakToAvoidWidow):
(WebCore::RenderBlockFlow::didBreakAtLineToAvoidWidow):
(WebCore::RenderBlockFlow::lineGridBox):
(WebCore::RenderBlockFlow::setLineGridBox):
(WebCore::RenderBlockFlow::renderNamedFlowFragment):
(WebCore::RenderBlockFlow::maxPositiveMarginBefore):
(WebCore::RenderBlockFlow::maxNegativeMarginBefore):
(WebCore::RenderBlockFlow::maxPositiveMarginAfter):
(WebCore::RenderBlockFlow::maxNegativeMarginAfter):
(WebCore::RenderBlockFlow::initMaxMarginValues):
(WebCore::RenderBlockFlow::hasRareBlockFlowData):
(WebCore::RenderBlockFlow::rareBlockFlowData):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (159149 => 159150)


--- trunk/Source/WebCore/ChangeLog	2013-11-12 22:20:14 UTC (rev 159149)
+++ trunk/Source/WebCore/ChangeLog	2013-11-12 22:51:12 UTC (rev 159150)
@@ -1,3 +1,64 @@
+2013-11-11  David Hyatt  <[email protected]>
+
+        Make RenderBlockRareData be in a hashtable instead of being a member variable.
+        https://bugs.webkit.org/show_bug.cgi?id=124056
+
+        Reviewed by Anders Carlsson.
+
+        Right now RenderBlock has 4 bytes taken up by a m_rareData member that is almost
+        never allocated. This is better off in a separate hash, so that RenderBlock can
+        get 4 bytes back.
+        
+        Since RenderBlockFlow's rare data member was recently removed and folded into
+        RenderBlock, we need to undo that change and put the rare data member back in
+        RenderBlockFlow. RenderBlockFlowRareData inheriting from RenderBlockRareData
+        was not a good idea anyway, since RenderBlockFlows also very rarely need the
+        RenderBlockRareData members, and were thus paying a heavier cost when the rare
+        data was created than was necessary.
+ 
+        * rendering/RenderBlock.cpp:
+        (WebCore::RenderBlockRareData::RenderBlockRareData):
+        (WebCore::RenderBlock::~RenderBlock):
+        (WebCore::RenderBlock::hasRareData):
+        (WebCore::getRareData):
+        (WebCore::ensureRareData):
+        (WebCore::RenderBlock::ensureShapeInsideInfo):
+        (WebCore::RenderBlock::shapeInsideInfo):
+        (WebCore::RenderBlock::setShapeInsideInfo):
+        (WebCore::RenderBlock::paginationStrut):
+        (WebCore::RenderBlock::pageLogicalOffset):
+        (WebCore::RenderBlock::setPaginationStrut):
+        (WebCore::RenderBlock::setPageLogicalOffset):
+        * rendering/RenderBlock.h:
+        * rendering/RenderBlockFlow.cpp:
+        (WebCore::RenderBlockFlow::setMaxMarginBeforeValues):
+        (WebCore::RenderBlockFlow::setMaxMarginAfterValues):
+        (WebCore::RenderBlockFlow::setMustDiscardMarginBefore):
+        (WebCore::RenderBlockFlow::setMustDiscardMarginAfter):
+        (WebCore::RenderBlockFlow::mustDiscardMarginBefore):
+        (WebCore::RenderBlockFlow::mustDiscardMarginAfter):
+        (WebCore::RenderBlockFlow::setBreakAtLineToAvoidWidow):
+        (WebCore::RenderBlockFlow::setDidBreakAtLineToAvoidWidow):
+        (WebCore::RenderBlockFlow::clearDidBreakAtLineToAvoidWidow):
+        (WebCore::RenderBlockFlow::clearShouldBreakAtLineToAvoidWidow):
+        (WebCore::RenderBlockFlow::setRenderNamedFlowFragment):
+        (WebCore::RenderBlockFlow::ensureRareBlockFlowData):
+        (WebCore::RenderBlockFlow::materializeRareBlockFlowData):
+        * rendering/RenderBlockFlow.h:
+        (WebCore::RenderBlockFlow::shouldBreakAtLineToAvoidWidow):
+        (WebCore::RenderBlockFlow::lineBreakToAvoidWidow):
+        (WebCore::RenderBlockFlow::didBreakAtLineToAvoidWidow):
+        (WebCore::RenderBlockFlow::lineGridBox):
+        (WebCore::RenderBlockFlow::setLineGridBox):
+        (WebCore::RenderBlockFlow::renderNamedFlowFragment):
+        (WebCore::RenderBlockFlow::maxPositiveMarginBefore):
+        (WebCore::RenderBlockFlow::maxNegativeMarginBefore):
+        (WebCore::RenderBlockFlow::maxPositiveMarginAfter):
+        (WebCore::RenderBlockFlow::maxNegativeMarginAfter):
+        (WebCore::RenderBlockFlow::initMaxMarginValues):
+        (WebCore::RenderBlockFlow::hasRareBlockFlowData):
+        (WebCore::RenderBlockFlow::rareBlockFlowData):
+
 2013-11-12  Alex Christensen  <[email protected]>
 
         Build GStreamer files on Windows.

Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (159149 => 159150)


--- trunk/Source/WebCore/rendering/RenderBlock.cpp	2013-11-12 22:20:14 UTC (rev 159149)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp	2013-11-12 22:51:12 UTC (rev 159150)
@@ -86,7 +86,6 @@
 using namespace HTMLNames;
 
 struct SameSizeAsRenderBlock : public RenderBox {
-    void* pointers[1];
     uint32_t bitfields;
 };
 
@@ -109,6 +108,28 @@
 
 static bool gColumnFlowSplitEnabled = true;
 
+// Allocated only when some of these fields have non-default values
+
+struct RenderBlockRareData {
+    WTF_MAKE_NONCOPYABLE(RenderBlockRareData); WTF_MAKE_FAST_ALLOCATED;
+public:
+    RenderBlockRareData() 
+        : m_paginationStrut(0)
+        , m_pageLogicalOffset(0)
+    { 
+    }
+
+    LayoutUnit m_paginationStrut;
+    LayoutUnit m_pageLogicalOffset;
+
+#if ENABLE(CSS_SHAPES)
+    OwnPtr<ShapeInsideInfo> m_shapeInsideInfo;
+#endif
+};
+
+typedef HashMap<const RenderBlock*, std::unique_ptr<RenderBlockRareData>> RenderBlockRareDataMap;
+static RenderBlockRareDataMap* gRareDataMap = 0;
+
 // This class helps dispatching the 'overflow' event on layout change. overflow can be set on RenderBoxes, yet the existing code
 // only works on RenderBlocks. If this change, this class should be shared with other RenderBoxes.
 class OverflowEventDispatcher {
@@ -201,12 +222,19 @@
 {
     if (hasColumns())
         gColumnInfoMap->take(this);
+    if (gRareDataMap)
+        gRareDataMap->remove(this);
     if (gPercentHeightDescendantsMap)
         removeBlockFromDescendantAndContainerMaps(this, gPercentHeightDescendantsMap, gPercentHeightContainerMap);
     if (gPositionedDescendantsMap)
         removeBlockFromDescendantAndContainerMaps(this, gPositionedDescendantsMap, gPositionedContainerMap);
 }
 
+bool RenderBlock::hasRareData() const
+{
+    return gRareDataMap ? gRareDataMap->contains(this) : false;
+}
+
 void RenderBlock::willBeDestroyed()
 {
     // Mark as being destroyed to avoid trouble with merges in removeChild().
@@ -1381,6 +1409,43 @@
     }
 }
 
+static RenderBlockRareData* getRareData(const RenderBlock* block)
+{
+    return gRareDataMap ? gRareDataMap->get(block) : 0;
+}
+
+static RenderBlockRareData& ensureRareData(const RenderBlock* block)
+{
+    if (!gRareDataMap)
+        gRareDataMap = new RenderBlockRareDataMap;
+    
+    auto& rareData = gRareDataMap->add(block, nullptr).iterator->value;
+    if (!rareData)
+        rareData = std::make_unique<RenderBlockRareData>();
+    return *rareData.get();
+}
+
+ShapeInsideInfo* RenderBlock::ensureShapeInsideInfo()
+{
+    RenderBlockRareData& rareData = ensureRareData(this);
+    if (!rareData.m_shapeInsideInfo)
+        setShapeInsideInfo(ShapeInsideInfo::createInfo(this));
+    return rareData.m_shapeInsideInfo.get();
+}
+
+ShapeInsideInfo* RenderBlock::shapeInsideInfo() const
+{
+    RenderBlockRareData* rareData = getRareData(this);
+    if (!rareData || !rareData->m_shapeInsideInfo)
+        return 0;
+    return ShapeInsideInfo::isEnabledFor(this) ? rareData->m_shapeInsideInfo.get() : 0;
+}
+
+void RenderBlock::setShapeInsideInfo(PassOwnPtr<ShapeInsideInfo> value)
+{
+    ensureRareData(this).m_shapeInsideInfo = value;
+}
+    
 void RenderBlock::markShapeInsideDescendantsForLayout()
 {
     if (!everHadLayout())
@@ -4930,26 +4995,38 @@
     createFirstLetterRenderer(firstLetterBlock, toRenderText(descendant));
 }
 
+LayoutUnit RenderBlock::paginationStrut() const
+{
+    RenderBlockRareData* rareData = getRareData(this);
+    return rareData ? rareData->m_paginationStrut : LayoutUnit();
+}
+
+LayoutUnit RenderBlock::pageLogicalOffset() const
+{
+    RenderBlockRareData* rareData = getRareData(this);
+    return rareData ? rareData->m_pageLogicalOffset : LayoutUnit();
+}
+
 void RenderBlock::setPaginationStrut(LayoutUnit strut)
 {
-    if (!hasRareData()) {
+    RenderBlockRareData* rareData = getRareData(this);
+    if (!rareData) {
         if (!strut)
             return;
-        materializeRareData();
+        rareData = &ensureRareData(this);
     }
-
-    rareData()->m_paginationStrut = strut;
+    rareData->m_paginationStrut = strut;
 }
 
 void RenderBlock::setPageLogicalOffset(LayoutUnit logicalOffset)
 {
-    if (!hasRareData()) {
+    RenderBlockRareData* rareData = getRareData(this);
+    if (!rareData) {
         if (!logicalOffset)
             return;
-        materializeRareData();
+        rareData = &ensureRareData(this);
     }
-
-    rareData()->m_pageLogicalOffset = logicalOffset;
+    rareData->m_pageLogicalOffset = logicalOffset;
 }
 
 void RenderBlock::absoluteRects(Vector<IntRect>& rects, const LayoutPoint& accumulatedOffset) const
@@ -5556,23 +5633,4 @@
 }
 #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 (159149 => 159150)


--- trunk/Source/WebCore/rendering/RenderBlock.h	2013-11-12 22:20:14 UTC (rev 159149)
+++ trunk/Source/WebCore/rendering/RenderBlock.h	2013-11-12 22:51:12 UTC (rev 159150)
@@ -299,12 +299,12 @@
     unsigned columnCount(ColumnInfo*) const;
     LayoutRect columnRectAt(ColumnInfo*, unsigned) const;
 
-    LayoutUnit paginationStrut() const { return hasRareData() ? rareData()->m_paginationStrut : LayoutUnit(); }
+    LayoutUnit paginationStrut() const;
     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 hasRareData() ? rareData()->m_pageLogicalOffset : LayoutUnit(); }
+    LayoutUnit pageLogicalOffset() const;
     void setPageLogicalOffset(LayoutUnit);
 
     // Accessors for logical width/height and margins in the containing block's block-flow direction.
@@ -391,23 +391,10 @@
 #endif
 
 #if ENABLE(CSS_SHAPES)
-    ShapeInsideInfo* ensureShapeInsideInfo()
-    {
-        if (!hasRareData() || !rareData()->m_shapeInsideInfo)
-            setShapeInsideInfo(ShapeInsideInfo::createInfo(this));
-        return rareData()->m_shapeInsideInfo.get();
-    }
-
-    ShapeInsideInfo* shapeInsideInfo() const
-    {
-        if (!hasRareData() || !rareData()->m_shapeInsideInfo)
-            return nullptr;
-        return ShapeInsideInfo::isEnabledFor(this) ? rareData()->m_shapeInsideInfo.get() : nullptr;
-    }
-    void setShapeInsideInfo(PassOwnPtr<ShapeInsideInfo> value)
-    {
-        ensureRareData().m_shapeInsideInfo = value;
-    }
+    ShapeInsideInfo* ensureShapeInsideInfo();
+    ShapeInsideInfo* shapeInsideInfo() const;
+    void setShapeInsideInfo(PassOwnPtr<ShapeInsideInfo> value);
+    
     void markShapeInsideDescendantsForLayout();
     ShapeInsideInfo* layoutShapeInsideInfo() const;
     bool allowsShapeInsideInfoSharing() const { return !isInline() && !isFloating(); }
@@ -634,6 +621,9 @@
     void moveRunInUnderSiblingBlockIfNeeded(RenderObject& runIn);
     void moveRunInToOriginalPosition(RenderObject& runIn);
 
+private:
+    bool hasRareData() const;
+    
 protected:
     void dirtyForLayoutFromPercentageHeightDescendants();
     
@@ -661,37 +651,6 @@
     // FIXME-BLOCKFLOW: Remove this when the line layout stuff has all moved out of RenderBlock
     friend class LineBreaker;
 
-public:
-    // Allocated only when some of these fields have non-default values
-    struct RenderBlockRareData {
-        WTF_MAKE_NONCOPYABLE(RenderBlockRareData); WTF_MAKE_FAST_ALLOCATED;
-    public:
-        RenderBlockRareData() 
-            : m_paginationStrut(0)
-            , m_pageLogicalOffset(0)
-        { 
-        }
-
-        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:
-    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.
     unsigned m_hasMarginAfterQuirk : 1;

Modified: trunk/Source/WebCore/rendering/RenderBlockFlow.cpp (159149 => 159150)


--- trunk/Source/WebCore/rendering/RenderBlockFlow.cpp	2013-11-12 22:20:14 UTC (rev 159149)
+++ trunk/Source/WebCore/rendering/RenderBlockFlow.cpp	2013-11-12 22:51:12 UTC (rev 159150)
@@ -1172,26 +1172,26 @@
 
 void RenderBlockFlow::setMaxMarginBeforeValues(LayoutUnit pos, LayoutUnit neg)
 {
-    if (!hasRareData()) {
+    if (!hasRareBlockFlowData()) {
         if (pos == RenderBlockFlowRareData::positiveMarginBeforeDefault(*this) && neg == RenderBlockFlowRareData::negativeMarginBeforeDefault(*this))
             return;
-        materializeRareData();
+        materializeRareBlockFlowData();
     }
 
-    rareData()->m_margins.setPositiveMarginBefore(pos);
-    rareData()->m_margins.setNegativeMarginBefore(neg);
+    rareBlockFlowData()->m_margins.setPositiveMarginBefore(pos);
+    rareBlockFlowData()->m_margins.setNegativeMarginBefore(neg);
 }
 
 void RenderBlockFlow::setMaxMarginAfterValues(LayoutUnit pos, LayoutUnit neg)
 {
-    if (!hasRareData()) {
+    if (!hasRareBlockFlowData()) {
         if (pos == RenderBlockFlowRareData::positiveMarginAfterDefault(*this) && neg == RenderBlockFlowRareData::negativeMarginAfterDefault(*this))
             return;
-        materializeRareData();
+        materializeRareBlockFlowData();
     }
 
-    rareData()->m_margins.setPositiveMarginAfter(pos);
-    rareData()->m_margins.setNegativeMarginAfter(neg);
+    rareBlockFlowData()->m_margins.setPositiveMarginAfter(pos);
+    rareBlockFlowData()->m_margins.setNegativeMarginAfter(neg);
 }
 
 void RenderBlockFlow::setMustDiscardMarginBefore(bool value)
@@ -1201,13 +1201,13 @@
         return;
     }
 
-    if (!hasRareData()) {
+    if (!hasRareBlockFlowData()) {
         if (!value)
             return;
-        materializeRareData();
+        materializeRareBlockFlowData();
     }
 
-    rareData()->m_discardMarginBefore = value;
+    rareBlockFlowData()->m_discardMarginBefore = value;
 }
 
 void RenderBlockFlow::setMustDiscardMarginAfter(bool value)
@@ -1217,23 +1217,23 @@
         return;
     }
 
-    if (!hasRareData()) {
+    if (!hasRareBlockFlowData()) {
         if (!value)
             return;
-        materializeRareData();
+        materializeRareBlockFlowData();
     }
 
-    rareData()->m_discardMarginAfter = value;
+    rareBlockFlowData()->m_discardMarginAfter = value;
 }
 
 bool RenderBlockFlow::mustDiscardMarginBefore() const
 {
-    return style().marginBeforeCollapse() == MDISCARD || (hasRareData() && rareData()->m_discardMarginBefore);
+    return style().marginBeforeCollapse() == MDISCARD || (hasRareBlockFlowData() && rareBlockFlowData()->m_discardMarginBefore);
 }
 
 bool RenderBlockFlow::mustDiscardMarginAfter() const
 {
-    return style().marginAfterCollapse() == MDISCARD || (hasRareData() && rareData()->m_discardMarginAfter);
+    return style().marginAfterCollapse() == MDISCARD || (hasRareBlockFlowData() && rareBlockFlowData()->m_discardMarginAfter);
 }
 
 bool RenderBlockFlow::mustDiscardMarginBeforeForChild(const RenderBox& child) const
@@ -1519,34 +1519,34 @@
 void RenderBlockFlow::setBreakAtLineToAvoidWidow(int lineToBreak)
 {
     ASSERT(lineToBreak >= 0);
-    ASSERT(!ensureRareData().m_didBreakAtLineToAvoidWidow);
-    ensureRareData().m_lineBreakToAvoidWidow = lineToBreak;
+    ASSERT(!ensureRareBlockFlowData().m_didBreakAtLineToAvoidWidow);
+    ensureRareBlockFlowData().m_lineBreakToAvoidWidow = lineToBreak;
 }
 
 void RenderBlockFlow::setDidBreakAtLineToAvoidWidow()
 {
     ASSERT(!shouldBreakAtLineToAvoidWidow());
-    if (!hasRareData())
+    if (!hasRareBlockFlowData())
         return;
 
-    rareData()->m_didBreakAtLineToAvoidWidow = true;
+    rareBlockFlowData()->m_didBreakAtLineToAvoidWidow = true;
 }
 
 void RenderBlockFlow::clearDidBreakAtLineToAvoidWidow()
 {
-    if (!hasRareData())
+    if (!hasRareBlockFlowData())
         return;
 
-    rareData()->m_didBreakAtLineToAvoidWidow = false;
+    rareBlockFlowData()->m_didBreakAtLineToAvoidWidow = false;
 }
 
 void RenderBlockFlow::clearShouldBreakAtLineToAvoidWidow() const
 {
     ASSERT(shouldBreakAtLineToAvoidWidow());
-    if (!hasRareData())
+    if (!hasRareBlockFlowData())
         return;
 
-    rareData()->m_lineBreakToAvoidWidow = -1;
+    rareBlockFlowData()->m_lineBreakToAvoidWidow = -1;
 }
 
 bool RenderBlockFlow::relayoutToAvoidWidows(LayoutStateMaintainer& statePusher)
@@ -2816,7 +2816,7 @@
 
 void RenderBlockFlow::setRenderNamedFlowFragment(RenderNamedFlowFragment* flowFragment)
 {
-    RenderBlockFlowRareData& rareData = ensureRareData();
+    RenderBlockFlowRareData& rareData = ensureRareBlockFlowData();
     if (rareData.m_renderNamedFlowFragment)
         rareData.m_renderNamedFlowFragment->destroy();
     rareData.m_renderNamedFlowFragment = flowFragment;
@@ -3204,4 +3204,19 @@
 }
 #endif
 
-} // namespace WebCore
+RenderBlockFlow::RenderBlockFlowRareData& RenderBlockFlow::ensureRareBlockFlowData()
+{
+    if (hasRareBlockFlowData())
+        return *m_rareBlockFlowData;
+    materializeRareBlockFlowData();
+    return *m_rareBlockFlowData;
+}
+
+void RenderBlockFlow::materializeRareBlockFlowData()
+{
+    ASSERT(!hasRareBlockFlowData());
+    m_rareBlockFlowData = std::make_unique<RenderBlockFlow::RenderBlockFlowRareData>(*this);
+}
+
+}
+// namespace WebCore

Modified: trunk/Source/WebCore/rendering/RenderBlockFlow.h (159149 => 159150)


--- trunk/Source/WebCore/rendering/RenderBlockFlow.h	2013-11-12 22:20:14 UTC (rev 159149)
+++ trunk/Source/WebCore/rendering/RenderBlockFlow.h	2013-11-12 22:51:12 UTC (rev 159150)
@@ -93,7 +93,7 @@
     MarginValues marginValuesForChild(RenderBox& child) const;
 
     // Allocated only when some of these fields have non-default values
-    struct RenderBlockFlowRareData : public RenderBlockRareData {
+    struct RenderBlockFlowRareData {
         WTF_MAKE_NONCOPYABLE(RenderBlockFlowRareData); WTF_MAKE_FAST_ALLOCATED;
     public:
         RenderBlockFlowRareData(const RenderBlockFlow& block)
@@ -137,9 +137,6 @@
         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;
@@ -233,25 +230,25 @@
     void handleAfterSideOfBlock(LayoutUnit top, LayoutUnit bottom, MarginInfo&);
     void setCollapsedBottomMargin(const MarginInfo&);
 
-    bool shouldBreakAtLineToAvoidWidow() const { return hasRareData() && rareData()->m_lineBreakToAvoidWidow >= 0; }
+    bool shouldBreakAtLineToAvoidWidow() const { return hasRareBlockFlowData() && rareBlockFlowData()->m_lineBreakToAvoidWidow >= 0; }
     void clearShouldBreakAtLineToAvoidWidow() const;
-    int lineBreakToAvoidWidow() const { return hasRareData() ? rareData()->m_lineBreakToAvoidWidow : -1; }
+    int lineBreakToAvoidWidow() const { return hasRareBlockFlowData() ? rareBlockFlowData()->m_lineBreakToAvoidWidow : -1; }
     void setBreakAtLineToAvoidWidow(int);
     void clearDidBreakAtLineToAvoidWidow();
     void setDidBreakAtLineToAvoidWidow();
-    bool didBreakAtLineToAvoidWidow() const { return hasRareData() && rareData()->m_didBreakAtLineToAvoidWidow; }
+    bool didBreakAtLineToAvoidWidow() const { return hasRareBlockFlowData() && rareBlockFlowData()->m_didBreakAtLineToAvoidWidow; }
     bool relayoutToAvoidWidows(LayoutStateMaintainer&);
 
     virtual bool canHaveGeneratedChildren() const OVERRIDE;
 
-    RootInlineBox* lineGridBox() const { return hasRareData() ? rareData()->m_lineGridBox.get() : nullptr; }
+    RootInlineBox* lineGridBox() const { return hasRareBlockFlowData() ? rareBlockFlowData()->m_lineGridBox.get() : nullptr; }
     void setLineGridBox(std::unique_ptr<RootInlineBox> box)
     {
-        ensureRareData().m_lineGridBox = std::move(box);
+        ensureRareBlockFlowData().m_lineGridBox = std::move(box);
     }
     void layoutLineGridBox();
 
-    RenderNamedFlowFragment* renderNamedFlowFragment() const { return hasRareData() ? rareData()->m_renderNamedFlowFragment : nullptr; }
+    RenderNamedFlowFragment* renderNamedFlowFragment() const { return hasRareBlockFlowData() ? rareBlockFlowData()->m_renderNamedFlowFragment : nullptr; }
     void setRenderNamedFlowFragment(RenderNamedFlowFragment*);
 
     bool containsFloats() const OVERRIDE { return m_floatingObjects && !m_floatingObjects->set().isEmpty(); }
@@ -367,20 +364,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 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); }
+    LayoutUnit maxPositiveMarginBefore() const { return hasRareBlockFlowData() ? rareBlockFlowData()->m_margins.positiveMarginBefore() : RenderBlockFlowRareData::positiveMarginBeforeDefault(*this); }
+    LayoutUnit maxNegativeMarginBefore() const { return hasRareBlockFlowData() ? rareBlockFlowData()->m_margins.negativeMarginBefore() : RenderBlockFlowRareData::negativeMarginBeforeDefault(*this); }
+    LayoutUnit maxPositiveMarginAfter() const { return hasRareBlockFlowData() ? rareBlockFlowData()->m_margins.positiveMarginAfter() : RenderBlockFlowRareData::positiveMarginAfterDefault(*this); }
+    LayoutUnit maxNegativeMarginAfter() const { return hasRareBlockFlowData() ? rareBlockFlowData()->m_margins.negativeMarginAfter() : RenderBlockFlowRareData::negativeMarginAfterDefault(*this); }
 
     void initMaxMarginValues()
     {
-        if (!hasRareData())
+        if (!hasRareBlockFlowData())
             return;
 
-        rareData()->m_margins = MarginValues(RenderBlockFlowRareData::positiveMarginBeforeDefault(*this) , RenderBlockFlowRareData::negativeMarginBeforeDefault(*this),
+        rareBlockFlowData()->m_margins = MarginValues(RenderBlockFlowRareData::positiveMarginBeforeDefault(*this) , RenderBlockFlowRareData::negativeMarginBeforeDefault(*this),
             RenderBlockFlowRareData::positiveMarginAfterDefault(*this), RenderBlockFlowRareData::negativeMarginAfterDefault(*this));
-        rareData()->m_discardMarginBefore = false;
-        rareData()->m_discardMarginAfter = false;
+        rareBlockFlowData()->m_discardMarginBefore = false;
+        rareBlockFlowData()->m_discardMarginAfter = false;
     }
 
     void setMaxMarginBeforeValues(LayoutUnit pos, LayoutUnit neg);
@@ -521,8 +518,14 @@
     // Pagination routines.
     virtual bool relayoutForPagination(bool hasSpecifiedPageLogicalHeight, LayoutUnit pageLogicalHeight, LayoutStateMaintainer&);
 
+    bool hasRareBlockFlowData() const { return m_rareBlockFlowData.get(); }
+    RenderBlockFlowRareData* rareBlockFlowData() const { ASSERT_WITH_SECURITY_IMPLICATION(hasRareBlockFlowData()); return m_rareBlockFlowData.get(); }
+    RenderBlockFlowRareData& ensureRareBlockFlowData();
+    void materializeRareBlockFlowData();
+
 protected:
     OwnPtr<FloatingObjects> m_floatingObjects;
+    std::unique_ptr<RenderBlockFlowRareData> m_rareBlockFlowData;
     RenderLineBoxList m_lineBoxes;
     std::unique_ptr<SimpleLineLayout::Layout> m_simpleLineLayout;
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to