diff options
Diffstat (limited to 'src/3rdparty/masm/yarr/YarrParser.h')
-rw-r--r-- | src/3rdparty/masm/yarr/YarrParser.h | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/src/3rdparty/masm/yarr/YarrParser.h b/src/3rdparty/masm/yarr/YarrParser.h index edc6beb1f0..a6044d49ac 100644 --- a/src/3rdparty/masm/yarr/YarrParser.h +++ b/src/3rdparty/masm/yarr/YarrParser.h @@ -194,7 +194,9 @@ private: // invoked with inCharacterClass set. NO_RETURN_DUE_TO_ASSERT void assertionWordBoundary(bool) { RELEASE_ASSERT_NOT_REACHED(); } NO_RETURN_DUE_TO_ASSERT void atomBackReference(unsigned) { RELEASE_ASSERT_NOT_REACHED(); } - NO_RETURN_DUE_TO_ASSERT void atomNamedBackReference(String) { RELEASE_ASSERT_NOT_REACHED(); } + NO_RETURN_DUE_TO_ASSERT void atomNamedBackReference(const String&) { RELEASE_ASSERT_NOT_REACHED(); } + bool isValidNamedForwardReference(const String&) { RELEASE_ASSERT_NOT_REACHED(); return false; } + NO_RETURN_DUE_TO_ASSERT void atomNamedForwardReference(const String&) { RELEASE_ASSERT_NOT_REACHED(); } private: Delegate& m_delegate; @@ -213,7 +215,7 @@ private: : m_delegate(delegate) , m_backReferenceLimit(backReferenceLimit) , m_data(pattern.characters<CharType>()) - , m_size(pattern.length()) + , m_size(pattern.size()) , m_isUnicode(isUnicode) { } @@ -421,9 +423,16 @@ private: if (!atEndOfPattern() && !inCharacterClass) { if (consume() == '<') { auto groupName = tryConsumeGroupName(); - if (groupName && m_captureGroupNames.contains(groupName.value())) { - delegate.atomNamedBackReference(groupName.value()); - break; + if (groupName) { + if (m_captureGroupNames.contains(groupName.value())) { + delegate.atomNamedBackReference(groupName.value()); + break; + } + + if (delegate.isValidNamedForwardReference(groupName.value())) { + delegate.atomNamedForwardReference(groupName.value()); + break; + } } if (m_isUnicode) { m_errorCode = ErrorCode::InvalidBackreference; @@ -880,7 +889,7 @@ private: return peek() - '0'; } - int tryConsumeUnicodeEscape() + char16_t tryConsumeUnicodeEscape() { if (!tryConsume('u')) return -1; @@ -933,9 +942,9 @@ private: return u; } - int tryConsumeIdentifierCharacter() + char16_t tryConsumeIdentifierCharacter() { - int ch = peek(); + char16_t ch = peek(); if (ch == '\\') { consume(); @@ -961,7 +970,7 @@ private: return WTF::isASCIIAlphanumeric(ch) || ch == '_' || ch == '='; } - int consume() + char16_t consume() { ASSERT(m_index < m_size); return m_data[m_index++]; @@ -1021,7 +1030,7 @@ private: ParseState state = saveState(); - int ch = tryConsumeIdentifierCharacter(); + char16_t ch = tryConsumeIdentifierCharacter(); if (isIdentifierStart(ch)) { StringBuilder identifierBuilder; @@ -1056,10 +1065,10 @@ private: bool foundEquals = false; unsigned errors = 0; - expressionBuilder.append(consume()); + expressionBuilder.append(QChar(consume())); while (!atEndOfPattern()) { - int ch = peek(); + char16_t ch = peek(); if (ch == '}') { consume(); if (errors) { @@ -1133,11 +1142,13 @@ private: * void atomCharacterClassRange(UChar32 begin, UChar32 end) * void atomCharacterClassBuiltIn(BuiltInCharacterClassID classID, bool invert) * void atomCharacterClassEnd() - * void atomParenthesesSubpatternBegin(bool capture = true, std::optional<String> groupName); + * void atomParenthesesSubpatternBegin(bool capture = true, Optional<String> groupName); * void atomParentheticalAssertionBegin(bool invert = false); * void atomParenthesesEnd(); * void atomBackReference(unsigned subpatternId); - * void atomNamedBackReference(String subpatternName); + * void atomNamedBackReference(const String& subpatternName); + * bool isValidNamedForwardReference(const String& subpatternName); + * void atomNamedForwardReference(const String& subpatternName); * * void quantifyAtom(unsigned min, unsigned max, bool greedy); * |