Title: [104705] trunk/Source/WebCore
- Revision
- 104705
- Author
- [email protected]
- Date
- 2012-01-11 05:50:20 -0800 (Wed, 11 Jan 2012)
Log Message
Avoid separate heap allocation for each RenderRegionRange in RenderFlowThread
https://bugs.webkit.org/show_bug.cgi?id=75908
Reviewed by Darin Adler.
There's no benefit in explicit allocating RenderRegionRange in the heap. So this
patch changes the RenderRegionRangeMap to use the value type directly instead of
the pointer.
* rendering/RenderFlowThread.cpp:
(WebCore::RenderFlowThread::removeRegionFromThread):
(WebCore::RenderFlowThread::layout):
(WebCore::RenderFlowThread::removeRenderBoxRegionInfo):
(WebCore::RenderFlowThread::setRegionRangeForBox):
(WebCore::RenderFlowThread::getRegionRangeForBox):
* rendering/RenderFlowThread.h: add default constructor to act as emptyValue()
for HashMap.
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (104704 => 104705)
--- trunk/Source/WebCore/ChangeLog 2012-01-11 13:47:47 UTC (rev 104704)
+++ trunk/Source/WebCore/ChangeLog 2012-01-11 13:50:20 UTC (rev 104705)
@@ -1,3 +1,23 @@
+2012-01-11 Caio Marcelo de Oliveira Filho <[email protected]>
+
+ Avoid separate heap allocation for each RenderRegionRange in RenderFlowThread
+ https://bugs.webkit.org/show_bug.cgi?id=75908
+
+ Reviewed by Darin Adler.
+
+ There's no benefit in explicit allocating RenderRegionRange in the heap. So this
+ patch changes the RenderRegionRangeMap to use the value type directly instead of
+ the pointer.
+
+ * rendering/RenderFlowThread.cpp:
+ (WebCore::RenderFlowThread::removeRegionFromThread):
+ (WebCore::RenderFlowThread::layout):
+ (WebCore::RenderFlowThread::removeRenderBoxRegionInfo):
+ (WebCore::RenderFlowThread::setRegionRangeForBox):
+ (WebCore::RenderFlowThread::getRegionRangeForBox):
+ * rendering/RenderFlowThread.h: add default constructor to act as emptyValue()
+ for HashMap.
+
2012-01-09 Alexandru Chiculita <[email protected]>
[CSS Shaders] Move CustomFilterOperation to the platform layer
Modified: trunk/Source/WebCore/rendering/RenderFlowThread.cpp (104704 => 104705)
--- trunk/Source/WebCore/rendering/RenderFlowThread.cpp 2012-01-11 13:47:47 UTC (rev 104704)
+++ trunk/Source/WebCore/rendering/RenderFlowThread.cpp 2012-01-11 13:50:20 UTC (rev 104705)
@@ -56,17 +56,6 @@
setInRenderFlowThread();
}
-void RenderFlowThread::clearRenderRegionRangeMap()
-{
- deleteAllValues(m_regionRangeMap);
- m_regionRangeMap.clear();
-}
-
-RenderFlowThread::~RenderFlowThread()
-{
- clearRenderRegionRangeMap();
-}
-
PassRefPtr<RenderStyle> RenderFlowThread::createFlowThreadStyle(RenderStyle* parentStyle)
{
RefPtr<RenderStyle> newStyle(RenderStyle::create());
@@ -215,7 +204,7 @@
void RenderFlowThread::removeRegionFromThread(RenderRegion* renderRegion)
{
ASSERT(renderRegion);
- clearRenderRegionRangeMap();
+ m_regionRangeMap.clear();
m_regionList.remove(renderRegion);
if (renderRegion->parentFlowThread()) {
@@ -318,7 +307,7 @@
m_hasValidRegions = false;
m_regionsHaveUniformLogicalWidth = true;
m_regionsHaveUniformLogicalHeight = true;
- clearRenderRegionRangeMap();
+ m_regionRangeMap.clear();
LayoutUnit previousRegionLogicalWidth = 0;
LayoutUnit previousRegionLogicalHeight = 0;
if (hasRegions()) {
@@ -641,7 +630,7 @@
break;
}
- delete m_regionRangeMap.take(box);
+ m_regionRangeMap.remove(box);
}
bool RenderFlowThread::logicalWidthChangedInRegions(const RenderBlock* block, LayoutUnit offsetFromLogicalTopOfFirstPage)
@@ -752,43 +741,45 @@
// FIXME: Not right for differing writing-modes.
RenderRegion* startRegion = renderRegionForLine(offsetFromLogicalTopOfFirstPage, true);
RenderRegion* endRegion = renderRegionForLine(offsetFromLogicalTopOfFirstPage + box->logicalHeight(), true);
- RenderRegionRange* range = m_regionRangeMap.get(box);
- if (range) {
- // If nothing changed, just bail.
- if (range->startRegion() == startRegion && range->endRegion() == endRegion)
- return;
+ RenderRegionRangeMap::iterator it = m_regionRangeMap.find(box);
+ if (it == m_regionRangeMap.end()) {
+ m_regionRangeMap.set(box, RenderRegionRange(startRegion, endRegion));
+ return;
+ }
- // Delete any info that we find before our new startRegion and after our new endRegion.
- for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) {
- RenderRegion* region = *iter;
- if (region == startRegion) {
- iter = m_regionList.find(endRegion);
- continue;
- }
+ // If nothing changed, just bail.
+ RenderRegionRange& range = it->second;
+ if (range.startRegion() == startRegion && range.endRegion() == endRegion)
+ return;
- region->removeRenderBoxRegionInfo(box);
-
- if (region == range->endRegion())
- break;
+ // Delete any info that we find before our new startRegion and after our new endRegion.
+ for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) {
+ RenderRegion* region = *iter;
+ if (region == startRegion) {
+ iter = m_regionList.find(endRegion);
+ continue;
}
- range->setRange(startRegion, endRegion);
- return;
+ region->removeRenderBoxRegionInfo(box);
+
+ if (region == range.endRegion())
+ break;
}
- range = new RenderRegionRange(startRegion, endRegion);
- m_regionRangeMap.set(box, range);
+
+ range.setRange(startRegion, endRegion);
}
void RenderFlowThread::getRegionRangeForBox(const RenderBox* box, RenderRegion*& startRegion, RenderRegion*& endRegion) const
{
startRegion = 0;
endRegion = 0;
- RenderRegionRange* range = m_regionRangeMap.get(box);
- if (!range)
+ RenderRegionRangeMap::const_iterator it = m_regionRangeMap.find(box);
+ if (it == m_regionRangeMap.end())
return;
- startRegion = range->startRegion();
- endRegion = range->endRegion();
+ const RenderRegionRange& range = it->second;
+ startRegion = range.startRegion();
+ endRegion = range.endRegion();
ASSERT(m_regionList.contains(startRegion) && m_regionList.contains(endRegion));
}
Modified: trunk/Source/WebCore/rendering/RenderFlowThread.h (104704 => 104705)
--- trunk/Source/WebCore/rendering/RenderFlowThread.h 2012-01-11 13:47:47 UTC (rev 104704)
+++ trunk/Source/WebCore/rendering/RenderFlowThread.h 2012-01-11 13:50:20 UTC (rev 104705)
@@ -58,7 +58,6 @@
class RenderFlowThread: public RenderBlock {
public:
RenderFlowThread(Node*, const AtomicString& flowThread);
- ~RenderFlowThread();
virtual bool isRenderFlowThread() const { return true; }
@@ -136,8 +135,6 @@
bool shouldRepaint(const LayoutRect&) const;
- void clearRenderRegionRangeMap();
-
typedef ListHashSet<RenderObject*> FlowThreadChildList;
FlowThreadChildList m_flowThreadChildList;
@@ -146,6 +143,11 @@
class RenderRegionRange {
public:
+ RenderRegionRange()
+ {
+ setRange(0, 0);
+ }
+
RenderRegionRange(RenderRegion* start, RenderRegion* end)
{
setRange(start, end);
@@ -176,7 +178,7 @@
RenderFlowThreadCountedSet m_layoutBeforeThreadsSet;
// A maps from RenderBox
- typedef HashMap<const RenderBox*, RenderRegionRange*> RenderRegionRangeMap;
+ typedef HashMap<const RenderBox*, RenderRegionRange> RenderRegionRangeMap;
RenderRegionRangeMap m_regionRangeMap;
bool m_hasValidRegions;
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes