Title: [164965] trunk/Source/WebCore
Revision
164965
Author
[email protected]
Date
2014-03-02 19:24:58 -0800 (Sun, 02 Mar 2014)

Log Message

Unreviewed, rolling out r164961.
http://trac.webkit.org/changeset/164961
https://bugs.webkit.org/show_bug.cgi?id=129596

Caused many assertion failures (Requested by ap on #webkit).

* css/SelectorChecker.cpp:
(WebCore::attributeValueMatches):
* cssjit/SelectorCompiler.cpp:
(WebCore::SelectorCompiler::SelectorCodeGenerator::SelectorCodeGenerator):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementAttributeValueMatching):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (164964 => 164965)


--- trunk/Source/WebCore/ChangeLog	2014-03-03 02:30:37 UTC (rev 164964)
+++ trunk/Source/WebCore/ChangeLog	2014-03-03 03:24:58 UTC (rev 164965)
@@ -1,3 +1,17 @@
+2014-03-02  Commit Queue  <[email protected]>
+
+        Unreviewed, rolling out r164961.
+        http://trac.webkit.org/changeset/164961
+        https://bugs.webkit.org/show_bug.cgi?id=129596
+
+        Caused many assertion failures (Requested by ap on #webkit).
+
+        * css/SelectorChecker.cpp:
+        (WebCore::attributeValueMatches):
+        * cssjit/SelectorCompiler.cpp:
+        (WebCore::SelectorCompiler::SelectorCodeGenerator::SelectorCodeGenerator):
+        (WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementAttributeValueMatching):
+
 2014-03-02  Darin Adler  <[email protected]>
 
         Streamline use of TextIterator, cutting down includes and use of soon-to-be-deleted functions

Modified: trunk/Source/WebCore/css/SelectorChecker.cpp (164964 => 164965)


--- trunk/Source/WebCore/css/SelectorChecker.cpp	2014-03-03 02:30:37 UTC (rev 164964)
+++ trunk/Source/WebCore/css/SelectorChecker.cpp	2014-03-03 03:24:58 UTC (rev 164965)
@@ -280,12 +280,10 @@
     ASSERT(!value.isNull());
 
     switch (match) {
-    case CSSSelector::Set:
-        return true;
     case CSSSelector::Exact:
         if (caseSensitive ? selectorValue != value : !equalIgnoringCase(selectorValue, value))
             return false;
-        return true;
+        break;
     case CSSSelector::List:
         {
             // Ignore empty selectors or selectors containing spaces
@@ -306,20 +304,20 @@
                 // No match. Keep looking.
                 startSearchAt = foundPos + 1;
             }
-            return true;
+            break;
         }
     case CSSSelector::Contain:
         if (!value.contains(selectorValue, caseSensitive) || selectorValue.isEmpty())
             return false;
-        return true;
+        break;
     case CSSSelector::Begin:
         if (!value.startsWith(selectorValue, caseSensitive) || selectorValue.isEmpty())
             return false;
-        return true;
+        break;
     case CSSSelector::End:
         if (!value.endsWith(selectorValue, caseSensitive) || selectorValue.isEmpty())
             return false;
-        return true;
+        break;
     case CSSSelector::Hyphen:
         if (value.length() < selectorValue.length())
             return false;
@@ -328,11 +326,14 @@
         // It they start the same, check for exact match or following '-':
         if (value.length() != selectorValue.length() && value[selectorValue.length()] != '-')
             return false;
-        return true;
+        break;
+    case CSSSelector::PseudoClass:
+    case CSSSelector::PseudoElement:
     default:
-        ASSERT_NOT_REACHED();
-        return false;
+        break;
     }
+
+    return true;
 }
 
 static bool anyAttributeMatches(Element* element, const CSSSelector* selector, const QualifiedName& selectorAttr, bool caseSensitive)

Modified: trunk/Source/WebCore/cssjit/SelectorCompiler.cpp (164964 => 164965)


