From 47509533b0a003e91d652106113e9abc35dcfafb Mon Sep 17 00:00:00 2001 From: "commit-queue@webkit.org" Date: Thu, 30 Dec 2010 03:16:05 +0000 Subject: [PATCH] 2010-12-29 Kenichi Ishibashi Reviewed by Darin Adler. Use a HashMap for m_continuation to save memory https://bugs.webkit.org/show_bug.cgi?id=43716 Saving memory consumption by applying a HashMap convention to continuation pointers of RenderInline and RenderBlock classes. * rendering/RenderBlock.cpp: Removed m_continuation. (WebCore::RenderBlock::RenderBlock): (WebCore::RenderBlock::destroy): (WebCore::RenderBlock::inlineElementContinuation): (WebCore::RenderBlock::blockElementContinuation): * rendering/RenderBlock.h: Removed m_continuation. * rendering/RenderBoxModelObject.cpp: Added a hash map for continuations. (WebCore::RenderBoxModelObject::destroy): Added an assertion. (WebCore::RenderBoxModelObject::continuation): Added. (WebCore::RenderBoxModelObject::setContinuation): Added. * rendering/RenderBoxModelObject.h: * rendering/RenderInline.cpp: Removed m_continuation. (WebCore::RenderInline::RenderInline): (WebCore::RenderInline::destroy): (WebCore::RenderInline::inlineElementContinuation): * rendering/RenderInline.h: Removed m_continuation. git-svn-id: http://svn.webkit.org/repository/webkit/trunk@74775 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- WebCore/ChangeLog | 27 +++++++++++++++++++++++++ WebCore/rendering/RenderBlock.cpp | 16 ++++++++------- WebCore/rendering/RenderBlock.h | 11 +++------- WebCore/rendering/RenderBoxModelObject.cpp | 32 ++++++++++++++++++++++++++++++ WebCore/rendering/RenderBoxModelObject.h | 3 +++ WebCore/rendering/RenderInline.cpp | 15 +++++++------- WebCore/rendering/RenderInline.h | 7 +++---- 7 files changed, 85 insertions(+), 26 deletions(-) diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog index 534f492..115159b 100644 --- a/WebCore/ChangeLog +++ b/WebCore/ChangeLog @@ -1,3 +1,30 @@ +2010-12-29 Kenichi Ishibashi + + Reviewed by Darin Adler. + + Use a HashMap for m_continuation to save memory + https://bugs.webkit.org/show_bug.cgi?id=43716 + + Saving memory consumption by applying a HashMap convention to + continuation pointers of RenderInline and RenderBlock classes. + + * rendering/RenderBlock.cpp: Removed m_continuation. + (WebCore::RenderBlock::RenderBlock): + (WebCore::RenderBlock::destroy): + (WebCore::RenderBlock::inlineElementContinuation): + (WebCore::RenderBlock::blockElementContinuation): + * rendering/RenderBlock.h: Removed m_continuation. + * rendering/RenderBoxModelObject.cpp: Added a hash map for continuations. + (WebCore::RenderBoxModelObject::destroy): Added an assertion. + (WebCore::RenderBoxModelObject::continuation): Added. + (WebCore::RenderBoxModelObject::setContinuation): Added. + * rendering/RenderBoxModelObject.h: + * rendering/RenderInline.cpp: Removed m_continuation. + (WebCore::RenderInline::RenderInline): + (WebCore::RenderInline::destroy): + (WebCore::RenderInline::inlineElementContinuation): + * rendering/RenderInline.h: Removed m_continuation. + 2010-12-27 Amruth Raj and Ravi Kasibhatla Reviewed by Martin Robinson. diff --git a/WebCore/rendering/RenderBlock.cpp b/WebCore/rendering/RenderBlock.cpp index 9d85744..9c07a6c 100644 --- a/WebCore/rendering/RenderBlock.cpp +++ b/WebCore/rendering/RenderBlock.cpp @@ -110,7 +110,6 @@ RenderBlock::RenderBlock(Node* node) : RenderBox(node) , m_floatingObjects(0) , m_positionedObjects(0) - , m_continuation(0) , m_rareData(0) , m_lineHeight(-1) { @@ -154,9 +153,10 @@ void RenderBlock::destroy() // Destroy our continuation before anything other than anonymous children. // The reason we don't destroy it before anonymous children is that they may // have continuations of their own that are anonymous children of our continuation. - if (m_continuation) { - m_continuation->destroy(); - m_continuation = 0; + RenderBoxModelObject* continuation = this->continuation(); + if (continuation) { + continuation->destroy(); + setContinuation(0); } if (!documentBeingDestroyed()) { @@ -2517,14 +2517,16 @@ void RenderBlock::paintEllipsisBoxes(PaintInfo& paintInfo, int tx, int ty) RenderInline* RenderBlock::inlineElementContinuation() const { - return m_continuation && m_continuation->isInline() ? toRenderInline(m_continuation) : 0; + RenderBoxModelObject* continuation = this->continuation(); + return continuation && continuation->isInline() ? toRenderInline(continuation) : 0; } RenderBlock* RenderBlock::blockElementContinuation() const { - if (!m_continuation || m_continuation->isInline()) + RenderBoxModelObject* currentContinuation = continuation(); + if (!currentContinuation || currentContinuation->isInline()) return 0; - RenderBlock* nextContinuation = toRenderBlock(m_continuation); + RenderBlock* nextContinuation = toRenderBlock(currentContinuation); if (nextContinuation->isAnonymousBlock()) return nextContinuation->blockElementContinuation(); return nextContinuation; diff --git a/WebCore/rendering/RenderBlock.h b/WebCore/rendering/RenderBlock.h index 5294ad4..bd8be2c 100644 --- a/WebCore/rendering/RenderBlock.h +++ b/WebCore/rendering/RenderBlock.h @@ -128,13 +128,14 @@ public: void addContinuationWithOutline(RenderInline*); - RenderBoxModelObject* continuation() const { return m_continuation; } - void setContinuation(RenderBoxModelObject* c) { m_continuation = c; } virtual RenderBoxModelObject* virtualContinuation() const { return continuation(); } bool isAnonymousBlockContinuation() const { return continuation() && isAnonymousBlock(); } RenderInline* inlineElementContinuation() const; RenderBlock* blockElementContinuation() const; + using RenderBoxModelObject::continuation; + using RenderBoxModelObject::setContinuation; + // This function is a convenience helper for creating an anonymous block that inherits its // style from this RenderBlock. RenderBlock* createAnonymousBlock(bool isFlexibleBox = false) const; @@ -674,12 +675,6 @@ private: PositionedObjectsListHashSet* m_positionedObjects; - // An inline can be split with blocks occurring in between the inline content. - // When this occurs we need a pointer to our next object. We can basically be - // split into a sequence of inlines and blocks. The continuation will either be - // an anonymous block (that houses other blocks) or it will be an inline flow. - RenderBoxModelObject* m_continuation; - // Allocated only when some of these fields have non-default values struct RenderBlockRareData : Noncopyable { RenderBlockRareData(const RenderBlock* block) diff --git a/WebCore/rendering/RenderBoxModelObject.cpp b/WebCore/rendering/RenderBoxModelObject.cpp index d5fb13e..5098306 100644 --- a/WebCore/rendering/RenderBoxModelObject.cpp +++ b/WebCore/rendering/RenderBoxModelObject.cpp @@ -53,6 +53,16 @@ static const double cLowQualityTimeThreshold = 0.500; // 500 ms typedef pair LastPaintSizeMapKey; typedef HashMap LastPaintSizeMap; +// The HashMap for storing continuation pointers. +// An inline can be split with blocks occuring in between the inline content. +// When this occurs we need a pointer to the next object. We can basically be +// split into a sequence of inlines and blocks. The continuation will either be +// an anonymous block (that houses other blocks) or it will be an inline flow. +//

