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

Reply via email to