Title: [99020] trunk/Source
Revision
99020
Author
[email protected]
Date
2011-11-01 18:12:01 -0700 (Tue, 01 Nov 2011)

Log Message

Pack RenderTableCell bits
https://bugs.webkit.org/show_bug.cgi?id=71135

Reviewed by Darin Adler.

Source/WebCore:

Tested by RenderTableCellTest unit test.
(unfortunately Chromium specific...)

This saves another 8 bytes on RenderTableCell on x86-64.

* rendering/RenderTableCell.cpp:
(WebCore::RenderTableCell::RenderTableCell):
* rendering/RenderTableCell.h:
Changed the field order to use more strict packing.

(WebCore::RenderTableCell::setCol):
(WebCore::RenderTableCell::setRow):
Added overflow checks to the 2 previous methods. We
CRASH even in release to avoid potential badness
(the limit is currently above 2 billions rows or columns
which is high enough to prevent it being hit by accident)

Source/WebKit/chromium:

* WebKit.gypi:
* tests/RenderTableCellTest.cpp: Added.
Added some tests for the column/row index limit
that was implemented in RenderTableCell.

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (99019 => 99020)


--- trunk/Source/WebCore/ChangeLog	2011-11-02 00:55:49 UTC (rev 99019)
+++ trunk/Source/WebCore/ChangeLog	2011-11-02 01:12:01 UTC (rev 99020)
@@ -1,3 +1,27 @@
+2011-11-01  Julien Chaffraix  <[email protected]>
+
+        Pack RenderTableCell bits
+        https://bugs.webkit.org/show_bug.cgi?id=71135
+
+        Reviewed by Darin Adler.
+
+        Tested by RenderTableCellTest unit test.
+        (unfortunately Chromium specific...)
+
+        This saves another 8 bytes on RenderTableCell on x86-64.
+
+        * rendering/RenderTableCell.cpp:
+        (WebCore::RenderTableCell::RenderTableCell):
+        * rendering/RenderTableCell.h:
+        Changed the field order to use more strict packing.
+
+        (WebCore::RenderTableCell::setCol):
+        (WebCore::RenderTableCell::setRow):
+        Added overflow checks to the 2 previous methods. We
+        CRASH even in release to avoid potential badness
+        (the limit is currently above 2 billions rows or columns
+        which is high enough to prevent it being hit by accident)
+
 2011-11-01  Emil A Eklund  <[email protected]>
 
         Switch background/border image back to Int

Modified: trunk/Source/WebCore/rendering/RenderTableCell.cpp (99019 => 99020)


--- trunk/Source/WebCore/rendering/RenderTableCell.cpp	2011-11-02 00:55:49 UTC (rev 99019)
+++ trunk/Source/WebCore/rendering/RenderTableCell.cpp	2011-11-02 01:12:01 UTC (rev 99020)
@@ -44,11 +44,11 @@
 RenderTableCell::RenderTableCell(Node* node)
     : RenderBlock(node)
     , m_row(unsetRowIndex)
+    , m_cellWidthChanged(false)
     , m_column(unsetColumnIndex)
+    , m_hasAssociatedTableCellElement(node && (node->hasTagName(tdTag) || node->hasTagName(thTag)))
     , m_intrinsicPaddingBefore(0)
     , m_intrinsicPaddingAfter(0)
-    , m_cellWidthChanged(false)
-    , m_hasAssociatedTableCellElement(node && (node->hasTagName(tdTag) || node->hasTagName(thTag)))
 {
 }
 

Modified: trunk/Source/WebCore/rendering/RenderTableCell.h (99019 => 99020)