--- trunk/Source/WebCore/cssjit/SelectorCompiler.cpp	2014-03-03 02:30:37 UTC (rev 164964)
+++ trunk/Source/WebCore/cssjit/SelectorCompiler.cpp	2014-03-03 03:24:58 UTC (rev 164965)
@@ -175,7 +175,6 @@
     void generateElementAttributeMatching(Assembler::JumpList& failureCases, Assembler::RegisterID currentAttributeAddress, Assembler::RegisterID decIndexRegister, const AttributeMatchingInfo& attributeInfo);
     void generateElementAttributeValueMatching(Assembler::JumpList& failureCases, Assembler::RegisterID currentAttributeAddress, const AttributeMatchingInfo& attributeInfo);
     void generateElementAttributeValueExactMatching(Assembler::JumpList& failureCases, Assembler::RegisterID currentAttributeAddress, const AtomicString& expectedValue, bool caseSensitive);
-    void generateElementAttributeFunctionCallValueMatching(Assembler::JumpList& failureCases, Assembler::RegisterID currentAttributeAddress, const AtomicString& expectedValue, bool caseSensitive, JSC::FunctionPtr caseSensitiveTest, JSC::FunctionPtr caseInsensitiveTest);
     void generateElementHasTagName(Assembler::JumpList& failureCases, const QualifiedName& nameToMatch);
     void generateElementHasId(Assembler::JumpList& failureCases, const LocalRegister& elementDataAddress, const AtomicString& idToMatch);
     void generateElementHasClasses(Assembler::JumpList& failureCases, const LocalRegister& elementDataAddress, const Vector<const AtomicStringImpl*>& classNames);
@@ -349,29 +348,19 @@
             if (m_functionType == FunctionType::CannotCompile || m_functionType == FunctionType::CannotMatchAnything)
                 return;
             break;
-        case CSSSelector::List:
-            if (selector->value().contains(' ')) {
-                m_functionType = FunctionType::CannotMatchAnything;
-                return;
-            }
-            FALLTHROUGH;
-        case CSSSelector::Begin:
-        case CSSSelector::End:
-        case CSSSelector::Contain:
-            if (selector->value().isEmpty()) {
-                m_functionType = FunctionType::CannotMatchAnything;
-                return;
-            }
-            FALLTHROUGH;
         case CSSSelector::Exact:
-        case CSSSelector::Hyphen:
             fragment.attributes.append(AttributeMatchingInfo(selector, HTMLDocument::isCaseSensitiveAttribute(selector->attribute())));
             break;
         case CSSSelector::Set:
             fragment.attributes.append(AttributeMatchingInfo(selector, true));
             break;
         case CSSSelector::Unknown:
+        case CSSSelector::List:
+        case CSSSelector::Hyphen:
         case CSSSelector::PseudoElement:
+        case CSSSelector::Contain:
+        case CSSSelector::Begin:
+        case CSSSelector::End:
         case CSSSelector::PagePseudoClass:
             goto CannotHandleSelector;
         }
@@ -1192,112 +1181,17 @@
     localFailureCases.linkTo(loopReEntry, &m_assembler);
 }
 
