Changeset 182373 in webkit


Ignore:
Timestamp:
Apr 5, 2015, 7:59:57 PM (10 years ago)
Author:
Simon Fraser
Message:

Free up some bits in RenderObject by moving rarely used bits into a side table
https://bugs.webkit.org/show_bug.cgi?id=143432

Reviewed by Darin Adler.

Add a side table (global hash) on RenderObject to store data that is rarely
used. Move the "isDragging" and "hasReflection" bits there. Re-use one of
those bits for "hasRareData", and leave the other unused (I have plans for it).

  • rendering/RenderBlock.cpp:

(WebCore::getBlockRareData): Renamed for consistency.
(WebCore::ensureBlockRareData): Renamed to avoid conflict with RenderObject::ensureRareData().
(WebCore::RenderBlock::cachedFlowThreadContainingBlock):
(WebCore::RenderBlock::cachedFlowThreadContainingBlockNeedsUpdate):
(WebCore::RenderBlock::setCachedFlowThreadContainingBlockNeedsUpdate):
(WebCore::RenderBlock::updateCachedFlowThreadContainingBlock):
(WebCore::RenderBlock::locateFlowThreadContainingBlock):
(WebCore::RenderBlock::paginationStrut):
(WebCore::RenderBlock::pageLogicalOffset):
(WebCore::RenderBlock::setPaginationStrut):
(WebCore::RenderBlock::setPageLogicalOffset):
(WebCore::getRareData): Deleted.
(WebCore::ensureRareData): Deleted.

  • rendering/RenderObject.cpp:

(WebCore::RenderObject::~RenderObject): Assert that rare data hasn't been resurrected
since willBeDestroyed().
(WebCore::RenderObject::willBeDestroyed): Clear the rare data.
(WebCore::RenderObject::setIsDragging): If setting, ensure that we have rare data and
set the bit. Otherwise, only clear the bit of we have rare data.
(WebCore::RenderObject::setHasReflection): Ditto.
(WebCore::RenderObject::rareDataMap):
(WebCore::RenderObject::rareData):
(WebCore::RenderObject::ensureRareData):
(WebCore::RenderObject::clearRareData):

  • rendering/RenderObject.h:

