Changeset 125294 in webkit


Ignore:
Timestamp:
Aug 10, 2012 10:00:40 AM (12 years ago)
Author:
kling@webkit.org
Message:

CSS: Shrink RuleData by storing selector as index rather than pointer.
<http://webkit.org/b/93712>

Reviewed by Antti Koivisto.

Pack the selector's index in the rule in the RuleData bitfield, effectively
shrinking each RuleData by 8 bytes.

  • css/CSSSelectorList.h:

(WebCore::CSSSelectorList::selectorAt):
(WebCore::CSSSelectorList::indexOfNextSelectorAfter):

Add helpers to CSSSelectorList to iterate by index.

  • css/StyleResolver.cpp:

(RuleData):
(WebCore::RuleData::selector):
(WebCore::RuleData::selectorIndex):
(SameSizeAsRuleData):
(RuleSet):
(WebCore::makeRuleSet):
(WebCore::StyleResolver::collectMatchingRulesForList):

  • css/StyleResolver.h:

(WebCore::StyleResolver::RuleFeature::RuleFeature):
(RuleFeature):

Store selector indices instead of CSSSelector* pointers.

Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r125293 r125294  
     12012-08-10  Andreas Kling  <kling@webkit.org>
     2
     3        CSS: Shrink RuleData by storing selector as index rather than pointer.
     4        <http://webkit.org/b/93712>
     5
     6        Reviewed by Antti Koivisto.
     7
     8        Pack the selector's index in the rule in the RuleData bitfield, effectively
     9        shrinking each RuleData by 8 bytes.
     10
     11        * css/CSSSelectorList.h:
     12        (WebCore::CSSSelectorList::selectorAt):
     13        (WebCore::CSSSelectorList::indexOfNextSelectorAfter):
     14
     15            Add helpers to CSSSelectorList to iterate by index.
     16
     17        * css/StyleResolver.cpp:
     18        (RuleData):
     19        (WebCore::RuleData::selector):
     20        (WebCore::RuleData::selectorIndex):
     21        (SameSizeAsRuleData):
     22        (RuleSet):
     23        (WebCore::makeRuleSet):
     24        (WebCore::StyleResolver::collectMatchingRulesForList):
     25        * css/StyleResolver.h:
     26        (WebCore::StyleResolver::RuleFeature::RuleFeature):
     27        (RuleFeature):
     28
     29            Store selector indices instead of CSSSelector* pointers.
     30
    1312012-08-10  Vineet Chaudhary  <rgf748@motorola.com>
    232
  • trunk/Source/WebCore/css/CSSSelectorList.h

    r125252 r125294  
    4949    static CSSSelector* next(CSSSelector*);
    5050    bool hasOneSelector() const { return m_selectorArray && !next(m_selectorArray); }
     51    CSSSelector* selectorAt(size_t index) const { return &m_selectorArray[index]; }
     52
     53    size_t indexOfNextSelectorAfter(size_t index) const
     54    {
     55        CSSSelector* current = selectorAt(index);
     56        current = next(current);
     57        if (!current)
     58            return notFound;
     59        return current - m_selectorArray;
     60    }
    5161
    5262    bool selectorsNeedNamespaceResolution();
  • trunk/Source/WebCore/css/StyleResolver.cpp

    r125205 r125294  
    200200class RuleData {
    201201public:
    202     RuleData(StyleRule*, CSSSelector*, unsigned position, bool hasDocumentSecurityOrigin, bool canUseFastCheckSelector, bool inRegionRule);
     202    RuleData(StyleRule*, unsigned selectorIndex, unsigned position, bool hasDocumentSecurityOrigin, bool canUseFastCheckSelector, bool inRegionRule);
    203203
    204204    unsigned position() const { return m_position; }
    205205    StyleRule* rule() const { return m_rule; }
    206     CSSSelector* selector() const { return m_selector; }
     206    CSSSelector* selector() const { return m_rule->selectorList().selectorAt(m_selectorIndex); }
     207    unsigned selectorIndex() const { return m_selectorIndex; }
    207208
    208209    bool hasFastCheckableSelector() const { return m_hasFastCheckableSelector; }
     
    223224private:
    224225    StyleRule* m_rule;
    225     CSSSelector* m_selector;
    226     unsigned m_specificity;
     226    unsigned m_selectorIndex : 12;
    227227    // This number was picked fairly arbitrarily. We can probably lower it if we need to.
    228228    // Some simple testing showed <100,000 RuleData's on large sites.
    229     unsigned m_position : 24;
     229    unsigned m_position : 20;
     230    unsigned m_specificity : 24;
    230231    unsigned m_hasFastCheckableSelector : 1;
    231232    unsigned m_hasMultipartSelector : 1;
     
    241242struct SameSizeAsRuleData {
    242243    void* a;
    243     void* b;
    244     unsigned c;
    245     unsigned d;
    246     unsigned e[4];
     244    uint64_t b;
     245    unsigned c[4];
    247246};
    248247
     
    259258
    260259    void addStyleRule(StyleRule*, bool hasDocumentSecurityOrigin, bool canUseFastCheckSelector, bool isInRegionRule = false);
    261     void addRule(StyleRule*, CSSSelector*, bool hasDocumentSecurityOrigin, bool canUseFastCheckSelector, bool isInRegionRule = false);
     260    void addRule(StyleRule*, unsigned selectorIndex, bool hasDocumentSecurityOrigin, bool canUseFastCheckSelector, bool isInRegionRule = false);
    262261    void addPageRule(StyleRulePage*);
    263262    void addToRuleSet(AtomicStringImpl* key, AtomRuleMap&, const RuleData&);
     
    482481    OwnPtr<RuleSet> ruleSet = RuleSet::create();
    483482    for (size_t i = 0; i < size; ++i)
    484         ruleSet->addRule(rules[i].rule, rules[i].selector, rules[i].hasDocumentSecurityOrigin, false);
     483        ruleSet->addRule(rules[i].rule, rules[i].selectorIndex, rules[i].hasDocumentSecurityOrigin, false);
    485484    ruleSet->shrinkToFit();
    486485    return ruleSet.release();
     
    24962495}
    24972496
    2498 RuleData::RuleData(StyleRule* rule, CSSSelector* selector, unsigned position, bool hasDocumentSecurityOrigin, bool canUseFastCheckSelector, bool inRegionRule)
     2497RuleData::RuleData(StyleRule* rule, unsigned selectorIndex, unsigned position, bool hasDocumentSecurityOrigin, bool canUseFastCheckSelector, bool inRegionRule)
    24992498    : m_rule(rule)
    2500     , m_selector(selector)
    2501     , m_specificity(selector->specificity())
     2499    , m_selectorIndex(selectorIndex)
    25022500    , m_position(position)
    2503     , m_hasFastCheckableSelector(canUseFastCheckSelector && SelectorChecker::isFastCheckableSelector(selector))
    2504     , m_hasMultipartSelector(!!selector->tagHistory())
    2505     , m_hasRightmostSelectorMatchingHTMLBasedOnRuleHash(isSelectorMatchingHTMLBasedOnRuleHash(selector))
    2506     , m_containsUncommonAttributeSelector(WebCore::containsUncommonAttributeSelector(selector))
    2507     , m_linkMatchType(SelectorChecker::determineLinkMatchType(selector))
     2501    , m_specificity(selector()->specificity())
     2502    , m_hasFastCheckableSelector(canUseFastCheckSelector && SelectorChecker::isFastCheckableSelector(selector()))
     2503    , m_hasMultipartSelector(!!selector()->tagHistory())
     2504    , m_hasRightmostSelectorMatchingHTMLBasedOnRuleHash(isSelectorMatchingHTMLBasedOnRuleHash(selector()))
     2505    , m_containsUncommonAttributeSelector(WebCore::containsUncommonAttributeSelector(selector()))
     2506    , m_linkMatchType(SelectorChecker::determineLinkMatchType(selector()))
    25082507    , m_hasDocumentSecurityOrigin(hasDocumentSecurityOrigin)
    25092508    , m_isInRegionRule(inRegionRule)
    25102509{
    2511     SelectorChecker::collectIdentifierHashes(m_selector, m_descendantSelectorIdentifierHashes, maximumIdentifierCount);
     2510    ASSERT(m_position == position);
     2511    ASSERT(m_selectorIndex == selectorIndex);
     2512    SelectorChecker::collectIdentifierHashes(selector(), m_descendantSelectorIdentifierHashes, maximumIdentifierCount);
    25122513}
    25132514
     
    25892590    }
    25902591    if (foundSiblingSelector)
    2591         features.siblingRules.append(StyleResolver::RuleFeature(ruleData.rule(), ruleData.selector(), ruleData.hasDocumentSecurityOrigin()));
     2592        features.siblingRules.append(StyleResolver::RuleFeature(ruleData.rule(), ruleData.selectorIndex(), ruleData.hasDocumentSecurityOrigin()));
    25922593    if (ruleData.containsUncommonAttributeSelector())
    2593         features.uncommonAttributeRules.append(StyleResolver::RuleFeature(ruleData.rule(), ruleData.selector(), ruleData.hasDocumentSecurityOrigin()));
     2594        features.uncommonAttributeRules.append(StyleResolver::RuleFeature(ruleData.rule(), ruleData.selectorIndex(), ruleData.hasDocumentSecurityOrigin()));
    25942595}
    25952596   
     
    26042605}
    26052606
    2606 void RuleSet::addRule(StyleRule* rule, CSSSelector* selector, bool hasDocumentSecurityOrigin, bool canUseFastCheckSelector, bool inRegionRule)
    2607 {
    2608     RuleData ruleData(rule, selector, m_ruleCount++, hasDocumentSecurityOrigin, canUseFastCheckSelector, inRegionRule);
     2607void RuleSet::addRule(StyleRule* rule, unsigned selectorIndex, bool hasDocumentSecurityOrigin, bool canUseFastCheckSelector, bool inRegionRule)
     2608{
     2609    RuleData ruleData(rule, selectorIndex, m_ruleCount++, hasDocumentSecurityOrigin, canUseFastCheckSelector, inRegionRule);
    26092610    collectFeaturesFromRuleData(m_features, ruleData);
     2611
     2612    CSSSelector* selector = ruleData.selector();
    26102613
    26112614    if (selector->m_match == CSSSelector::Id) {
     
    27492752void RuleSet::addStyleRule(StyleRule* rule, bool hasDocumentSecurityOrigin, bool canUseFastCheckSelector, bool isInRegionRule)
    27502753{
    2751     for (CSSSelector* s = rule->selectorList().first(); s; s = CSSSelectorList::next(s))
    2752         addRule(rule, s, hasDocumentSecurityOrigin, canUseFastCheckSelector, isInRegionRule);
     2754    for (size_t selectorIndex = 0; selectorIndex != notFound; selectorIndex = rule->selectorList().indexOfNextSelectorAfter(selectorIndex))
     2755        addRule(rule, selectorIndex, hasDocumentSecurityOrigin, canUseFastCheckSelector, isInRegionRule);
    27532756}
    27542757
  • trunk/Source/WebCore/css/StyleResolver.h

    r124768 r125294  
    275275
    276276    struct RuleFeature {
    277         RuleFeature(StyleRule* rule, CSSSelector* selector, bool hasDocumentSecurityOrigin)
     277        RuleFeature(StyleRule* rule, unsigned selectorIndex, bool hasDocumentSecurityOrigin)
    278278            : rule(rule)
    279             , selector(selector)
     279            , selectorIndex(selectorIndex)
    280280            , hasDocumentSecurityOrigin(hasDocumentSecurityOrigin)
    281281        {
    282282        }
    283283        StyleRule* rule;
    284         CSSSelector* selector;
     284        unsigned selectorIndex;
    285285        bool hasDocumentSecurityOrigin;
    286286    };
Note: See TracChangeset for help on using the changeset viewer.