Changeset 167574 in webkit


Ignore:
Timestamp:
Apr 20, 2014 2:28:51 PM (10 years ago)
Author:
benjamin@webkit.org
Message:

Compile the pseudo class :target
https://bugs.webkit.org/show_bug.cgi?id=131904

Reviewed by Andreas Kling.

The pseudo class :target is trivial, it just compare the current element with
Document::cssTarget().

  • cssjit/SelectorCompiler.cpp:

(WebCore::SelectorCompiler::addPseudoType):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementMatching):
(WebCore::SelectorCompiler::getDocument):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementAttributeValueExactMatching):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementIsTarget):

  • dom/Document.h:

(WebCore::Document::cssTargetMemoryOffset):

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r167571 r167574  
     12014-04-20  Benjamin Poulain  <benjamin@webkit.org>
     2
     3        Compile the pseudo class :target
     4        https://bugs.webkit.org/show_bug.cgi?id=131904
     5
     6        Reviewed by Andreas Kling.
     7
     8        The pseudo class :target is trivial, it just compare the current element with
     9        Document::cssTarget().
     10
     11        * cssjit/SelectorCompiler.cpp:
     12        (WebCore::SelectorCompiler::addPseudoType):
     13        (WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementMatching):
     14        (WebCore::SelectorCompiler::getDocument):
     15        (WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementAttributeValueExactMatching):
     16        (WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementIsTarget):
     17        * dom/Document.h:
     18        (WebCore::Document::cssTargetMemoryOffset):
     19
    1202014-04-20  Benjamin Poulain  <benjamin@webkit.org>
    221
  • trunk/Source/WebCore/cssjit/SelectorCompiler.cpp

    r167571 r167574  
    191191    void generateElementIsLink(Assembler::JumpList& failureCases);
    192192    void generateElementIsNthChild(Assembler::JumpList& failureCases, const SelectorFragment&);
     193    void generateElementIsTarget(Assembler::JumpList& failureCases);
    193194
    194195    // Helpers.
     
    319320
    320321    case CSSSelector::PseudoClassLink:
     322    case CSSSelector::PseudoClassTarget:
    321323        fragment.pseudoClasses.add(type);
    322324        return FunctionType::SimpleSelectorChecker;
     
    11671169        generateElementIsLink(failureCases);
    11681170
     1171    if (fragment.pseudoClasses.contains(CSSSelector::PseudoTarget))
     1172        generateElementIsTarget(failureCases);
     1173
    11691174    if (fragment.tagName)
    11701175        generateElementHasTagName(failureCases, *(fragment.tagName));
     
    15131518}
    15141519
     1520static void getDocument(Assembler& assembler, Assembler::RegisterID element, Assembler::RegisterID output)
     1521{
     1522    assembler.loadPtr(Assembler::Address(element, Node::treeScopeMemoryOffset()), output);
     1523    assembler.loadPtr(Assembler::Address(output, TreeScope::documentScopeMemoryOffset()), output);
     1524}
     1525
    15151526void SelectorCodeGenerator::generateElementAttributeValueExactMatching(Assembler::JumpList& failureCases, Assembler::RegisterID currentAttributeAddress, const AtomicString& expectedValue, bool canDefaultToCaseSensitiveValueMatch)
    15161527{
     
    15291540
    15301541        {
    1531             LocalRegister scratchRegister(m_registerAllocator);
    1532             // scratchRegister = pointer to treeScope.
    1533             m_assembler.loadPtr(Assembler::Address(elementAddressRegister, Node::treeScopeMemoryOffset()), scratchRegister);
    1534             // scratchRegister = pointer to document.
    1535             m_assembler.loadPtr(Assembler::Address(scratchRegister, TreeScope::documentScopeMemoryOffset()), scratchRegister);
    1536             failureCases.append(testIsHTMLClassOnDocument(Assembler::Zero, m_assembler, scratchRegister));
     1542            LocalRegister document(m_registerAllocator);
     1543            getDocument(m_assembler, elementAddressRegister, document);
     1544            failureCases.append(testIsHTMLClassOnDocument(Assembler::Zero, m_assembler, document));
    15371545        }
    15381546
     
    20362044}
    20372045
     2046void SelectorCodeGenerator::generateElementIsTarget(Assembler::JumpList& failureCases)
     2047{
     2048    LocalRegister document(m_registerAllocator);
     2049    getDocument(m_assembler, elementAddressRegister, document);
     2050    failureCases.append(m_assembler.branchPtr(Assembler::NotEqual, Assembler::Address(document, Document::cssTargetMemoryOffset()), elementAddressRegister));
     2051}
     2052
    20382053}; // namespace SelectorCompiler.
    20392054}; // namespace WebCore.
  • trunk/Source/WebCore/dom/Document.h

    r167497 r167574  
    756756    void setCSSTarget(Element*);
    757757    Element* cssTarget() const { return m_cssTarget; }
    758    
     758    static ptrdiff_t cssTargetMemoryOffset() { return OBJECT_OFFSETOF(Document, m_cssTarget); }
     759
    759760    void scheduleForcedStyleRecalc();
    760761    void scheduleStyleRecalc();
Note: See TracChangeset for help on using the changeset viewer.