Title: [161909] trunk/Source/WebCore
Revision
161909
Author
[email protected]
Date
2014-01-13 14:33:08 -0800 (Mon, 13 Jan 2014)

Log Message

Map RootInlineBox to containing region via bit+hashmap.
<https://webkit.org/b/126917>

The vas majority of RootInlineBox objects don't have a containing
RenderRegion, so let's store that in a bit+hashmap configuration
instead of having a dedicated pointer member for it.

148 kB progression on Membuster3.

Reviewed by Antti Koivisto.

* rendering/InlineFlowBox.h:
(WebCore::InlineFlowBox::InlineFlowBox):
* rendering/RootInlineBox.cpp:
(WebCore::RootInlineBox::RootInlineBox):

    Added m_hasContainingRegion bit.

(WebCore::containingRegionMap):

    Global map between RootInlineBox and RenderRegion.

(WebCore::RootInlineBox::~RootInlineBox):

    Remove self from aforementioned global map if needed.

(WebCore::RootInlineBox::paint):

    Tweak a condition to avoid double hash lookup.

* rendering/RootInlineBox.h:
(WebCore::RootInlineBox::containingRegion):
(WebCore::RootInlineBox::clearContainingRegion):
(WebCore::RootInlineBox::setContainingRegion):

    Store the containing region in a bit+hashmap.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (161908 => 161909)


--- trunk/Source/WebCore/ChangeLog	2014-01-13 22:29:01 UTC (rev 161908)
+++ trunk/Source/WebCore/ChangeLog	2014-01-13 22:33:08 UTC (rev 161909)
@@ -1,3 +1,42 @@
+2014-01-13  Andreas Kling  <[email protected]>
+
+        Map RootInlineBox to containing region via bit+hashmap.
+        <https://webkit.org/b/126917>
+
+        The vas majority of RootInlineBox objects don't have a containing
+        RenderRegion, so let's store that in a bit+hashmap configuration
+        instead of having a dedicated pointer member for it.
+
+        148 kB progression on Membuster3.
+
+        Reviewed by Antti Koivisto.
+
+        * rendering/InlineFlowBox.h:
+        (WebCore::InlineFlowBox::InlineFlowBox):
+        * rendering/RootInlineBox.cpp:
+        (WebCore::RootInlineBox::RootInlineBox):
+
+            Added m_hasContainingRegion bit.
+
+        (WebCore::containingRegionMap):
+
+            Global map between RootInlineBox and RenderRegion.
+
+        (WebCore::RootInlineBox::~RootInlineBox):
+
+            Remove self from aforementioned global map if needed.
+
+        (WebCore::RootInlineBox::paint):
+
+            Tweak a condition to avoid double hash lookup.
+
+        * rendering/RootInlineBox.h:
+        (WebCore::RootInlineBox::containingRegion):
+        (WebCore::RootInlineBox::clearContainingRegion):
+        (WebCore::RootInlineBox::setContainingRegion):
+
+            Store the containing region in a bit+hashmap.
+
 2014-01-13  Brent Fulgham  <[email protected]>
 
         [WebGL] Invalid range checking in WebGLRenderingContext::validateTexFuncLevel

Modified: trunk/Source/WebCore/rendering/InlineFlowBox.h (161908 => 161909)


--- trunk/Source/WebCore/rendering/InlineFlowBox.h	2014-01-13 22:29:01 UTC (rev 161908)
+++ trunk/Source/WebCore/rendering/InlineFlowBox.h	2014-01-13 22:33:08 UTC (rev 161909)
@@ -53,6 +53,7 @@
         , m_hasAnnotationsBefore(false)
         , m_hasAnnotationsAfter(false)
         , m_isFirstAfterPageBreak(false)
+        , m_hasContainingRegion(false)
 #if !ASSERT_WITH_SECURITY_IMPLICATION_DISABLED
         , m_hasBadChildList(false)
 #endif
@@ -340,6 +341,8 @@
 
     unsigned m_isFirstAfterPageBreak : 1;
 
+    unsigned m_hasContainingRegion : 1;
+
     // End of RootInlineBox-specific members.
 
 #if !ASSERT_WITH_SECURITY_IMPLICATION_DISABLED

Modified: trunk/Source/WebCore/rendering/RenderBlockLineLayout.cpp (161908 => 161909)