-enum CaseSensitivity {
-    CaseSensitive,
-    CaseInsensitive
-};
-
-template<CaseSensitivity caseSensitivity>
-static bool attributeValueBeginsWith(const Attribute* attribute, AtomicStringImpl* expectedString)
-{
-    AtomicStringImpl& valueImpl = *attribute->value().impl();
-    if (caseSensitivity == CaseSensitive)
-        return valueImpl.startsWith(expectedString);
-    return valueImpl.startsWith(expectedString, false);
-}
-
-template<CaseSensitivity caseSensitivity>
-static bool attributeValueContains(const Attribute* attribute, AtomicStringImpl* expectedString)
-{
-    AtomicStringImpl& valueImpl = *attribute->value().impl();
-    if (caseSensitivity == CaseSensitive)
-        return valueImpl.find(expectedString) != notFound;
-    return valueImpl.findIgnoringCase(expectedString) != notFound;
-}
-
-template<CaseSensitivity caseSensitivity>
-static bool attributeValueEndsWith(const Attribute* attribute, AtomicStringImpl* expectedString)
-{
-    AtomicStringImpl& valueImpl = *attribute->value().impl();
-    if (caseSensitivity == CaseSensitive)
-        return valueImpl.endsWith(expectedString);
-    return valueImpl.endsWith(expectedString, false);
-}
-
-template<CaseSensitivity caseSensitivity>
-static bool attributeValueMatchHyphenRule(const Attribute* attribute, AtomicStringImpl* expectedString)
-{
-    AtomicStringImpl& valueImpl = *attribute->value().impl();
-    if (valueImpl.length() < expectedString->length())
-        return false;
-
-    bool valueStartsWithExpectedString;
-    if (caseSensitivity == CaseSensitive)
-        valueStartsWithExpectedString = valueImpl.startsWith(expectedString);
-    else
-        valueStartsWithExpectedString = valueImpl.startsWith(expectedString, false);
-
-    if (!valueStartsWithExpectedString)
-        return false;
-
-    return valueImpl.length() == expectedString->length() || valueImpl[expectedString->length()] == '-';
-}
-
-template<CaseSensitivity caseSensitivity>
-static bool attributeValueSpaceSeparetedListContains(const Attribute* attribute, AtomicStringImpl* expectedString)
-{
-    AtomicStringImpl& value = *attribute->value().impl();
-
-    unsigned startSearchAt = 0;
-    while (true) {
-        size_t expectedStringPosition;
-        if (caseSensitivity == CaseSensitive)
-            expectedStringPosition = value.find(expectedString, startSearchAt);
-        else
-            expectedStringPosition = value.findIgnoringCase(expectedString, startSearchAt);
-        if (expectedStringPosition == notFound)
-            return false;
-        if (!expectedStringPosition || value[expectedStringPosition - 1] == ' ') {
-            unsigned positionAfterExpectedString = expectedStringPosition + expectedString->length();
-            if (positionAfterExpectedString == value.length() || value[positionAfterExpectedString] == ' ')
-                return true;
-        }
-        startSearchAt = expectedStringPosition + 1;
-    }
-    return false;
-}
-
 void SelectorCodeGenerator::generateElementAttributeValueMatching(Assembler::JumpList& failureCases, Assembler::RegisterID currentAttributeAddress, const AttributeMatchingInfo& attributeInfo)
 {
     const CSSSelector& attributeSelector = attributeInfo.selector();
+    if (attributeSelector.m_match == CSSSelector::Set)
+        return;
+
     const AtomicString& expectedValue = attributeSelector.value();
     ASSERT(!expectedValue.isNull());
-    bool defaultToCaseSensitiveValueMatch = attributeInfo.canDefaultToCaseSensitiveValueMatch();
 
-    switch (attributeSelector.m_match) {
-    case CSSSelector::Begin:
-        generateElementAttributeFunctionCallValueMatching(failureCases, currentAttributeAddress, expectedValue, defaultToCaseSensitiveValueMatch, attributeValueBeginsWith<CaseSensitive>, attributeValueBeginsWith<CaseInsensitive>);
-        break;
-    case CSSSelector::Contain:
-        generateElementAttributeFunctionCallValueMatching(failureCases, currentAttributeAddress, expectedValue, defaultToCaseSensitiveValueMatch, attributeValueContains<CaseSensitive>, attributeValueContains<CaseInsensitive>);
-        break;
-    case CSSSelector::End:
-        generateElementAttributeFunctionCallValueMatching(failureCases, currentAttributeAddress, expectedValue, defaultToCaseSensitiveValueMatch, attributeValueEndsWith<CaseSensitive>, attributeValueEndsWith<CaseInsensitive>);
-        break;
-    case CSSSelector::Exact:
-        generateElementAttributeValueExactMatching(failureCases, currentAttributeAddress, expectedValue, defaultToCaseSensitiveValueMatch);
-        break;
-    case CSSSelector::Hyphen:
-        generateElementAttributeFunctionCallValueMatching(failureCases, currentAttributeAddress, expectedValue, defaultToCaseSensitiveValueMatch, attributeValueMatchHyphenRule<CaseSensitive>, attributeValueMatchHyphenRule<CaseInsensitive>);
-        break;
-    case CSSSelector::List:
-        generateElementAttributeFunctionCallValueMatching(failureCases, currentAttributeAddress, expectedValue, defaultToCaseSensitiveValueMatch, attributeValueSpaceSeparetedListContains<CaseSensitive>, attributeValueSpaceSeparetedListContains<CaseInsensitive>);
-        break;
-    case CSSSelector::Set:
-        break;
-    default:
-        ASSERT_NOT_REACHED();
-    }
+    RELEASE_ASSERT(attributeSelector.m_match == CSSSelector::Exact);
+    generateElementAttributeValueExactMatching(failureCases, currentAttributeAddress, expectedValue, attributeInfo.canDefaultToCaseSensitiveValueMatch());
 }
 
 static inline Assembler::Jump testIsHTMLClassOnDocument(Assembler::ResultCondition condition, Assembler& assembler, Assembler::RegisterID documentAddress)