Hello

. In this example the will have a block as +// its continuation but the will just have an inline as its continuation. +typedef HashMap ContinuationMap; +static ContinuationMap* continuationMap = 0; + class ImageQualityController : public Noncopyable { public: ImageQualityController(); @@ -229,6 +239,9 @@ void RenderBoxModelObject::destroy() if (m_layer) m_layer->clearClipRects(); + // A continuation of this RenderObject should be destroyed at subclasses. + ASSERT(!continuation()); + // RenderObject::destroy calls back to destroyLayer() for layer destruction RenderObject::destroy(); } @@ -1823,4 +1836,23 @@ int RenderBoxModelObject::containingBlockLogicalWidthForContent() const return containingBlock()->availableLogicalWidth(); } +RenderBoxModelObject* RenderBoxModelObject::continuation() const +{ + if (!continuationMap) + return 0; + return continuationMap->get(this); +} + +void RenderBoxModelObject::setContinuation(RenderBoxModelObject* continuation) +{ + if (continuation) { + if (!continuationMap) + continuationMap = new ContinuationMap; + continuationMap->set(this, continuation); + } else { + if (continuationMap) + continuationMap->remove(this); + } +} + } // namespace WebCore diff --git a/WebCore/rendering/RenderBoxModelObject.h b/WebCore/rendering/RenderBoxModelObject.h index b697217..98e386b 100644 --- a/WebCore/rendering/RenderBoxModelObject.h +++ b/WebCore/rendering/RenderBoxModelObject.h @@ -125,6 +125,9 @@ protected: bool shouldPaintAtLowQuality(GraphicsContext*, Image*, const void*, const IntSize&); + RenderBoxModelObject* continuation() const; + void setContinuation(RenderBoxModelObject*); + private: virtual bool isBoxModelObject() const { return true; } diff --git a/WebCore/rendering/RenderInline.cpp b/WebCore/rendering/RenderInline.cpp index 4b5298c..7466ace 100644 --- a/WebCore/rendering/RenderInline.cpp +++ b/WebCore/rendering/RenderInline.cpp @@ -46,7 +46,6 @@ namespace WebCore { RenderInline::RenderInline(Node* node) : RenderBoxModelObject(node) - , m_continuation(0) , m_lineHeight(-1) { setChildrenInline(true); @@ -61,9 +60,10 @@ void RenderInline::destroy() // Destroy our continuation before anything other than anonymous children. // The reason we don't destroy it before anonymous children is that they may // have continuations of their own that are anonymous children of our continuation. - if (m_continuation) { - m_continuation->destroy(); - m_continuation = 0; + RenderBoxModelObject* continuation = this->continuation(); + if (continuation) { + continuation->destroy(); + setContinuation(0); } if (!documentBeingDestroyed()) { @@ -95,9 +95,10 @@ void RenderInline::destroy() RenderInline* RenderInline::inlineElementContinuation() const { - if (!m_continuation || m_continuation->isInline()) - return toRenderInline(m_continuation); - return toRenderBlock(m_continuation)->inlineElementContinuation(); + RenderBoxModelObject* continuation = this->continuation(); + if (!continuation || continuation->isInline()) + return toRenderInline(continuation); + return toRenderBlock(continuation)->inlineElementContinuation(); } void RenderInline::updateBoxModelInfoFromStyle() diff --git a/WebCore/rendering/RenderInline.h b/WebCore/rendering/RenderInline.h index f6f3908..18b4a3c 100644 --- a/WebCore/rendering/RenderInline.h +++ b/WebCore/rendering/RenderInline.h @@ -65,8 +65,6 @@ public: InlineFlowBox* firstLineBox() const { return m_lineBoxes.firstLineBox(); } InlineFlowBox* lastLineBox() const { return m_lineBoxes.lastLineBox(); } - RenderBoxModelObject* continuation() const { return m_continuation; } - void setContinuation(RenderBoxModelObject* c) { m_continuation = c; } virtual RenderBoxModelObject* virtualContinuation() const { return continuation(); } RenderInline* inlineElementContinuation() const; @@ -77,6 +75,9 @@ public: virtual void addFocusRingRects(Vector&, int tx, int ty); void paintOutline(GraphicsContext*, int tx, int ty); + using RenderBoxModelObject::continuation; + using RenderBoxModelObject::setContinuation; + protected: virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle); @@ -153,8 +154,6 @@ private: RenderObjectChildList m_children; RenderLineBoxList m_lineBoxes; // All of the line boxes created for this inline flow. For example, Hello
world.
will have two line boxes. - RenderBoxModelObject* m_continuation; // Can be either a block or an inline.

Hello

. In this example the will have a block as its continuation but the - // will just have an inline as its continuation. mutable int m_lineHeight; }; -- 2.7.4