--- trunk/Source/WebCore/rendering/RenderBlockLineLayout.cpp	2014-01-13 22:29:01 UTC (rev 161908)
+++ trunk/Source/WebCore/rendering/RenderBlockLineLayout.cpp	2014-01-13 22:33:08 UTC (rev 161909)
@@ -2157,8 +2157,12 @@
 void RenderBlockFlow::updateRegionForLine(RootInlineBox* lineBox) const
 {
     ASSERT(lineBox);
-    lineBox->setContainingRegion(regionAtBlockOffset(lineBox->lineTopWithLeading()));
 
+    if (auto containingRegion = regionAtBlockOffset(lineBox->lineTopWithLeading()))
+        lineBox->setContainingRegion(*containingRegion);
+    else
+        lineBox->clearContainingRegion();
+
     RootInlineBox* prevLineBox = lineBox->prevRootBox();
     if (!prevLineBox)
         return;

Modified: trunk/Source/WebCore/rendering/RootInlineBox.cpp (161908 => 161909)


--- trunk/Source/WebCore/rendering/RootInlineBox.cpp	2014-01-13 22:29:01 UTC (rev 161908)
+++ trunk/Source/WebCore/rendering/RootInlineBox.cpp	2014-01-13 22:33:08 UTC (rev 161909)
@@ -35,13 +35,14 @@
 #include "RenderFlowThread.h"
 #include "RenderView.h"
 #include "VerticalPositionCache.h"
+#include <wtf/NeverDestroyed.h>
 #include <wtf/unicode/Unicode.h>
 
 namespace WebCore {
     
 struct SameSizeAsRootInlineBox : public InlineFlowBox {
     unsigned variables[7];
-    void* pointers[4];
+    void* pointers[3];
 };
 
 COMPILE_ASSERT(sizeof(RootInlineBox) == sizeof(SameSizeAsRootInlineBox), RootInlineBox_should_stay_small);
@@ -49,11 +50,17 @@
 typedef WTF::HashMap<const RootInlineBox*, std::unique_ptr<EllipsisBox>> EllipsisBoxMap;
 static EllipsisBoxMap* gEllipsisBoxMap = 0;
 
+typedef HashMap<const RootInlineBox*, RenderRegion*> ContainingRegionMap;
+static ContainingRegionMap& containingRegionMap()
+{
+    static NeverDestroyed<ContainingRegionMap> map;
+    return map;
+}
+
 RootInlineBox::RootInlineBox(RenderBlockFlow& block)
     : InlineFlowBox(block)
     , m_lineBreakPos(0)
     , m_lineBreakObj(nullptr)
-    , m_containingRegion(nullptr)
 {
     setIsHorizontal(block.isHorizontalWritingMode());
 }
@@ -61,6 +68,9 @@
 RootInlineBox::~RootInlineBox()
 {
     detachEllipsisBox();
+
+    if (m_hasContainingRegion)
+        containingRegionMap().remove(this);
 }
 
 void RootInlineBox::detachEllipsisBox()
@@ -194,7 +204,7 @@
 void RootInlineBox::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset, LayoutUnit lineTop, LayoutUnit lineBottom)
 {
     // Check if we are in the correct region.
-    if (paintInfo.renderRegion && containingRegion() && containingRegion() != paintInfo.renderRegion)
+    if (paintInfo.renderRegion && m_hasContainingRegion && containingRegion() != paintInfo.renderRegion)
         return;
     
     InlineFlowBox::paint(paintInfo, paintOffset, lineTop, lineBottom);
@@ -243,21 +253,34 @@
 RenderRegion* RootInlineBox::containingRegion() const
 {
 #ifndef NDEBUG
-    if (m_containingRegion) {
+    if (m_hasContainingRegion) {
         RenderFlowThread* flowThread = blockFlow().flowThreadContainingBlock();
         const RenderRegionList& regionList = flowThread->renderRegionList();
-        ASSERT(regionList.contains(m_containingRegion));
+        ASSERT(regionList.contains(containingRegionMap().get(this)));
     }
 #endif
+    return m_hasContainingRegion ? containingRegionMap().get(this) : nullptr;
+}
 
-    return m_containingRegion;
+void RootInlineBox::clearContainingRegion()
+{
+    ASSERT(!isDirty());
+    ASSERT(blockFlow().flowThreadContainingBlock());
+
+    if (!m_hasContainingRegion)
+        return;
+
+    containingRegionMap().remove(this);
+    m_hasContainingRegion = false;
 }
 
-void RootInlineBox::setContainingRegion(RenderRegion* region)
+void RootInlineBox::setContainingRegion(RenderRegion& region)
 {
     ASSERT(!isDirty());
     ASSERT(blockFlow().flowThreadContainingBlock());
-    m_containingRegion = region;
+
+    containingRegionMap().set(this, &region);
+    m_hasContainingRegion = true;
 }
 
 LayoutUnit RootInlineBox::alignBoxesInBlockDirection(LayoutUnit heightOfBlock, GlyphOverflowAndFallbackFontsMap& textBoxDataMap, VerticalPositionCache& verticalPositionCache)

Modified: trunk/Source/WebCore/rendering/RootInlineBox.h (161908 => 161909)


--- trunk/Source/WebCore/rendering/RootInlineBox.h	2014-01-13 22:29:01 UTC (rev 161908)
+++ trunk/Source/WebCore/rendering/RootInlineBox.h	2014-01-13 22:33:08 UTC (rev 161909)
@@ -64,8 +64,11 @@
     LayoutUnit paginatedLineWidth() const { return m_paginatedLineWidth; }
     void setPaginatedLineWidth(LayoutUnit width) { m_paginatedLineWidth = width; }
 
+    // It should not be assumed the containingRegion() is always valid.
+    // It can also be nullptr if the flow has no region chain.
     RenderRegion* containingRegion() const;
-    void setContainingRegion(RenderRegion*);
+    void setContainingRegion(RenderRegion&);
+    void clearContainingRegion();
 
     LayoutUnit selectionTop() const;
     LayoutUnit selectionBottom() const;
@@ -218,10 +221,6 @@
     LayoutUnit m_lineTopWithLeading;
     LayoutUnit m_lineBottomWithLeading;
 
-    // It should not be assumed the |containingRegion| is always valid.
-    // It can also be nullptr if the flow has no region chain.
-    RenderRegion* m_containingRegion;
-
     LayoutUnit m_paginationStrut;
     LayoutUnit m_paginatedLineWidth;
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to