--- trunk/Source/WebCore/rendering/RenderTableCell.h	2011-11-02 00:55:49 UTC (rev 99019)
+++ trunk/Source/WebCore/rendering/RenderTableCell.h	2011-11-02 01:12:01 UTC (rev 99020)
@@ -29,11 +29,12 @@
 
 namespace WebCore {
 
-// FIXME: It is possible for these indexes to be reached for a table big enough.
-// We would need to enforce a maximal index on both rows and columns.
-static const unsigned unsetColumnIndex = 0xFFFFFFFF;
-static const unsigned unsetRowIndex = 0xFFFFFFFF;
+static const unsigned unsetColumnIndex = 0x7FFFFFFF;
+static const unsigned maxColumnIndex = 0x7FFFFFFE; // 2,147,483,646
 
+static const unsigned unsetRowIndex = 0x7FFFFFFF;
+static const unsigned maxRowIndex = 0x7FFFFFFE; // 2,147,483,646
+
 class RenderTableCell : public RenderBlock {
 public:
     explicit RenderTableCell(Node*);
@@ -48,14 +49,28 @@
     // Called from HTMLTableCellElement.
     void colSpanOrRowSpanChanged();
 
-    void setCol(unsigned column) { m_column = column; }
+    void setCol(unsigned column)
+    {
+        if (UNLIKELY(column > maxColumnIndex))
+            CRASH();
+
+        m_column = column;
+    }
+
     unsigned col() const
     {
         ASSERT(m_column != unsetColumnIndex);
         return m_column;
     }
 
-    void setRow(unsigned row) { m_row = row; }
+    void setRow(unsigned row)
+    {
+        if (UNLIKELY(row > maxRowIndex))
+            CRASH();
+
+        m_row = row;
+    }
+
     unsigned row() const
     {
         ASSERT(m_row != unsetRowIndex);
@@ -159,14 +174,12 @@
 
     void paintCollapsedBorder(GraphicsContext*, const LayoutRect&);
 
-    unsigned m_row;
-    unsigned m_column;
+    unsigned m_row : 31;
+    bool m_cellWidthChanged : 1;
+    unsigned m_column : 31;
+    bool m_hasAssociatedTableCellElement : 1;
     int m_intrinsicPaddingBefore;
     int m_intrinsicPaddingAfter;
-
-    // FIXME: It would be nice to pack these 2 bits into some of the previous fields.
-    bool m_cellWidthChanged : 1;
-    bool m_hasAssociatedTableCellElement : 1;
 };
 
 inline RenderTableCell* toRenderTableCell(RenderObject* object)

Modified: trunk/Source/WebKit/chromium/ChangeLog (99019 => 99020)


--- trunk/Source/WebKit/chromium/ChangeLog	2011-11-02 00:55:49 UTC (rev 99019)
+++ trunk/Source/WebKit/chromium/ChangeLog	2011-11-02 01:12:01 UTC (rev 99020)
@@ -1,3 +1,15 @@
+2011-11-01  Julien Chaffraix  <[email protected]>
+
+        Pack RenderTableCell bits
+        https://bugs.webkit.org/show_bug.cgi?id=71135
+
+        Reviewed by Darin Adler.
+
+        * WebKit.gypi:
+        * tests/RenderTableCellTest.cpp: Added.
+        Added some tests for the column/row index limit
+        that was implemented in RenderTableCell.
+
 2011-11-01  Nate Chapin  <[email protected]>
 
         Add 2 new TargetTypes (to match ResourceRequest::TargetType)

Modified: trunk/Source/WebKit/chromium/WebKit.gypi (99019 => 99020)


--- trunk/Source/WebKit/chromium/WebKit.gypi	2011-11-02 00:55:49 UTC (rev 99019)
+++ trunk/Source/WebKit/chromium/WebKit.gypi	2011-11-02 01:12:01 UTC (rev 99020)
@@ -80,6 +80,7 @@
             'tests/PODArenaTest.cpp',
             'tests/PODIntervalTreeTest.cpp',
             'tests/PODRedBlackTreeTest.cpp',
+            'tests/RenderTableCellTest.cpp',
             'tests/TilingDataTest.cpp',
             'tests/TreeSynchronizerTest.cpp',
             'tests/TreeTestHelpers.cpp',

Added: trunk/Source/WebKit/chromium/tests/RenderTableCellTest.cpp (0 => 99020)


--- trunk/Source/WebKit/chromium/tests/RenderTableCellTest.cpp	                        (rev 0)
+++ trunk/Source/WebKit/chromium/tests/RenderTableCellTest.cpp	2011-11-02 01:12:01 UTC (rev 99020)
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+// FIXME: If we get the TestWebKitAPI framework to bring a full Frame + DOM stack
+// in a portable way, this test should be shared with all ports!
+
+#include "config.h"
+
+#include "RenderTableCell.h"
+
+#include "Document.h"
+#include "Frame.h"
+#include "FrameTestHelpers.h"
+#include "RenderArena.h"
+#include "WebFrame.h"
+#include "WebFrameImpl.h"
+#include "WebView.h"
+
+#include <gtest/gtest.h>
+
+using namespace WebKit;
+
+namespace WebCore {
+
+namespace {
+
+class RenderTableCellDeathTest : public testing::Test {
+    // It's unfortunate that we have to get the whole browser stack to test one RenderObject
+    // but the code needs it.
+    static Frame* frame()
+    {
+        static WebView* webView;
+
+        if (webView)
+            return static_cast<WebFrameImpl*>(webView->mainFrame())->frame();
+
+        webView = FrameTestHelpers::createWebViewAndLoad("about:blank");
+        webView->setFocus(true);
+        return static_cast<WebFrameImpl*>(webView->mainFrame())->frame();
+    }
+
+    static Document* document()
+    {
+        return frame()->document();
+    }
+
+    static RenderArena* arena()
+    {
+        return document()->renderArena();
+    }
+
+    virtual void SetUp()
+    {
+        m_cell = new (arena()) RenderTableCell(document());
+    }
+
+    virtual void TearDown()
+    {
+        m_cell->destroy();
+    }
+
+protected:
+    RenderTableCell* m_cell;
+};
+
+TEST_F(RenderTableCellDeathTest, CanSetColumn)
+{
+    static const unsigned columnIndex = 10;
+    m_cell->setCol(columnIndex);
+    EXPECT_EQ(columnIndex, m_cell->col());
+}
+
+TEST_F(RenderTableCellDeathTest, CanSetRow)
+{
+    static const unsigned rowIndex = 10;
+    m_cell->setRow(rowIndex);
+    EXPECT_EQ(rowIndex, m_cell->row());
+}
+
+TEST_F(RenderTableCellDeathTest, CanSetColumnToMaxColumnIndex)
+{
+    m_cell->setCol(maxColumnIndex);
+    EXPECT_EQ(maxColumnIndex, m_cell->col());
+}
+
+TEST_F(RenderTableCellDeathTest, CanSetRowToMaxRowIndex)
+{
+    m_cell->setRow(maxRowIndex);
+    EXPECT_EQ(maxRowIndex, m_cell->row());
+}
+
+TEST_F(RenderTableCellDeathTest, CrashIfColumnOverflowOnSetting)
+{
+    ASSERT_DEATH(m_cell->setCol(maxColumnIndex + 1), "");
+}
+
+TEST_F(RenderTableCellDeathTest, CrashIfRowOverflowOnSetting)
+{
+    ASSERT_DEATH(m_cell->setRow(maxRowIndex + 1), "");
+}
+
+TEST_F(RenderTableCellDeathTest, CrashIfSettingUnsetColumnIndex)
+{
+    ASSERT_DEATH(m_cell->setCol(unsetColumnIndex), "");
+}
+
+TEST_F(RenderTableCellDeathTest, CrashIfSettingUnsetRowIndex)
+{
+    ASSERT_DEATH(m_cell->setRow(unsetRowIndex), "");
+}
+
+}
+
+} // namespace WebCore
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to