1.18MB below RenderTableSection::setCachedCollapsedBorderValue() on Membuster3.
authorkling@webkit.org <kling@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 9 Oct 2012 05:12:56 +0000 (05:12 +0000)
committerkling@webkit.org <kling@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 9 Oct 2012 05:12:56 +0000 (05:12 +0000)
<http://webkit.org/b/98670>
<rdar://problem/12454276>

Reviewed by Anders Carlsson.

Refactor CollapsedBorderValue to only store the bits and pieces from the BorderValue
that it actually needs. Packed the whole thing into 64 bits.

Reduces memory consumption by 547kB on Membuster3.

* rendering/RenderTableCell.cpp:

    Add compile-time size assertion for CollapsedBorderValue.

* rendering/style/CollapsedBorderValue.h:
(WebCore::CollapsedBorderValue::CollapsedBorderValue):
(WebCore::CollapsedBorderValue::width):
(WebCore::CollapsedBorderValue::style):
(WebCore::CollapsedBorderValue::color):
(WebCore::CollapsedBorderValue::isTransparent):
(WebCore::CollapsedBorderValue::precedence):
(WebCore::CollapsedBorderValue::isSameIgnoringColor):
(CollapsedBorderValue):

    Apply shrinkwrap to CollapsedBorderValue. Removed specialized copy constructor since
    the class only has primitive members now.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@130718 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/rendering/RenderTableCell.cpp
Source/WebCore/rendering/style/CollapsedBorderValue.h

index f6a21d8..95e798f 100644 (file)
@@ -1,3 +1,33 @@
+2012-10-08  Andreas Kling  <kling@webkit.org>
+
+        1.18MB below RenderTableSection::setCachedCollapsedBorderValue() on Membuster3.
+        <http://webkit.org/b/98670>
+        <rdar://problem/12454276>
+
+        Reviewed by Anders Carlsson.
+
+        Refactor CollapsedBorderValue to only store the bits and pieces from the BorderValue
+        that it actually needs. Packed the whole thing into 64 bits.
+
+        Reduces memory consumption by 547kB on Membuster3.
+
+        * rendering/RenderTableCell.cpp:
+
+            Add compile-time size assertion for CollapsedBorderValue.
+
+        * rendering/style/CollapsedBorderValue.h:
+        (WebCore::CollapsedBorderValue::CollapsedBorderValue):
+        (WebCore::CollapsedBorderValue::width):
+        (WebCore::CollapsedBorderValue::style):
+        (WebCore::CollapsedBorderValue::color):
+        (WebCore::CollapsedBorderValue::isTransparent):
+        (WebCore::CollapsedBorderValue::precedence):
+        (WebCore::CollapsedBorderValue::isSameIgnoringColor):
+        (CollapsedBorderValue):
+
+            Apply shrinkwrap to CollapsedBorderValue. Removed specialized copy constructor since
+            the class only has primitive members now.
+
 2012-10-08  Yoshifumi Inoue  <yosin@chromium.org>
 
         HTMLSelectElement::typeAheadFind depends on implementation dependent behavior
index 59bba79..f53fb07 100644 (file)
@@ -53,7 +53,7 @@ struct SameSizeAsRenderTableCell : public RenderBlock {
 };
 
 COMPILE_ASSERT(sizeof(RenderTableCell) == sizeof(SameSizeAsRenderTableCell), RenderTableCell_should_stay_small);
-
+COMPILE_ASSERT(sizeof(CollapsedBorderValue) == 8, CollapsedBorderValue_should_stay_small);
 
 RenderTableCell::RenderTableCell(Node* node)
     : RenderBlock(node)
index 049a4ac..98cee1b 100644 (file)
@@ -32,42 +32,44 @@ namespace WebCore {
 class CollapsedBorderValue {
 public:
     CollapsedBorderValue()
-        : m_precedence(BOFF)
+        : m_color(0)
+        , m_colorIsValid(false)
+        , m_width(0)
+        , m_style(BNONE)
+        , m_precedence(BOFF)
+        , m_transparent(false)
     {
     }
 
-    // This copy constructor is for preventing GCC (x86) from creating an
-    // unexpected one as written in <http://webkit.org/b/81502>.
-    CollapsedBorderValue(const CollapsedBorderValue& other)
-        : m_border(other.m_border)
-        , m_borderColor(other.m_borderColor)
-        , m_precedence(other.m_precedence)
+    CollapsedBorderValue(const BorderValue& border, const Color& color, EBorderPrecedence precedence)
+        : m_color(color.rgb())
+        , m_colorIsValid(color.isValid())
+        , m_width(border.nonZero() ? border.width() : 0)
+        , m_style(border.style())
+        , m_precedence(precedence)
+        , m_transparent(border.isTransparent())
     {
     }
 
-    CollapsedBorderValue(const BorderValue& b, Color c, EBorderPrecedence p)
-        : m_border(b)
-        , m_borderColor(c)
-        , m_precedence(p)
-    {
-    }
-
-    int width() const { return m_border.nonZero() ? m_border.width() : 0; }
-    EBorderStyle style() const { return m_border.style(); }
+    unsigned width() const { return m_width; }
+    EBorderStyle style() const { return static_cast<EBorderStyle>(m_style); }
     bool exists() const { return m_precedence != BOFF; }
-    const Color& color() const { return m_borderColor; }
-    bool isTransparent() const { return m_border.isTransparent(); }
-    EBorderPrecedence precedence() const { return m_precedence; }
+    Color color() const { return Color(m_color, m_colorIsValid); }
+    bool isTransparent() const { return m_transparent; }
+    EBorderPrecedence precedence() const { return static_cast<EBorderPrecedence>(m_precedence); }
 
     bool isSameIgnoringColor(const CollapsedBorderValue& o) const
     {
-        return m_border.width() == o.m_border.width() && m_border.style() == o.m_border.style() && m_precedence == o.m_precedence;
+        return width() == o.width() && style() == o.style() && precedence() == o.precedence();
     }
 
 private:
-    BorderValue m_border;
-    Color m_borderColor;
-    EBorderPrecedence m_precedence;
+    RGBA32 m_color;
+    unsigned m_colorIsValid : 1;
+    unsigned m_width : 23;
+    unsigned m_style : 4; // EBorderStyle
+    unsigned m_precedence : 3; // EBorderPrecedence
+    unsigned m_transparent : 1;
 };
 
 } // namespace WebCore