- 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, ®ion);
+ 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;