Title: [138235] trunk/Source/WebCore
Revision
138235
Author
carlo...@webkit.org
Date
2012-12-20 01:18:09 -0800 (Thu, 20 Dec 2012)

Log Message

Make order iterator member stack allocated in RenderFlexibleBox
https://bugs.webkit.org/show_bug.cgi?id=104366

Reviewed by Tony Chang.

It avoids a heap allocation during layout.

* rendering/RenderFlexibleBox.cpp:
(WebCore::RenderFlexibleBox::OrderIterator::OrderIterator):
(WebCore::RenderFlexibleBox::OrderIterator::setOrderValues):
(WebCore::RenderFlexibleBox::OrderIterator::first):
(WebCore::RenderFlexibleBox::OrderIterator::next):
(WebCore::RenderFlexibleBox::OrderIterator::reset):
(WebCore::RenderFlexibleBox::RenderFlexibleBox):
(WebCore::RenderFlexibleBox::firstLineBoxBaseline):
(WebCore::RenderFlexibleBox::layoutBlock):
(WebCore::RenderFlexibleBox::appendChildFrameRects):
(WebCore::RenderFlexibleBox::repaintChildrenDuringLayoutIfMoved):
(WebCore::RenderFlexibleBox::paintChildren):
(WebCore::RenderFlexibleBox::layoutFlexItems):
(WebCore::RenderFlexibleBox::computeNextFlexLine):
(WebCore::RenderFlexibleBox::alignFlexLines):
(WebCore::RenderFlexibleBox::alignChildren):
(WebCore::RenderFlexibleBox::flipForRightToLeftColumn):
(WebCore::RenderFlexibleBox::flipForWrapReverse):
* rendering/RenderFlexibleBox.h:
(OrderIterator):
(WebCore::RenderFlexibleBox::OrderIterator::currentChild):
(RenderFlexibleBox):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (138234 => 138235)


--- trunk/Source/WebCore/ChangeLog	2012-12-20 09:12:26 UTC (rev 138234)
+++ trunk/Source/WebCore/ChangeLog	2012-12-20 09:18:09 UTC (rev 138235)
@@ -1,3 +1,35 @@
+2012-12-19  Carlos Garcia Campos  <cgar...@igalia.com>
+
+        Make order iterator member stack allocated in RenderFlexibleBox
+        https://bugs.webkit.org/show_bug.cgi?id=104366
+
+        Reviewed by Tony Chang.
+
+        It avoids a heap allocation during layout.
+
+        * rendering/RenderFlexibleBox.cpp:
+        (WebCore::RenderFlexibleBox::OrderIterator::OrderIterator):
+        (WebCore::RenderFlexibleBox::OrderIterator::setOrderValues):
+        (WebCore::RenderFlexibleBox::OrderIterator::first):
+        (WebCore::RenderFlexibleBox::OrderIterator::next):
+        (WebCore::RenderFlexibleBox::OrderIterator::reset):
+        (WebCore::RenderFlexibleBox::RenderFlexibleBox):
+        (WebCore::RenderFlexibleBox::firstLineBoxBaseline):
+        (WebCore::RenderFlexibleBox::layoutBlock):
+        (WebCore::RenderFlexibleBox::appendChildFrameRects):
+        (WebCore::RenderFlexibleBox::repaintChildrenDuringLayoutIfMoved):
+        (WebCore::RenderFlexibleBox::paintChildren):
+        (WebCore::RenderFlexibleBox::layoutFlexItems):
+        (WebCore::RenderFlexibleBox::computeNextFlexLine):
+        (WebCore::RenderFlexibleBox::alignFlexLines):
+        (WebCore::RenderFlexibleBox::alignChildren):
+        (WebCore::RenderFlexibleBox::flipForRightToLeftColumn):
+        (WebCore::RenderFlexibleBox::flipForWrapReverse):
+        * rendering/RenderFlexibleBox.h:
+        (OrderIterator):
+        (WebCore::RenderFlexibleBox::OrderIterator::currentChild):
+        (RenderFlexibleBox):
+
 2012-12-20  Huang Dongsung  <luxte...@company100.net>
 
         Remove GraphicsLayer::setGraphicsLayerFactory().