@@ -1341,49 +1235,6 @@
     }
 }
 
-void SelectorCodeGenerator::generateElementAttributeFunctionCallValueMatching(Assembler::JumpList& failureCases, Assembler::RegisterID currentAttributeAddress, const AtomicString& expectedValue, bool canDefaultToCaseSensitiveValueMatch, JSC::FunctionPtr caseSensitiveTest, JSC::FunctionPtr caseInsensitiveTest)
-{
-    LocalRegister expectedValueRegister(m_registerAllocator);
-    m_assembler.move(Assembler::TrustedImmPtr(expectedValue.impl()), expectedValueRegister);
-
-    if (canDefaultToCaseSensitiveValueMatch) {
-        FunctionCall functionCall(m_assembler, m_registerAllocator, m_stackAllocator, m_functionCalls);
-        functionCall.setFunctionAddress(caseSensitiveTest);
-        functionCall.setTwoArguments(currentAttributeAddress, expectedValueRegister);
-        failureCases.append(functionCall.callAndBranchOnCondition(Assembler::Zero));
-    } else {
-        Assembler::JumpList shouldUseCaseSensitiveComparison;
-        shouldUseCaseSensitiveComparison.append(testIsHTMLFlagOnNode(Assembler::Zero, m_assembler, elementAddressRegister));
-        {
-            LocalRegister scratchRegister(m_registerAllocator);
-            // scratchRegister = pointer to treeScope.
-            m_assembler.loadPtr(Assembler::Address(elementAddressRegister, Node::treeScopeMemoryOffset()), scratchRegister);
-            // scratchRegister = pointer to document.
-            m_assembler.loadPtr(Assembler::Address(scratchRegister, TreeScope::documentScopeMemoryOffset()), scratchRegister);
-            shouldUseCaseSensitiveComparison.append(testIsHTMLClassOnDocument(Assembler::Zero, m_assembler, scratchRegister));
-        }
-
-        {
-            FunctionCall functionCall(m_assembler, m_registerAllocator, m_stackAllocator, m_functionCalls);
-            functionCall.setFunctionAddress(caseInsensitiveTest);
-            functionCall.setTwoArguments(currentAttributeAddress, expectedValueRegister);
-            failureCases.append(functionCall.callAndBranchOnCondition(Assembler::Zero));
-        }
-
-        Assembler::Jump skipCaseSensitiveCase = m_assembler.jump();
-
-        {
-            shouldUseCaseSensitiveComparison.link(&m_assembler);
-            FunctionCall functionCall(m_assembler, m_registerAllocator, m_stackAllocator, m_functionCalls);
-            functionCall.setFunctionAddress(caseSensitiveTest);
-            functionCall.setTwoArguments(currentAttributeAddress, expectedValueRegister);
-            failureCases.append(functionCall.callAndBranchOnCondition(Assembler::Zero));
-        }
-
-        skipCaseSensitiveCase.link(&m_assembler);
-    }
-}
-
 void SelectorCodeGenerator::generateElementFunctionCallTest(Assembler::JumpList& failureCases, JSC::FunctionPtr testFunction)
 {
     Assembler::RegisterID elementAddress = elementAddressRegister;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to