Changeset 161839 in webkit
- Timestamp:
- Jan 12, 2014 3:04:19 PM (10 years ago)
- Location:
- trunk
- Files:
-
- 12 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r161814 r161839 1 2014-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 1 23 2014-01-12 Andreas Kling <akling@apple.com> 2 24 -
trunk/Source/WebCore/ChangeLog
r161838 r161839 1 2014-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 1 24 2014-01-12 Anders Carlsson <andersca@apple.com> 2 25 -
trunk/Source/WebCore/cssjit/SelectorCompiler.h
r160983 r161839 30 30 31 31 #include "SelectorChecker.h" 32 #include <JavaScriptCore/MacroAssemblerCodeRef.h> 32 33 33 34 namespace JSC { -
trunk/Source/WebCore/dom/SelectorQuery.cpp
r161196 r161839 267 267 } 268 268 269 #if ENABLE(CSS_SELECTOR_JIT) 270 template <typename SelectorQueryTrait> 271 ALWAYS_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 282 template <typename SelectorQueryTrait> 283 ALWAYS_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 269 295 template <typename SelectorQueryTrait> 270 296 ALWAYS_INLINE void SelectorDataList::execute(ContainerNode& rootNode, typename SelectorQueryTrait::OutputType& output) const … … 278 304 else if (isSingleClassNameSelector(*selectorData.selector)) 279 305 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 281 331 executeSingleSelectorData<SelectorQueryTrait>(rootNode, selectorData, output); 332 } 282 333 return; 283 334 } -
trunk/Source/WebCore/dom/SelectorQuery.h
r157354 r161839 29 29 #include "CSSSelectorList.h" 30 30 #include "NodeList.h" 31 #include "SelectorCompiler.h" 31 32 #include <wtf/HashMap.h> 32 33 #include <wtf/Vector.h> … … 56 57 const CSSSelector* selector; 57 58 bool isFastCheckable; 59 60 #if ENABLE(CSS_SELECTOR_JIT) 61 mutable SelectorCompilationStatus compilationStatus; 62 mutable JSC::MacroAssemblerCodeRef compiledSelectorCodeRef; 63 #endif // ENABLE(CSS_SELECTOR_JIT) 58 64 }; 59 65 … … 66 72 template <typename SelectorQueryTrait> void executeSingleSelectorData(const ContainerNode& rootNode, const SelectorData&, typename SelectorQueryTrait::OutputType&) const; 67 73 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) 68 78 69 79 Vector<SelectorData> m_selectors;
Note: See TracChangeset
for help on using the changeset viewer.