X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/93a3786624b2768d89bfa27e46598dc64e2fb70a..2d39b0e377c0896910ee49ae70082ba665faf986:/yarr/YarrPattern.cpp diff --git a/yarr/YarrPattern.cpp b/yarr/YarrPattern.cpp index 3ce0216..56dd5e5 100644 --- a/yarr/YarrPattern.cpp +++ b/yarr/YarrPattern.cpp @@ -84,21 +84,21 @@ public: } // Add multiple matches, if necessary. - UCS2CanonicalizationRange* info = rangeInfoFor(ch); + const UCS2CanonicalizationRange* info = rangeInfoFor(ch); if (info->type == CanonicalizeUnique) addSorted(m_matchesUnicode, ch); else putUnicodeIgnoreCase(ch, info); } - void putUnicodeIgnoreCase(UChar ch, UCS2CanonicalizationRange* info) + void putUnicodeIgnoreCase(UChar ch, const UCS2CanonicalizationRange* info) { ASSERT(m_isCaseInsensitive); ASSERT(ch > 0x7f); ASSERT(ch >= info->begin && ch <= info->end); ASSERT(info->type != CanonicalizeUnique); if (info->type == CanonicalizeSet) { - for (uint16_t* set = characterSetInfo[info->value]; (ch = *set); ++set) + for (const uint16_t* set = characterSetInfo[info->value]; (ch = *set); ++set) addSorted(m_matchesUnicode, ch); } else { addSorted(m_matchesUnicode, ch); @@ -129,7 +129,7 @@ public: if (!m_isCaseInsensitive) return; - UCS2CanonicalizationRange* info = rangeInfoFor(lo); + const UCS2CanonicalizationRange* info = rangeInfoFor(lo); while (true) { // Handle the range [lo .. end] UChar end = std::min(info->end, hi); @@ -140,7 +140,7 @@ public: break; case CanonicalizeSet: { UChar ch; - for (uint16_t* set = characterSetInfo[info->value]; (ch = *set); ++set) + for (const uint16_t* set = characterSetInfo[info->value]; (ch = *set); ++set) addSorted(m_matchesUnicode, ch); break; } @@ -322,7 +322,7 @@ public: return; } - UCS2CanonicalizationRange* info = rangeInfoFor(ch); + const UCS2CanonicalizationRange* info = rangeInfoFor(ch); if (info->type == CanonicalizeUnique) { m_alternative->m_terms.append(PatternTerm(ch)); return; @@ -666,6 +666,8 @@ 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); @@ -696,7 +698,7 @@ public: if (m_pattern.m_numSubpatterns) return; - Vector >& alternatives = m_pattern.m_body->m_alternatives; + Vector>& alternatives = m_pattern.m_body->m_alternatives; for (size_t i = 0; i < alternatives.size(); ++i) { Vector& terms = alternatives[i]->m_terms; if (terms.size()) { @@ -766,7 +768,7 @@ public: // beginning and the end of the match. void optimizeDotStarWrappedExpressions() { - Vector >& alternatives = m_pattern.m_body->m_alternatives; + Vector>& alternatives = m_pattern.m_body->m_alternatives; if (alternatives.size() != 1) return; @@ -864,6 +866,7 @@ 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)