diff options
Diffstat (limited to 'Source/JavaScriptCore/yarr/YarrPattern.cpp')
-rw-r--r-- | Source/JavaScriptCore/yarr/YarrPattern.cpp | 63 |
1 files changed, 30 insertions, 33 deletions
diff --git a/Source/JavaScriptCore/yarr/YarrPattern.cpp b/Source/JavaScriptCore/yarr/YarrPattern.cpp index 00339b755..7ed9d3c30 100644 --- a/Source/JavaScriptCore/yarr/YarrPattern.cpp +++ b/Source/JavaScriptCore/yarr/YarrPattern.cpp @@ -175,16 +175,16 @@ public: } - std::unique_ptr<CharacterClass> charClass() + PassOwnPtr<CharacterClass> charClass() { - auto characterClass = std::make_unique<CharacterClass>(); + OwnPtr<CharacterClass> characterClass = adoptPtr(new CharacterClass); characterClass->m_matches.swap(m_matches); characterClass->m_ranges.swap(m_ranges); characterClass->m_matchesUnicode.swap(m_matchesUnicode); characterClass->m_rangesUnicode.swap(m_rangesUnicode); - return characterClass; + return characterClass.release(); } private: @@ -274,10 +274,10 @@ public: , m_characterClassConstructor(pattern.m_ignoreCase) , m_invertParentheticalAssertion(false) { - auto body = std::make_unique<PatternDisjunction>(); + OwnPtr<PatternDisjunction> body = adoptPtr(new PatternDisjunction); m_pattern.m_body = body.get(); m_alternative = body->addNewAlternative(); - m_pattern.m_disjunctions.append(WTFMove(body)); + m_pattern.m_disjunctions.append(body.release()); } ~YarrPatternConstructor() @@ -289,15 +289,15 @@ public: m_pattern.reset(); m_characterClassConstructor.reset(); - auto body = std::make_unique<PatternDisjunction>(); + OwnPtr<PatternDisjunction> body = adoptPtr(new PatternDisjunction); m_pattern.m_body = body.get(); m_alternative = body->addNewAlternative(); - m_pattern.m_disjunctions.append(WTFMove(body)); + m_pattern.m_disjunctions.append(body.release()); } void assertionBOL() { - if (!m_alternative->m_terms.size() && !m_invertParentheticalAssertion) { + if (!m_alternative->m_terms.size() & !m_invertParentheticalAssertion) { m_alternative->m_startsWithBOL = true; m_alternative->m_containsBOL = true; m_pattern.m_containsBOL = true; @@ -329,9 +329,9 @@ public: } m_characterClassConstructor.putUnicodeIgnoreCase(ch, info); - auto newCharacterClass = m_characterClassConstructor.charClass(); + OwnPtr<CharacterClass> newCharacterClass = m_characterClassConstructor.charClass(); m_alternative->m_terms.append(PatternTerm(newCharacterClass.get(), false)); - m_pattern.m_userCharacterClasses.append(WTFMove(newCharacterClass)); + m_pattern.m_userCharacterClasses.append(newCharacterClass.release()); } void atomBuiltInCharacterClass(BuiltInCharacterClassID classID, bool invert) @@ -391,9 +391,9 @@ public: void atomCharacterClassEnd() { - auto newCharacterClass = m_characterClassConstructor.charClass(); + OwnPtr<CharacterClass> newCharacterClass = m_characterClassConstructor.charClass(); m_alternative->m_terms.append(PatternTerm(newCharacterClass.get(), m_invertCharacterClass)); - m_pattern.m_userCharacterClasses.append(WTFMove(newCharacterClass)); + m_pattern.m_userCharacterClasses.append(newCharacterClass.release()); } void atomParenthesesSubpatternBegin(bool capture = true) @@ -402,19 +402,19 @@ public: if (capture) m_pattern.m_numSubpatterns++; - auto parenthesesDisjunction = std::make_unique<PatternDisjunction>(m_alternative); + OwnPtr<PatternDisjunction> parenthesesDisjunction = adoptPtr(new PatternDisjunction(m_alternative)); m_alternative->m_terms.append(PatternTerm(PatternTerm::TypeParenthesesSubpattern, subpatternId, parenthesesDisjunction.get(), capture, false)); m_alternative = parenthesesDisjunction->addNewAlternative(); - m_pattern.m_disjunctions.append(WTFMove(parenthesesDisjunction)); + m_pattern.m_disjunctions.append(parenthesesDisjunction.release()); } void atomParentheticalAssertionBegin(bool invert = false) { - auto parenthesesDisjunction = std::make_unique<PatternDisjunction>(m_alternative); + OwnPtr<PatternDisjunction> parenthesesDisjunction = adoptPtr(new PatternDisjunction(m_alternative)); m_alternative->m_terms.append(PatternTerm(PatternTerm::TypeParentheticalAssertion, m_pattern.m_numSubpatterns + 1, parenthesesDisjunction.get(), false, invert)); m_alternative = parenthesesDisjunction->addNewAlternative(); m_invertParentheticalAssertion = invert; - m_pattern.m_disjunctions.append(WTFMove(parenthesesDisjunction)); + m_pattern.m_disjunctions.append(parenthesesDisjunction.release()); } void atomParenthesesEnd() @@ -479,12 +479,12 @@ public: // skip alternatives with m_startsWithBOL set true. PatternDisjunction* copyDisjunction(PatternDisjunction* disjunction, bool filterStartsWithBOL = false) { - std::unique_ptr<PatternDisjunction> newDisjunction; + OwnPtr<PatternDisjunction> newDisjunction; for (unsigned alt = 0; alt < disjunction->m_alternatives.size(); ++alt) { PatternAlternative* alternative = disjunction->m_alternatives[alt].get(); if (!filterStartsWithBOL || !alternative->m_startsWithBOL) { if (!newDisjunction) { - newDisjunction = std::make_unique<PatternDisjunction>(); + newDisjunction = adoptPtr(new PatternDisjunction()); newDisjunction->m_parent = disjunction->m_parent; } PatternAlternative* newAlternative = newDisjunction->addNewAlternative(); @@ -498,7 +498,7 @@ public: return 0; PatternDisjunction* copiedDisjunction = newDisjunction.get(); - m_pattern.m_disjunctions.append(WTFMove(newDisjunction)); + m_pattern.m_disjunctions.append(newDisjunction.release()); return copiedDisjunction; } @@ -666,8 +666,6 @@ public: minimumInputSize = std::min(minimumInputSize, alternative->m_minimumSize); maximumCallFrameSize = std::max(maximumCallFrameSize, currentAlternativeCallFrameSize); hasFixedSize &= alternative->m_hasFixedSize; - if (alternative->m_minimumSize > INT_MAX) - m_pattern.m_containsUnsignedLengthPattern = true; } ASSERT(minimumInputSize != UINT_MAX); @@ -698,7 +696,7 @@ public: if (m_pattern.m_numSubpatterns) return; - Vector<std::unique_ptr<PatternAlternative>>& alternatives = m_pattern.m_body->m_alternatives; + Vector<OwnPtr<PatternAlternative>>& alternatives = m_pattern.m_body->m_alternatives; for (size_t i = 0; i < alternatives.size(); ++i) { Vector<PatternTerm>& terms = alternatives[i]->m_terms; if (terms.size()) { @@ -739,12 +737,11 @@ public: } } - bool containsCapturingTerms(PatternAlternative* alternative, size_t firstTermIndex, size_t endIndex) + bool containsCapturingTerms(PatternAlternative* alternative, size_t firstTermIndex, size_t lastTermIndex) { Vector<PatternTerm>& terms = alternative->m_terms; - ASSERT(endIndex <= terms.size()); - for (size_t termIndex = firstTermIndex; termIndex < endIndex; ++termIndex) { + for (size_t termIndex = firstTermIndex; termIndex <= lastTermIndex; ++termIndex) { PatternTerm& term = terms[termIndex]; if (term.m_capture) @@ -753,7 +750,7 @@ public: if (term.type == PatternTerm::TypeParenthesesSubpattern) { PatternDisjunction* nestedDisjunction = term.parentheses.disjunction; for (unsigned alt = 0; alt < nestedDisjunction->m_alternatives.size(); ++alt) { - if (containsCapturingTerms(nestedDisjunction->m_alternatives[alt].get(), 0, nestedDisjunction->m_alternatives[alt]->m_terms.size())) + if (containsCapturingTerms(nestedDisjunction->m_alternatives[alt].get(), 0, nestedDisjunction->m_alternatives[alt]->m_terms.size() - 1)) return true; } } @@ -769,7 +766,7 @@ public: // beginning and the end of the match. void optimizeDotStarWrappedExpressions() { - Vector<std::unique_ptr<PatternAlternative>>& alternatives = m_pattern.m_body->m_alternatives; + Vector<OwnPtr<PatternAlternative>>& alternatives = m_pattern.m_body->m_alternatives; if (alternatives.size() != 1) return; @@ -778,7 +775,7 @@ public: if (terms.size() >= 3) { bool startsWithBOL = false; bool endsWithEOL = false; - size_t termIndex, firstExpressionTerm; + size_t termIndex, firstExpressionTerm, lastExpressionTerm; termIndex = 0; if (terms[termIndex].type == PatternTerm::TypeAssertionBOL) { @@ -801,13 +798,14 @@ public: PatternTerm& lastNonAnchorTerm = terms[termIndex]; if ((lastNonAnchorTerm.type != PatternTerm::TypeCharacterClass) || (lastNonAnchorTerm.characterClass != m_pattern.newlineCharacterClass()) || (lastNonAnchorTerm.quantityType != QuantifierGreedy)) return; + + lastExpressionTerm = termIndex - 1; - size_t endIndex = termIndex; - if (firstExpressionTerm >= endIndex) + if (firstExpressionTerm > lastExpressionTerm) return; - if (!containsCapturingTerms(alternative, firstExpressionTerm, endIndex)) { - for (termIndex = terms.size() - 1; termIndex >= endIndex; --termIndex) + if (!containsCapturingTerms(alternative, firstExpressionTerm, lastExpressionTerm)) { + for (termIndex = terms.size() - 1; termIndex > lastExpressionTerm; --termIndex) terms.remove(termIndex); for (termIndex = firstExpressionTerm; termIndex > 0; --termIndex) @@ -866,7 +864,6 @@ YarrPattern::YarrPattern(const String& pattern, bool ignoreCase, bool multiline, , m_multiline(multiline) , m_containsBackreferences(false) , m_containsBOL(false) - , m_containsUnsignedLengthPattern(false) , m_numSubpatterns(0) , m_maxBackReference(0) , newlineCached(0) |