Changeset 156738 in webkit


Ignore:
Timestamp:
Oct 1, 2013 3:29:34 PM (11 years ago)
Author:
Antti Koivisto
Message:

Make tests for renderer base types non-virtual
https://bugs.webkit.org/show_bug.cgi?id=122185

Reviewed by Dave Hyatt.

Make isRenderFoo() functions for commonly tested base types use bit flags instead of virtual calls.
This is faster and we have space in RenderElement.

These bits are not mutully exclusive. For testing leaf types we can add an enum.

Location:
trunk/Source/WebCore
Files:
32 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r156733 r156738  
     12013-10-01  Antti Koivisto  <antti@apple.com>
     2
     3        Make tests for renderer base types non-virtual
     4        https://bugs.webkit.org/show_bug.cgi?id=122185
     5
     6        Reviewed by Dave Hyatt.
     7
     8        Make isRenderFoo() functions for commonly tested base types use bit flags instead of virtual calls.
     9        This is faster and we have space in RenderElement.
     10       
     11        These bits are not mutully exclusive. For testing leaf types we can add an enum.
     12
    1132013-10-01  Ryosuke Niwa  <rniwa@webkit.org>
    214
  • trunk/Source/WebCore/rendering/RenderBlock.cpp

    r156613 r156738  
    150150// -------------------------------------------------------------------------------------------------------
    151151
    152 RenderBlock::RenderBlock(Element* element)
    153     : RenderBox(element)
     152RenderBlock::RenderBlock(Element* element, unsigned baseTypeFlags)
     153    : RenderBox(element, baseTypeFlags | RenderBlockFlag)
    154154    , m_lineHeight(-1)
    155155    , m_hasMarginBeforeQuirk(false)
  • trunk/Source/WebCore/rendering/RenderBlock.h

    r156639 r156738  
    9999
    100100protected:
    101     explicit RenderBlock(Element*);
     101    explicit RenderBlock(Element*, unsigned baseTypeFlags);
    102102    virtual ~RenderBlock();
    103103
     
    553553    virtual const char* renderName() const OVERRIDE;
    554554
    555     virtual bool isRenderBlock() const OVERRIDE FINAL { return true; }
    556555    virtual bool isInlineBlockOrInlineTable() const OVERRIDE FINAL { return isInline() && isReplaced(); }
    557556    virtual bool canHaveChildren() const OVERRIDE { return true; }
  • trunk/Source/WebCore/rendering/RenderBlockFlow.cpp

    r156557 r156738  
    7777
    7878RenderBlockFlow::RenderBlockFlow(Element* element)
    79     : RenderBlock(element)
     79    : RenderBlock(element, RenderBlockFlowFlag)
    8080{
    8181    COMPILE_ASSERT(sizeof(RenderBlockFlow::MarginInfo) == sizeof(SameSizeAsMarginInfo), MarginInfo_should_stay_small);
  • trunk/Source/WebCore/rendering/RenderBlockFlow.h

    r156639 r156738  
    3232    explicit RenderBlockFlow(Element*);
    3333    virtual ~RenderBlockFlow();
    34    
    35     virtual bool isRenderBlockFlow() const OVERRIDE FINAL { return true; }
    36    
     34       
    3735    virtual void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0) OVERRIDE;
    3836
  • trunk/Source/WebCore/rendering/RenderBox.cpp

    r156622 r156738  
    9696}
    9797
    98 RenderBox::RenderBox(Element* element)
    99     : RenderBoxModelObject(element)
     98RenderBox::RenderBox(Element* element, unsigned baseTypeFlags)
     99    : RenderBoxModelObject(element, baseTypeFlags)
    100100    , m_minPreferredLogicalWidth(-1)
    101101    , m_maxPreferredLogicalWidth(-1)
  • trunk/Source/WebCore/rendering/RenderBox.h

    r156622 r156738  
    4545class RenderBox : public RenderBoxModelObject {
    4646public:
    47     explicit RenderBox(Element*);
     47    explicit RenderBox(Element*, unsigned baseTypeFlags);
    4848    virtual ~RenderBox();
    4949
  • trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp

    r156622 r156738  
    160160}
    161161
    162 RenderBoxModelObject::RenderBoxModelObject(Element* element)
    163     : RenderLayerModelObject(element)
     162RenderBoxModelObject::RenderBoxModelObject(Element* element, unsigned baseTypeFlags)
     163    : RenderLayerModelObject(element, baseTypeFlags | RenderBoxModelObjectFlag)
    164164{
    165165}
  • trunk/Source/WebCore/rendering/RenderBoxModelObject.h

    r156622 r156738  
    6262class RenderBoxModelObject : public RenderLayerModelObject {
    6363public:
    64     explicit RenderBoxModelObject(Element*);
     64    explicit RenderBoxModelObject(Element*, unsigned baseTypeFlags);
    6565    virtual ~RenderBoxModelObject();
    6666   
     
    310310private:
    311311    LayoutUnit computedCSSPadding(Length) const;
    312     virtual bool isBoxModelObject() const OVERRIDE FINAL { return true; }
    313312   
    314313    virtual LayoutRect frameRectForStickyPositioning() const = 0;
  • trunk/Source/WebCore/rendering/RenderDeprecatedFlexibleBox.cpp

    r156613 r156738  
    122122
    123123RenderDeprecatedFlexibleBox::RenderDeprecatedFlexibleBox(Element& element)
    124     : RenderBlock(&element)
     124    : RenderBlock(&element, 0)
    125125{
    126126    setChildrenInline(false); // All of our children must be block-level
  • trunk/Source/WebCore/rendering/RenderElement.cpp

    r156639 r156738  
    6565bool RenderElement::s_noLongerAffectsParentBlock = false;
    6666
    67 RenderElement::RenderElement(Element* element)
     67RenderElement::RenderElement(Element* element, unsigned baseTypeFlags)
    6868    : RenderObject(element)
     69    , m_baseTypeFlags(baseTypeFlags)
    6970    , m_ancestorLineBoxDirty(false)
    7071    , m_firstChild(nullptr)
     
    274275    // style changing, since it depends on whether we decide to composite these elements. When the
    275276    // layer status of one of these elements changes, we need to force a layout.
    276     if (diff == StyleDifferenceEqual && style() && isLayerModelObject()) {
     277    if (diff == StyleDifferenceEqual && style() && isRenderLayerModelObject()) {
    277278        if (hasLayer() != toRenderLayerModelObject(this)->requiresLayer())
    278279            diff = StyleDifferenceLayout;
  • trunk/Source/WebCore/rendering/RenderElement.h

    r156639 r156738  
    5151    RenderObject* lastChild() const { return m_lastChild; }
    5252
     53    // FIXME: Make these standalone and move to relevant files.
     54    bool isRenderLayerModelObject() const;
     55    bool isBoxModelObject() const;
     56    bool isRenderBlock() const;
     57    bool isRenderBlockFlow() const;
     58    bool isRenderReplaced() const;
     59    bool isRenderInline() const;
     60
    5361    virtual bool isChildAllowed(RenderObject*, RenderStyle*) const { return true; }
    5462    virtual void addChild(RenderObject* newChild, RenderObject* beforeChild = 0);
     
    8795
    8896protected:
    89     explicit RenderElement(Element*);
     97    enum BaseTypeFlags {
     98        RenderLayerModelObjectFlag = 1 << 0,
     99        RenderBoxModelObjectFlag = 1 << 1,
     100        RenderInlineFlag = 1 << 2,
     101        RenderReplacedFlag = 1 << 3,
     102        RenderBlockFlag = 1 << 4,
     103        RenderBlockFlowFlag = 1 << 5,
     104    };
     105
     106    explicit RenderElement(Element*, unsigned baseTypeFlags);
    90107
    91108    bool layerCreationAllowedForSubtree() const;
     
    130147    RenderStyle* cachedFirstLineStyle() const;
    131148
     149    unsigned m_baseTypeFlags : 6;
    132150    bool m_ancestorLineBoxDirty : 1;
    133151
     
    165183}
    166184
     185inline bool RenderElement::isRenderLayerModelObject() const
     186{
     187    return m_baseTypeFlags & RenderLayerModelObjectFlag;
     188}
     189
     190inline bool RenderElement::isBoxModelObject() const
     191{
     192    return m_baseTypeFlags & RenderBoxModelObjectFlag;
     193}
     194
     195inline bool RenderElement::isRenderBlock() const
     196{
     197    return m_baseTypeFlags & RenderBlockFlag;
     198}
     199
     200inline bool RenderElement::isRenderBlockFlow() const
     201{
     202    return m_baseTypeFlags & RenderBlockFlowFlag;
     203}
     204
     205inline bool RenderElement::isRenderReplaced() const
     206{
     207    return m_baseTypeFlags & RenderReplacedFlag;
     208}
     209
     210inline bool RenderElement::isRenderInline() const
     211{
     212    return m_baseTypeFlags & RenderInlineFlag;
     213}
     214
    167215inline RenderElement& toRenderElement(RenderObject& object)
    168216{
     
    192240void toRenderElement(const RenderElement*);
    193241void toRenderElement(const RenderElement&);
     242
     243inline bool RenderObject::isRenderLayerModelObject() const
     244{
     245    return isRenderElement() && toRenderElement(this)->isRenderLayerModelObject();
     246}
     247
     248inline bool RenderObject::isBoxModelObject() const
     249{
     250    return isRenderElement() && toRenderElement(this)->isBoxModelObject();
     251}
     252
     253inline bool RenderObject::isRenderBlock() const
     254{
     255    return isRenderElement() && toRenderElement(this)->isRenderBlock();
     256}
     257
     258inline bool RenderObject::isRenderBlockFlow() const
     259{
     260    return isRenderElement() && toRenderElement(this)->isRenderBlockFlow();
     261}
     262
     263inline bool RenderObject::isRenderReplaced() const
     264{
     265    return isRenderElement() && toRenderElement(this)->isRenderReplaced();
     266}
     267
     268inline bool RenderObject::isRenderInline() const
     269{
     270    return isRenderElement() && toRenderElement(this)->isRenderInline();
     271}
    194272
    195273inline RenderStyle* RenderObject::style() const
  • trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp

    r156166 r156738  
    125125
    126126RenderFlexibleBox::RenderFlexibleBox(Element* element)
    127     : RenderBlock(element)
     127    : RenderBlock(element, 0)
    128128    , m_orderIterator(this)
    129129    , m_numberOfInFlowChildrenOnFirstLine(-1)
  • trunk/Source/WebCore/rendering/RenderFrameSet.cpp

    r156155 r156738  
    4646
    4747RenderFrameSet::RenderFrameSet(HTMLFrameSetElement& frameSet)
    48     : RenderBox(&frameSet)
     48    : RenderBox(&frameSet, 0)
    4949    , m_isResizing(false)
    5050    , m_isChildResizing(false)
  • trunk/Source/WebCore/rendering/RenderGrid.cpp

    r156166 r156738  
    128128
    129129RenderGrid::RenderGrid(Element& element)
    130     : RenderBlock(&element)
     130    : RenderBlock(&element, 0)
    131131{
    132132    // All of our children must be block level.
  • trunk/Source/WebCore/rendering/RenderInline.cpp

    r156608 r156738  
    5252
    5353RenderInline::RenderInline(Element* element)
    54     : RenderBoxModelObject(element)
     54    : RenderBoxModelObject(element, RenderInlineFlag)
    5555    , m_alwaysCreateLineBoxes(false)
    5656{
  • trunk/Source/WebCore/rendering/RenderInline.h

    r156278 r156738  
    9999    virtual const char* renderName() const OVERRIDE;
    100100
    101     virtual bool isRenderInline() const OVERRIDE FINAL { return true; }
    102101    virtual bool canHaveChildren() const OVERRIDE FINAL { return true; }
    103102
  • trunk/Source/WebCore/rendering/RenderLayerModelObject.cpp

    r156278 r156738  
    3838bool RenderLayerModelObject::s_layerWasSelfPainting = false;
    3939
    40 RenderLayerModelObject::RenderLayerModelObject(Element* element)
    41     : RenderElement(element)
     40RenderLayerModelObject::RenderLayerModelObject(Element* element, unsigned baseTypeFlags)
     41    : RenderElement(element, baseTypeFlags | RenderLayerModelObjectFlag)
    4242    , m_layer(0)
    4343{
  • trunk/Source/WebCore/rendering/RenderLayerModelObject.h

    r156102 r156738  
    3232class RenderLayerModelObject : public RenderElement {
    3333public:
    34     explicit RenderLayerModelObject(Element*);
     34    explicit RenderLayerModelObject(Element*, unsigned baseTypeFlags);
    3535    virtual ~RenderLayerModelObject();
    3636
     
    5858
    5959private:
    60     virtual bool isLayerModelObject() const OVERRIDE FINAL { return true; }
    61 
    6260    RenderLayer* m_layer;
    6361
     
    7169inline RenderLayerModelObject* toRenderLayerModelObject(RenderObject* object)
    7270{
    73     ASSERT_WITH_SECURITY_IMPLICATION(!object || object->isLayerModelObject());
     71    ASSERT_WITH_SECURITY_IMPLICATION(!object || object->isRenderLayerModelObject());
    7472    return static_cast<RenderLayerModelObject*>(object);
    7573}
     
    7775inline const RenderLayerModelObject* toRenderLayerModelObject(const RenderObject* object)
    7876{
    79     ASSERT_WITH_SECURITY_IMPLICATION(!object || object->isLayerModelObject());
     77    ASSERT_WITH_SECURITY_IMPLICATION(!object || object->isRenderLayerModelObject());
    8078    return static_cast<const RenderLayerModelObject*>(object);
    8179}
  • trunk/Source/WebCore/rendering/RenderLineBreak.cpp

    r156608 r156738  
    3434
    3535RenderLineBreak::RenderLineBreak(HTMLElement& element)
    36     : RenderBoxModelObject(&element)
     36    : RenderBoxModelObject(&element, 0)
    3737    , m_inlineBoxWrapper(nullptr)
    3838    , m_cachedLineHeight(invalidLineHeight)
  • trunk/Source/WebCore/rendering/RenderListMarker.cpp

    r156613 r156738  
    11191119
    11201120RenderListMarker::RenderListMarker(RenderListItem& listItem)
    1121     : RenderBox(0)
     1121    : RenderBox(nullptr, 0)
    11221122    , m_listItem(listItem)
    11231123{
  • trunk/Source/WebCore/rendering/RenderObject.h

    r156639 r156738  
    304304
    305305    bool isRenderElement() const { return !isText(); }
    306     virtual bool isBoxModelObject() const { return false; }
     306    bool isRenderReplaced() const;
     307    bool isBoxModelObject() const;
     308    bool isRenderBlock() const;
     309    bool isRenderBlockFlow() const;
     310    bool isRenderInline() const;
     311    bool isRenderLayerModelObject() const;
     312
    307313    virtual bool isCounter() const { return false; }
    308314    virtual bool isQuote() const { return false; }
     
    318324    virtual bool isImage() const { return false; }
    319325    virtual bool isInlineBlockOrInlineTable() const { return false; }
    320     virtual bool isLayerModelObject() const { return false; }
    321326    virtual bool isListBox() const { return false; }
    322327    virtual bool isListItem() const { return false; }
     
    331336    virtual bool isProgress() const { return false; }
    332337#endif
    333     virtual bool isRenderBlock() const { return false; }
    334     virtual bool isRenderBlockFlow() const { return false; }
    335338    virtual bool isRenderSVGBlock() const { return false; };
    336339    virtual bool isRenderButton() const { return false; }
    337340    virtual bool isRenderIFrame() const { return false; }
    338341    virtual bool isRenderImage() const { return false; }
    339     virtual bool isRenderInline() const { return false; }
    340342    virtual bool isRenderRegion() const { return false; }
    341     virtual bool isRenderReplaced() const { return false; }
    342343    virtual bool isReplica() const { return false; }
    343344
  • trunk/Source/WebCore/rendering/RenderReplaced.cpp

    r155374 r156738  
    4444
    4545RenderReplaced::RenderReplaced(Element* element)
    46     : RenderBox(element)
     46    : RenderBox(element, RenderReplacedFlag)
    4747    , m_intrinsicSize(cDefaultWidth, cDefaultHeight)
    4848{
     
    5151
    5252RenderReplaced::RenderReplaced(Element* element, const LayoutSize& intrinsicSize)
    53     : RenderBox(element)
     53    : RenderBox(element, RenderReplacedFlag)
    5454    , m_intrinsicSize(intrinsicSize)
    5555{
  • trunk/Source/WebCore/rendering/RenderReplaced.h

    r156278 r156738  
    4242
    4343protected:
    44     virtual bool isRenderReplaced() const OVERRIDE FINAL { return true; }
    45 
    4644    virtual void willBeDestroyed();
    4745
  • trunk/Source/WebCore/rendering/RenderReplica.cpp

    r155908 r156738  
    3636
    3737RenderReplica::RenderReplica()
    38     : RenderBox(0)
     38    : RenderBox(nullptr, 0)
    3939{
    4040    // This is a hack. Replicas are synthetic, and don't pick up the attributes of the
  • trunk/Source/WebCore/rendering/RenderScrollbarPart.cpp

    r156622 r156738  
    3838
    3939RenderScrollbarPart::RenderScrollbarPart(RenderScrollbar* scrollbar, ScrollbarPart part)
    40     : RenderBlock(0)
     40    : RenderBlock(nullptr, 0)
    4141    , m_scrollbar(scrollbar)
    4242    , m_part(part)
  • trunk/Source/WebCore/rendering/RenderTable.cpp

    r156355 r156738  
    5252
    5353RenderTable::RenderTable(Element* element)
    54     : RenderBlock(element)
     54    : RenderBlock(element, 0)
    5555    , m_head(0)
    5656    , m_foot(0)
  • trunk/Source/WebCore/rendering/RenderTableCol.cpp

    r156155 r156738  
    3737
    3838RenderTableCol::RenderTableCol(Element& element)
    39     : RenderBox(&element)
     39    : RenderBox(&element, 0)
    4040    , m_span(1)
    4141{
  • trunk/Source/WebCore/rendering/RenderTableRow.cpp

    r156404 r156738  
    4040
    4141RenderTableRow::RenderTableRow(Element* element)
    42     : RenderBox(element)
     42    : RenderBox(element, 0)
    4343    , m_rowIndex(unsetRowIndex)
    4444{
  • trunk/Source/WebCore/rendering/RenderTableSection.cpp

    r156404 r156738  
    8686
    8787RenderTableSection::RenderTableSection(Element* element)
    88     : RenderBox(element)
     88    : RenderBox(element, 0)
    8989    , m_cCol(0)
    9090    , m_cRow(0)
  • trunk/Source/WebCore/rendering/svg/RenderSVGGradientStop.cpp

    r156255 r156738  
    3535
    3636RenderSVGGradientStop::RenderSVGGradientStop(SVGStopElement* element)
    37     : RenderElement(element)
     37    : RenderElement(element, 0)
    3838{
    3939}
  • trunk/Source/WebCore/rendering/svg/RenderSVGModelObject.cpp

    r156278 r156738  
    4444
    4545RenderSVGModelObject::RenderSVGModelObject(SVGElement& element)
    46     : RenderElement(&element)
     46    : RenderElement(&element, 0)
    4747    , m_hasSVGShadow(false)
    4848{
Note: See TracChangeset for help on using the changeset viewer.