Modified: trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp (138234 => 138235)


--- trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp	2012-12-20 09:12:26 UTC (rev 138234)
+++ trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp	2012-12-20 09:18:09 UTC (rev 138235)
@@ -49,58 +49,52 @@
     static bool isDeletedValue(int value) { return value == std::numeric_limits<int>::min() + 1; }
 };
 
-class RenderFlexibleBox::OrderIterator {
-public:
-    OrderIterator(RenderFlexibleBox* flexibleBox, const OrderHashSet& orderValues)
-        : m_flexibleBox(flexibleBox)
-        , m_currentChild(0)
-        , m_orderValuesIterator(0)
-    {
-        copyToVector(orderValues, m_orderValues);
-        std::sort(m_orderValues.begin(), m_orderValues.end());
-    }
+RenderFlexibleBox::OrderIterator::OrderIterator(const RenderFlexibleBox* flexibleBox)
+    : m_flexibleBox(flexibleBox)
+    , m_currentChild(0)
+    , m_orderValuesIterator(0)
+{
+}
 
-    RenderBox* currentChild() { return m_currentChild; }
+void RenderFlexibleBox::OrderIterator::setOrderValues(const OrderHashSet& orderValues)
+{
+    reset();
+    copyToVector(orderValues, m_orderValues);
+    std::sort(m_orderValues.begin(), m_orderValues.end());
+}
 
-    RenderBox* first()
-    {
-        reset();
-        return next();
-    }
+RenderBox* RenderFlexibleBox::OrderIterator::first()
+{
+    reset();
+    return next();
+}
 
-    RenderBox* next()
-    {
-        do {
-            if (!m_currentChild) {
+RenderBox* RenderFlexibleBox::OrderIterator::next()
+{
+    do {
+        if (!m_currentChild) {
+            if (m_orderValuesIterator == m_orderValues.end())
+                return 0;
+            if (m_orderValuesIterator) {
+                ++m_orderValuesIterator;
                 if (m_orderValuesIterator == m_orderValues.end())
                     return 0;
-                if (m_orderValuesIterator) {
-                    ++m_orderValuesIterator;
-                    if (m_orderValuesIterator == m_orderValues.end())
-                        return 0;
-                } else
-                    m_orderValuesIterator = m_orderValues.begin();
-
-                m_currentChild = m_flexibleBox->firstChildBox();
             } else
-                m_currentChild = m_currentChild->nextSiblingBox();
-        } while (!m_currentChild || m_currentChild->style()->order() != *m_orderValuesIterator);
+                m_orderValuesIterator = m_orderValues.begin();
 
-        return m_currentChild;
-    }
+            m_currentChild = m_flexibleBox->firstChildBox();
+        } else
+            m_currentChild = m_currentChild->nextSiblingBox();
+    } while (!m_currentChild || m_currentChild->style()->order() != *m_orderValuesIterator);
 
-    void reset()
-    {
-        m_currentChild = 0;
-        m_orderValuesIterator = 0;
-    }
+    return m_currentChild;
+}
 
-private:
-    RenderFlexibleBox* m_flexibleBox;
-    RenderBox* m_currentChild;
-    Vector<int> m_orderValues;
-    Vector<int>::const_iterator m_orderValuesIterator;
-};
+void RenderFlexibleBox::OrderIterator::reset()
+{
+    m_currentChild = 0;
+    m_orderValuesIterator = 0;
+}
 
 struct RenderFlexibleBox::LineContext {
     LineContext(LayoutUnit crossAxisOffset, LayoutUnit crossAxisExtent, size_t numberOfChildren, LayoutUnit maxAscent)
@@ -131,6 +125,7 @@
 
 RenderFlexibleBox::RenderFlexibleBox(Node* node)
     : RenderBlock(node)
+    , m_orderIterator(this)
     , m_numberOfInFlowChildrenOnFirstLine(-1)
 {
     setChildrenInline(false); // All of our children must be block-level.
@@ -251,13 +246,11 @@
 
 int RenderFlexibleBox::firstLineBoxBaseline() const
 {
-    ASSERT(m_orderIterator);
-
     if (isWritingModeRoot() || m_numberOfInFlowChildrenOnFirstLine <= 0)
         return -1;
     RenderBox* baselineChild = 0;
     int childNumber = 0;
-    for (RenderBox* child = m_orderIterator->first(); child; child = m_orderIterator->next()) {
+    for (RenderBox* child = m_orderIterator.first(); child; child = m_orderIterator.next()) {
         if (child->isOutOfFlowPositioned())
             continue;
         if (alignmentForChild(child) == AlignBaseline && !hasAutoMarginsInCrossAxis(child)) {
@@ -331,7 +324,7 @@
     Vector<LineContext> lineContexts;
     OrderHashSet orderValues;
     computeMainAxisPreferredSizes(orderValues);
-    m_orderIterator = adoptPtr(new OrderIterator(this, orderValues));
+    m_orderIterator.setOrderValues(orderValues);
 
     ChildFrameRects oldChildRects;
     appendChildFrameRects(oldChildRects);
@@ -369,9 +362,7 @@
 
 void RenderFlexibleBox::appendChildFrameRects(ChildFrameRects& childFrameRects)
 {
-    ASSERT(m_orderIterator);
-
-    for (RenderBox* child = m_orderIterator->first(); child; child = m_orderIterator->next()) {
+    for (RenderBox* child = m_orderIterator.first(); child; child = m_orderIterator.next()) {
         if (!child->isOutOfFlowPositioned())
             childFrameRects.append(child->frameRect());
     }
@@ -379,10 +370,8 @@
 
 void RenderFlexibleBox::repaintChildrenDuringLayoutIfMoved(const ChildFrameRects& oldChildRects)
 {
-    ASSERT(m_orderIterator);
-
     size_t childIndex = 0;
-    for (RenderBox* child = m_orderIterator->first(); child; child = m_orderIterator->next()) {
+    for (RenderBox* child = m_orderIterator.first(); child; child = m_orderIterator.next()) {
         if (child->isOutOfFlowPositioned())
             continue;
 
@@ -398,9 +387,7 @@
 
 void RenderFlexibleBox::paintChildren(PaintInfo& paintInfo, const LayoutPoint& paintOffset, PaintInfo& paintInfoForChild, bool usePrintRect)
 {
-    ASSERT(m_orderIterator);
-
-    for (RenderBox* child = m_orderIterator->first(); child; child = m_orderIterator->next()) {
+    for (RenderBox* child = m_orderIterator.first(); child; child = m_orderIterator.next()) {
         if (!paintChild(child, paintInfo, paintOffset, paintInfoForChild, usePrintRect))
             return;
     }
@@ -725,15 +712,13 @@
 
 void RenderFlexibleBox::layoutFlexItems(bool relayoutChildren, Vector<LineContext>& lineContexts)
 {
-    ASSERT(m_orderIterator);
-
     OrderedFlexItemList orderedChildren;
     LayoutUnit preferredMainAxisExtent;
     double totalFlexGrow;
     double totalWeightedFlexShrink;
     LayoutUnit minMaxAppliedMainAxisExtent;
 
-    m_orderIterator->first();
+    m_orderIterator.first();
     LayoutUnit crossAxisOffset = flowAwareBorderBefore() + flowAwarePaddingBefore();
     while (computeNextFlexLine(orderedChildren, preferredMainAxisExtent, totalFlexGrow, totalWeightedFlexShrink, minMaxAppliedMainAxisExtent)) {
         LayoutUnit availableFreeSpace = mainAxisContentExtent(preferredMainAxisExtent) - preferredMainAxisExtent;
@@ -915,20 +900,18 @@
 
 bool RenderFlexibleBox::computeNextFlexLine(OrderedFlexItemList& orderedChildren, LayoutUnit& preferredMainAxisExtent, double& totalFlexGrow, double& totalWeightedFlexShrink, LayoutUnit& minMaxAppliedMainAxisExtent)
 {
-    ASSERT(m_orderIterator);
-
     orderedChildren.clear();
     preferredMainAxisExtent = 0;
     totalFlexGrow = totalWeightedFlexShrink = 0;
     minMaxAppliedMainAxisExtent = 0;
 
-    if (!m_orderIterator->currentChild())
+    if (!m_orderIterator.currentChild())
         return false;
 
     LayoutUnit lineBreakLength = mainAxisContentExtent(LayoutUnit::max());
     bool lineHasInFlowItem = false;
 
-    for (RenderBox* child = m_orderIterator->currentChild(); child; child = m_orderIterator->next()) {
+    for (RenderBox* child = m_orderIterator.currentChild(); child; child = m_orderIterator.next()) {
         if (child->isOutOfFlowPositioned()) {
             orderedChildren.append(child);
             continue;
@@ -1248,8 +1231,6 @@
 
 void RenderFlexibleBox::alignFlexLines(Vector<LineContext>& lineContexts)
 {
-    ASSERT(m_orderIterator);
-
     if (!isMultiline() || style()->alignContent() == AlignContentFlexStart)
         return;
 
@@ -1257,11 +1238,11 @@
     for (size_t i = 0; i < lineContexts.size(); ++i)
         availableCrossAxisSpace -= lineContexts[i].crossAxisExtent;
 
-    RenderBox* child = m_orderIterator->first();
+    RenderBox* child = m_orderIterator.first();
     LayoutUnit lineOffset = initialAlignContentOffset(availableCrossAxisSpace, style()->alignContent(), lineContexts.size());
     for (unsigned lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber) {
         lineContexts[lineNumber].crossAxisOffset += lineOffset;
-        for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numberOfChildren; ++childNumber, child = m_orderIterator->next())
+        for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numberOfChildren; ++childNumber, child = m_orderIterator.next())
             adjustAlignmentForChild(child, lineOffset);
 
         if (style()->alignContent() == AlignContentStretch && availableCrossAxisSpace > 0)
@@ -1288,18 +1269,16 @@
 
 void RenderFlexibleBox::alignChildren(const Vector<LineContext>& lineContexts)
 {
-    ASSERT(m_orderIterator);
-
     // Keep track of the space between the baseline edge and the after edge of the box for each line.
     Vector<LayoutUnit> minMarginAfterBaselines;
 
-    RenderBox* child = m_orderIterator->first();
+    RenderBox* child = m_orderIterator.first();
     for (size_t lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber) {
         LayoutUnit minMarginAfterBaseline = LayoutUnit::max();
         LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisExtent;
         LayoutUnit maxAscent = lineContexts[lineNumber].maxAscent;
 
-        for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numberOfChildren; ++childNumber, child = m_orderIterator->next()) {
+        for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numberOfChildren; ++childNumber, child = m_orderIterator.next()) {
             ASSERT(child);
             if (child->isOutOfFlowPositioned()) {
                 if (style()->flexWrap() == FlexWrapReverse)
@@ -1350,10 +1329,10 @@
 
     // wrap-reverse flips the cross axis start and end. For baseline alignment, this means we
     // need to align the after edge of baseline elements with the after edge of the flex line.
-    child = m_orderIterator->first();
+    child = m_orderIterator.first();
     for (size_t lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber) {
         LayoutUnit minMarginAfterBaseline = minMarginAfterBaselines[lineNumber];
-        for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numberOfChildren; ++childNumber, child = m_orderIterator->next()) {
+        for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numberOfChildren; ++childNumber, child = m_orderIterator.next()) {
             ASSERT(child);
             if (alignmentForChild(child) == AlignBaseline && !hasAutoMarginsInCrossAxis(child) && minMarginAfterBaseline)
                 adjustAlignmentForChild(child, minMarginAfterBaseline);
@@ -1394,13 +1373,11 @@
 
 void RenderFlexibleBox::flipForRightToLeftColumn()
 {
-    ASSERT(m_orderIterator);
-
     if (style()->isLeftToRightDirection() || !isColumnFlow())
         return;
 
     LayoutUnit crossExtent = crossAxisExtent();
-    for (RenderBox* child = m_orderIterator->first(); child; child = m_orderIterator->next()) {
+    for (RenderBox* child = m_orderIterator.first(); child; child = m_orderIterator.next()) {
         if (child->isOutOfFlowPositioned())
             continue;
         LayoutPoint location = flowAwareLocationForChild(child);
@@ -1411,12 +1388,10 @@
 
 void RenderFlexibleBox::flipForWrapReverse(const Vector<LineContext>& lineContexts, LayoutUnit crossAxisStartEdge)
 {
-    ASSERT(m_orderIterator);
-
     LayoutUnit contentExtent = crossAxisContentExtent();
-    RenderBox* child = m_orderIterator->first();
+    RenderBox* child = m_orderIterator.first();
     for (size_t lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber) {
-        for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numberOfChildren; ++childNumber, child = m_orderIterator->next()) {
+        for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numberOfChildren; ++childNumber, child = m_orderIterator.next()) {
             ASSERT(child);
             LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisExtent;
             LayoutUnit originalOffset = lineContexts[lineNumber].crossAxisOffset - crossAxisStartEdge;

Modified: trunk/Source/WebCore/rendering/RenderFlexibleBox.h (138234 => 138235)


--- trunk/Source/WebCore/rendering/RenderFlexibleBox.h	2012-12-20 09:12:26 UTC (rev 138234)
+++ trunk/Source/WebCore/rendering/RenderFlexibleBox.h	2012-12-20 09:18:09 UTC (rev 138235)
@@ -32,7 +32,6 @@
 #define RenderFlexibleBox_h
 
 #include "RenderBlock.h"
-#include <wtf/OwnPtr.h>
 
 namespace WebCore {
 
@@ -71,7 +70,23 @@
     struct OrderHashTraits;
     typedef HashSet<int, DefaultHash<int>::Hash, OrderHashTraits> OrderHashSet;
 
-    class OrderIterator;
+    class OrderIterator {
+        WTF_MAKE_NONCOPYABLE(OrderIterator);
+    public:
+        OrderIterator(const RenderFlexibleBox*);
+        void setOrderValues(const OrderHashSet&);
+        RenderBox* currentChild() const { return m_currentChild; }
+        RenderBox* first();
+        RenderBox* next();
+        void reset();
+
+    private:
+        const RenderFlexibleBox* m_flexibleBox;
+        RenderBox* m_currentChild;
+        Vector<int> m_orderValues;
+        Vector<int>::const_iterator m_orderValuesIterator;
+    };
+
     typedef HashMap<const RenderBox*, LayoutUnit> InflexibleFlexItemSize;
     typedef Vector<RenderBox*> OrderedFlexItemList;
 
@@ -152,7 +167,7 @@
     void flipForRightToLeftColumn();
     void flipForWrapReverse(const Vector<LineContext>&, LayoutUnit crossAxisStartEdge);
 
-    OwnPtr<OrderIterator> m_orderIterator;
+    mutable OrderIterator m_orderIterator;
     int m_numberOfInFlowChildrenOnFirstLine;
 };
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to