Changeset 161839 in webkit


Ignore:
Timestamp:
Jan 12, 2014 3:04:19 PM (10 years ago)
Author:
benjamin@webkit.org
Message:

Use the Selector Code Generator for matching in SelectorQuery
https://bugs.webkit.org/show_bug.cgi?id=126185

Reviewed by Ryosuke Niwa.

Source/WebCore:

Compile selectors on demand and use the generated binary to perform
element matching in SelectorQuery.

Tests: fast/selectors/querySelector-long-adjacent-backtracking.html

fast/selectors/querySelector-long-child-backtracking.html
fast/selectors/querySelector-mixed-child-adjacent-backtracking.html
fast/selectors/querySelector-multiple-simple-child-backtracking.html
fast/selectors/querySelector-simple-adjacent-backtracking.html
fast/selectors/querySelector-simple-child-backtracking.html

  • dom/SelectorQuery.cpp:

(WebCore::SelectorDataList::executeCompiledSimpleSelectorChecker):
(WebCore::SelectorDataList::executeCompiledSelectorCheckerWithContext):
(WebCore::SelectorDataList::execute):

  • dom/SelectorQuery.h:

LayoutTests:

Add some tests for longer backtracking cases typically not covered by the other tests.

  • fast/selectors/querySelector-long-adjacent-backtracking-expected.txt: Added.
  • fast/selectors/querySelector-long-adjacent-backtracking.html: Added.
  • fast/selectors/querySelector-long-child-backtracking-expected.txt: Added.
  • fast/selectors/querySelector-long-child-backtracking.html: Added.
  • fast/selectors/querySelector-mixed-child-adjacent-backtracking-expected.txt: Added.
  • fast/selectors/querySelector-mixed-child-adjacent-backtracking.html: Added.
  • fast/selectors/querySelector-multiple-simple-child-backtracking-expected.txt: Added.
  • fast/selectors/querySelector-multiple-simple-child-backtracking.html: Added.
  • fast/selectors/querySelector-simple-adjacent-backtracking-expected.txt: Added.
  • fast/selectors/querySelector-simple-adjacent-backtracking.html: Added.
  • fast/selectors/querySelector-simple-child-backtracking-expected.txt: Added.
  • fast/selectors/querySelector-simple-child-backtracking.html: Added.