(WebCore::RenderObject::isDragging): Fast-fail on the hasRareData() bit, then do the
slower lookup in rare data.
(WebCore::RenderObject::hasReflection): Ditto.
(WebCore::RenderObject::setEverHadLayout): Moved up to group with other bit setters.
(WebCore::RenderObject::hasRareData):
(WebCore::RenderObject::setHasRareData):
(WebCore::RenderObject::RenderObjectBitfields::RenderObjectBitfields):
(WebCore::RenderObject::RenderObjectRareData::RenderObjectRareData):
(WebCore::RenderObject::setHasReflection): Deleted. Out of line now.
(WebCore::RenderObject::setIsDragging): Deleted. Ditto.

Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r182371 r182373  
     12015-04-05  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Free up some bits in RenderObject by moving rarely used bits into a side table
     4        https://bugs.webkit.org/show_bug.cgi?id=143432
     5
     6        Reviewed by Darin Adler.
     7       
     8        Add a side table (global hash) on RenderObject to store data that is rarely
     9        used. Move the "isDragging" and "hasReflection" bits there. Re-use one of
     10        those bits for "hasRareData", and leave the other unused (I have plans for it).
     11       
     12        * rendering/RenderBlock.cpp:
     13        (WebCore::getBlockRareData): Renamed for consistency.
     14        (WebCore::ensureBlockRareData): Renamed to avoid conflict with RenderObject::ensureRareData().
     15        (WebCore::RenderBlock::cachedFlowThreadContainingBlock):
     16        (WebCore::RenderBlock::cachedFlowThreadContainingBlockNeedsUpdate):
     17        (WebCore::RenderBlock::setCachedFlowThreadContainingBlockNeedsUpdate):
     18        (WebCore::RenderBlock::updateCachedFlowThreadContainingBlock):
     19        (WebCore::RenderBlock::locateFlowThreadContainingBlock):
     20        (WebCore::RenderBlock::paginationStrut):
     21        (WebCore::RenderBlock::pageLogicalOffset):
     22        (WebCore::RenderBlock::setPaginationStrut):
     23        (WebCore::RenderBlock::setPageLogicalOffset):
     24        (WebCore::getRareData): Deleted.
     25        (WebCore::ensureRareData): Deleted.
     26        * rendering/RenderObject.cpp:
     27        (WebCore::RenderObject::~RenderObject): Assert that rare data hasn't been resurrected
     28        since willBeDestroyed().
     29        (WebCore::RenderObject::willBeDestroyed): Clear the rare data.
     30        (WebCore::RenderObject::setIsDragging): If setting, ensure that we have rare data and
     31        set the bit. Otherwise, only clear the bit of we have rare data.
     32        (WebCore::RenderObject::setHasReflection): Ditto.
     33        (WebCore::RenderObject::rareDataMap):
     34        (WebCore::RenderObject::rareData):
     35        (WebCore::RenderObject::ensureRareData):
     36        (WebCore::RenderObject::clearRareData):
     37        * rendering/RenderObject.h:
     38        (WebCore::RenderObject::isDragging): Fast-fail on the hasRareData() bit, then do the
     39        slower lookup in rare data.
     40        (WebCore::RenderObject::hasReflection): Ditto.
     41        (WebCore::RenderObject::setEverHadLayout): Moved up to group with other bit setters.
     42        (WebCore::RenderObject::hasRareData):
     43        (WebCore::RenderObject::setHasRareData):
     44        (WebCore::RenderObject::RenderObjectBitfields::RenderObjectBitfields):
     45        (WebCore::RenderObject::RenderObjectRareData::RenderObjectRareData):
     46        (WebCore::RenderObject::setHasReflection): Deleted. Out of line now.
     47        (WebCore::RenderObject::setIsDragging): Deleted. Ditto.
     48
    1492015-04-05  Darin Adler  <darin@apple.com>
    250
  • trunk/Source/WebCore/rendering/RenderBlock.cpp

    r182364 r182373  
    934934}
    935935
    936 static RenderBlockRareData* getRareData(const RenderBlock* block)
    937 {
    938     return gRareDataMap ? gRareDataMap->get(block) : 0;
    939 }
    940 
    941 static RenderBlockRareData& ensureRareData(const RenderBlock* block)
     936static RenderBlockRareData* getBlockRareData(const RenderBlock* block)
     937{
     938    return gRareDataMap ? gRareDataMap->get(block) : nullptr;
     939}
     940
     941static RenderBlockRareData& ensureBlockRareData(const RenderBlock* block)
    942942{
    943943    if (!gRareDataMap)
     
    32333233RenderFlowThread* RenderBlock::cachedFlowThreadContainingBlock() const
    32343234{
    3235     RenderBlockRareData* rareData = getRareData(this);
     3235    RenderBlockRareData* rareData = getBlockRareData(this);
    32363236
    32373237    if (!rareData || !rareData->m_flowThreadContainingBlock)
     
    32433243bool RenderBlock::cachedFlowThreadContainingBlockNeedsUpdate() const
    32443244{
    3245     RenderBlockRareData* rareData = getRareData(this);
     3245    RenderBlockRareData* rareData = getBlockRareData(this);
    32463246
    32473247    if (!rareData || !rareData->m_flowThreadContainingBlock)
     
    32533253void RenderBlock::setCachedFlowThreadContainingBlockNeedsUpdate()
    32543254{
    3255     RenderBlockRareData& rareData = ensureRareData(this);
     3255    RenderBlockRareData& rareData = ensureBlockRareData(this);
    32563256    rareData.m_flowThreadContainingBlock = Nullopt;
    32573257}
     
    32593259RenderFlowThread* RenderBlock::updateCachedFlowThreadContainingBlock(RenderFlowThread* flowThread) const
    32603260{
    3261     RenderBlockRareData& rareData = ensureRareData(this);
     3261    RenderBlockRareData& rareData = ensureBlockRareData(this);
    32623262    rareData.m_flowThreadContainingBlock = flowThread;
    32633263
     
    32673267RenderFlowThread* RenderBlock::locateFlowThreadContainingBlock() const
    32683268{
    3269     RenderBlockRareData* rareData = getRareData(this);
     3269    RenderBlockRareData* rareData = getBlockRareData(this);
    32703270    if (!rareData || !rareData->m_flowThreadContainingBlock)
    32713271        return updateCachedFlowThreadContainingBlock(RenderBox::locateFlowThreadContainingBlock());
     
    32773277LayoutUnit RenderBlock::paginationStrut() const
    32783278{
    3279     RenderBlockRareData* rareData = getRareData(this);
     3279    RenderBlockRareData* rareData = getBlockRareData(this);
    32803280    return rareData ? rareData->m_paginationStrut : LayoutUnit();
    32813281}
     
    32833283LayoutUnit RenderBlock::pageLogicalOffset() const
    32843284{
    3285     RenderBlockRareData* rareData = getRareData(this);
     3285    RenderBlockRareData* rareData = getBlockRareData(this);
    32863286    return rareData ? rareData->m_pageLogicalOffset : LayoutUnit();
    32873287}
     
    32893289void RenderBlock::setPaginationStrut(LayoutUnit strut)
    32903290{
    3291     RenderBlockRareData* rareData = getRareData(this);
     3291    RenderBlockRareData* rareData = getBlockRareData(this);
    32923292    if (!rareData) {
    32933293        if (!strut)
    32943294            return;
    3295         rareData = &ensureRareData(this);
     3295        rareData = &ensureBlockRareData(this);
    32963296    }
    32973297    rareData->m_paginationStrut = strut;
     
    33003300void RenderBlock::setPageLogicalOffset(LayoutUnit logicalOffset)
    33013301{
    3302     RenderBlockRareData* rareData = getRareData(this);
     3302    RenderBlockRareData* rareData = getBlockRareData(this);
    33033303    if (!rareData) {
    33043304        if (!logicalOffset)
    33053305            return;
    3306         rareData = &ensureRareData(this);
     3306        rareData = &ensureBlockRareData(this);
    33073307    }
    33083308    rareData->m_pageLogicalOffset = logicalOffset;
  • trunk/Source/WebCore/rendering/RenderObject.cpp

    r182215 r182373  
    131131#endif
    132132    view().didDestroyRenderer();
     133    ASSERT(!hasRareData());
    133134}
    134135
     
    19041905
    19051906    clearLayoutRootIfNeeded();
     1907    removeRareData();
    19061908}
    19071909
     
    24962498}
    24972499
     2500void RenderObject::setIsDragging(bool isDragging)
     2501{
     2502    if (isDragging || hasRareData())
     2503        ensureRareData().setIsDragging(isDragging);
     2504}
     2505
     2506void RenderObject::setHasReflection(bool hasReflection)
     2507{
     2508    if (hasReflection || hasRareData())
     2509        ensureRareData().setHasReflection(hasReflection);
     2510}
     2511
     2512RenderObject::RareDataHash& RenderObject::rareDataMap()
     2513{
     2514    static NeverDestroyed<RareDataHash> map;
     2515    return map;
     2516}
     2517
     2518RenderObject::RenderObjectRareData RenderObject::rareData() const
     2519{
     2520    if (!hasRareData())
     2521        return RenderObjectRareData();
     2522
     2523    return rareDataMap().get(this);
     2524}
     2525
     2526RenderObject::RenderObjectRareData& RenderObject::ensureRareData()
     2527{
     2528    setHasRareData(true);
     2529    return rareDataMap().add(this, RenderObjectRareData()).iterator->value;
     2530}
     2531
     2532void RenderObject::removeRareData()
     2533{
     2534    rareDataMap().remove(this);
     2535    setHasRareData(false);
     2536}
     2537
    24982538} // namespace WebCore
    24992539
  • trunk/Source/WebCore/rendering/RenderObject.h

    r182215 r182373  
    516516    bool isRenderView() const  { return m_bitfields.isBox() && m_bitfields.isTextOrRenderView(); }
    517517    bool isInline() const { return m_bitfields.isInline(); } // inline object
    518     bool isDragging() const { return m_bitfields.isDragging(); }
    519518    bool isReplaced() const { return m_bitfields.isReplaced(); } // a "replaced" element (see CSS)
    520519    bool isHorizontalWritingMode() const { return m_bitfields.horizontalWritingMode(); }
     
    624623    void setHasLayer(bool b = true) { m_bitfields.setHasLayer(b); }
    625624    void setHasTransformRelatedProperty(bool b = true) { m_bitfields.setHasTransformRelatedProperty(b); }
    626     void setHasReflection(bool b = true) { m_bitfields.setHasReflection(b); }
     625
     626    bool isDragging() const { return m_bitfields.hasRareData() && rareData().isDragging(); }
     627    bool hasReflection() const { return m_bitfields.hasRareData() && rareData().hasReflection(); }
     628
     629    void setIsDragging(bool);
     630    void setHasReflection(bool = true);
    627631
    628632    // Hook so that RenderTextControl can return the line height of its inner renderer.
     
    756760    bool isFloatingOrOutOfFlowPositioned() const { return (isFloating() || isOutOfFlowPositioned()); }
    757761
    758     bool hasReflection() const { return m_bitfields.hasReflection(); }
    759 
    760762    // Applied as a "slop" to dirty rect checks during the outline painting phase's dirty-rect checks.
    761763    int maximalOutlineSize(PaintPhase) const;
     
    884886    virtual bool isWBR() const { ASSERT_NOT_REACHED(); return false; }
    885887
     888    void setEverHadLayout(bool b) { m_bitfields.setEverHadLayout(b); }
     889
     890    bool hasRareData() const { return m_bitfields.hasRareData(); }
     891    void setHasRareData(bool b) { m_bitfields.setHasRareData(b); }
     892
    886893#ifndef NDEBUG
    887894    void checkBlockPositionedObjectsNeedLayout();
     
    916923    public:
    917924        RenderObjectBitfields(const Node& node)
    918             : m_beingDestroyed(false)
     925            : m_hasRareData(false)
     926            , m_beingDestroyed(false)
    919927            , m_needsLayout(false)
    920928            , m_needsPositionedMovementLayout(false)
     
    931939            , m_isLineBreak(false)
    932940            , m_horizontalWritingMode(true)
    933             , m_isDragging(false)
    934941            , m_hasLayer(false)
    935942            , m_hasOverflowClip(false)
    936943            , m_hasTransformRelatedProperty(false)
    937             , m_hasReflection(false)
    938944            , m_everHadLayout(false)
    939945            , m_childrenInline(false)
     
    944950        {
    945951        }
     952
     953        ADD_BOOLEAN_BITFIELD(hasRareData, HasRareData);
    946954       
    947955        ADD_BOOLEAN_BITFIELD(beingDestroyed, BeingDestroyed);
     
    961969        ADD_BOOLEAN_BITFIELD(isLineBreak, IsLineBreak);
    962970        ADD_BOOLEAN_BITFIELD(horizontalWritingMode, HorizontalWritingMode);
    963         ADD_BOOLEAN_BITFIELD(isDragging, IsDragging);
    964971
    965972        ADD_BOOLEAN_BITFIELD(hasLayer, HasLayer);
    966973        ADD_BOOLEAN_BITFIELD(hasOverflowClip, HasOverflowClip); // Set in the case of overflow:auto/scroll/hidden
    967974        ADD_BOOLEAN_BITFIELD(hasTransformRelatedProperty, HasTransformRelatedProperty);
    968         ADD_BOOLEAN_BITFIELD(hasReflection, HasReflection);
     975        ADD_BOOLEAN_BITFIELD(unused, Unused);
    969976
    970977        ADD_BOOLEAN_BITFIELD(everHadLayout, EverHadLayout);
     
    10021009    };
    10031010
     1011    RenderObjectBitfields m_bitfields;
     1012
     1013    class RenderObjectRareData {
     1014    public:
     1015        RenderObjectRareData()
     1016            : m_isDragging(false)
     1017            , m_hasReflection(false)
     1018        {
     1019        }
     1020
     1021        ADD_BOOLEAN_BITFIELD(isDragging, IsDragging);
     1022        ADD_BOOLEAN_BITFIELD(hasReflection, HasReflection);
     1023    };
     1024   
     1025    RenderObjectRareData rareData() const;
     1026    RenderObjectRareData& ensureRareData();
     1027    void removeRareData();
     1028   
     1029    // Note: RenderObjectRareData is stored by value.
     1030    typedef HashMap<const RenderObject*, RenderObjectRareData> RareDataHash;
     1031
     1032    static RareDataHash& rareDataMap();
     1033
    10041034#undef ADD_BOOLEAN_BITFIELD
    1005 
    1006     RenderObjectBitfields m_bitfields;
    1007 
    1008     void setIsDragging(bool b) { m_bitfields.setIsDragging(b); }
    1009     void setEverHadLayout(bool b) { m_bitfields.setEverHadLayout(b); }
    10101035};
    10111036
Note: See TracChangeset for help on using the changeset viewer.