Location:
trunk
Files:
12 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r161814 r161839  
     12014-01-12  Benjamin Poulain  <benjamin@webkit.org>
     2
     3        Use the Selector Code Generator for matching in SelectorQuery
     4        https://bugs.webkit.org/show_bug.cgi?id=126185
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        Add some tests for longer backtracking cases typically not covered by the other tests.
     9
     10        * fast/selectors/querySelector-long-adjacent-backtracking-expected.txt: Added.
     11        * fast/selectors/querySelector-long-adjacent-backtracking.html: Added.
     12        * fast/selectors/querySelector-long-child-backtracking-expected.txt: Added.
     13        * fast/selectors/querySelector-long-child-backtracking.html: Added.
     14        * fast/selectors/querySelector-mixed-child-adjacent-backtracking-expected.txt: Added.
     15        * fast/selectors/querySelector-mixed-child-adjacent-backtracking.html: Added.
     16        * fast/selectors/querySelector-multiple-simple-child-backtracking-expected.txt: Added.
     17        * fast/selectors/querySelector-multiple-simple-child-backtracking.html: Added.
     18        * fast/selectors/querySelector-simple-adjacent-backtracking-expected.txt: Added.
     19        * fast/selectors/querySelector-simple-adjacent-backtracking.html: Added.
     20        * fast/selectors/querySelector-simple-child-backtracking-expected.txt: Added.
     21        * fast/selectors/querySelector-simple-child-backtracking.html: Added.
     22
    1232014-01-12  Andreas Kling  <akling@apple.com>
    224
  • trunk/Source/WebCore/ChangeLog

    r161838 r161839  
     12014-01-12  Benjamin Poulain  <benjamin@webkit.org>
     2
     3        Use the Selector Code Generator for matching in SelectorQuery
     4        https://bugs.webkit.org/show_bug.cgi?id=126185
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        Compile selectors on demand and use the generated binary to perform
     9        element matching in SelectorQuery.
     10
     11        Tests: fast/selectors/querySelector-long-adjacent-backtracking.html
     12               fast/selectors/querySelector-long-child-backtracking.html
     13               fast/selectors/querySelector-mixed-child-adjacent-backtracking.html
     14               fast/selectors/querySelector-multiple-simple-child-backtracking.html
     15               fast/selectors/querySelector-simple-adjacent-backtracking.html
     16               fast/selectors/querySelector-simple-child-backtracking.html
     17
     18        * dom/SelectorQuery.cpp:
     19        (WebCore::SelectorDataList::executeCompiledSimpleSelectorChecker):
     20        (WebCore::SelectorDataList::executeCompiledSelectorCheckerWithContext):
     21        (WebCore::SelectorDataList::execute):
     22        * dom/SelectorQuery.h:
     23
    1242014-01-12  Anders Carlsson  <andersca@apple.com>
    225
  • trunk/Source/WebCore/cssjit/SelectorCompiler.h

    r160983 r161839  
    3030
    3131#include "SelectorChecker.h"
     32#include <JavaScriptCore/MacroAssemblerCodeRef.h>
    3233
    3334namespace JSC {
  • trunk/Source/WebCore/dom/SelectorQuery.cpp

    r161196 r161839  
    267267}
    268268
     269#if ENABLE(CSS_SELECTOR_JIT)
     270template <typename SelectorQueryTrait>
     271ALWAYS_INLINE void SelectorDataList::executeCompiledSimpleSelectorChecker(const ContainerNode& rootNode, SelectorCompiler::SimpleSelectorChecker selectorChecker, typename SelectorQueryTrait::OutputType& output) const
     272{
     273    for (auto& element : elementDescendants(const_cast<ContainerNode&>(rootNode))) {
     274        if (selectorChecker(&element)) {
     275            SelectorQueryTrait::appendOutputForElement(output, &element);
     276            if (SelectorQueryTrait::shouldOnlyMatchFirstElement)
     277                return;
     278        }
     279    }
     280}
     281
     282template <typename SelectorQueryTrait>
     283ALWAYS_INLINE void SelectorDataList::executeCompiledSelectorCheckerWithContext(const ContainerNode& rootNode, SelectorCompiler::SelectorCheckerWithCheckingContext selectorChecker, const SelectorCompiler::CheckingContext& context, typename SelectorQueryTrait::OutputType& output) const
     284{
     285    for (auto& element : elementDescendants(const_cast<ContainerNode&>(rootNode))) {
     286        if (selectorChecker(&element, &context)) {
     287            SelectorQueryTrait::appendOutputForElement(output, &element);
     288            if (SelectorQueryTrait::shouldOnlyMatchFirstElement)
     289                return;
     290        }
     291    }
     292}
     293#endif // ENABLE(CSS_SELECTOR_JIT)
     294
    269295template <typename SelectorQueryTrait>
    270296ALWAYS_INLINE void SelectorDataList::execute(ContainerNode& rootNode, typename SelectorQueryTrait::OutputType& output) const
     
    278304        else if (isSingleClassNameSelector(*selectorData.selector))
    279305            executeSingleClassNameSelectorData<SelectorQueryTrait>(rootNode, selectorData, output);
    280         else
     306        else {
     307#if ENABLE(CSS_SELECTOR_JIT)
     308            void* compiledSelectorChecker = selectorData.compiledSelectorCodeRef.code().executableAddress();
     309            if (!compiledSelectorChecker && selectorData.compilationStatus == SelectorCompilationStatus::NotCompiled) {
     310                JSC::VM* vm = rootNode.document().scriptExecutionContext()->vm();
     311                selectorData.compilationStatus = SelectorCompiler::compileSelector(selectorData.selector, vm, selectorData.compiledSelectorCodeRef);
     312            }
     313
     314            if (compiledSelectorChecker) {
     315                if (selectorData.compilationStatus == SelectorCompilationStatus::SimpleSelectorChecker) {
     316                    SelectorCompiler::SimpleSelectorChecker selectorChecker = SelectorCompiler::simpleSelectorCheckerFunction(compiledSelectorChecker, selectorData.compilationStatus);
     317                    executeCompiledSimpleSelectorChecker<SelectorQueryTrait>(rootNode, selectorChecker, output);
     318                } else {
     319                    ASSERT(selectorData.compilationStatus == SelectorCompilationStatus::SelectorCheckerWithCheckingContext);
     320                    SelectorCompiler::SelectorCheckerWithCheckingContext selectorChecker = SelectorCompiler::selectorCheckerFunctionWithCheckingContext(compiledSelectorChecker, selectorData.compilationStatus);
     321
     322                    SelectorCompiler::CheckingContext context;
     323                    context.elementStyle = nullptr;
     324                    context.resolvingMode = SelectorChecker::QueryingRules;
     325                    executeCompiledSelectorCheckerWithContext<SelectorQueryTrait>(rootNode, selectorChecker, context, output);
     326                }
     327                return;
     328            }
     329#endif // ENABLE(CSS_SELECTOR_JIT)
     330
    281331            executeSingleSelectorData<SelectorQueryTrait>(rootNode, selectorData, output);
     332        }
    282333        return;
    283334    }
  • trunk/Source/WebCore/dom/SelectorQuery.h

    r157354 r161839  
    2929#include "CSSSelectorList.h"
    3030#include "NodeList.h"
     31#include "SelectorCompiler.h"
    3132#include <wtf/HashMap.h>
    3233#include <wtf/Vector.h>
     
    5657        const CSSSelector* selector;
    5758        bool isFastCheckable;
     59
     60#if ENABLE(CSS_SELECTOR_JIT)
     61        mutable SelectorCompilationStatus compilationStatus;
     62        mutable JSC::MacroAssemblerCodeRef compiledSelectorCodeRef;
     63#endif // ENABLE(CSS_SELECTOR_JIT)
    5864    };
    5965
     
    6672    template <typename SelectorQueryTrait> void executeSingleSelectorData(const ContainerNode& rootNode, const SelectorData&, typename SelectorQueryTrait::OutputType&) const;
    6773    template <typename SelectorQueryTrait> void executeSingleMultiSelectorData(const ContainerNode& rootNode, typename SelectorQueryTrait::OutputType&) const;
     74#if ENABLE(CSS_SELECTOR_JIT)
     75    template <typename SelectorQueryTrait> void executeCompiledSimpleSelectorChecker(const ContainerNode& rootNode, SelectorCompiler::SimpleSelectorChecker, typename SelectorQueryTrait::OutputType&) const;
     76    template <typename SelectorQueryTrait> void executeCompiledSelectorCheckerWithContext(const ContainerNode& rootNode, SelectorCompiler::SelectorCheckerWithCheckingContext, const SelectorCompiler::CheckingContext&, typename SelectorQueryTrait::OutputType&) const;
     77#endif // ENABLE(CSS_SELECTOR_JIT)
    6878
    6979    Vector<SelectorData> m_selectors;
Note: See TracChangeset for help on using the changeset viewer.