aboutsummaryrefslogtreecommitdiffstats
path: root/src/3rdparty/masm/yarr/YarrParser.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/masm/yarr/YarrParser.h')
-rw-r--r--src/3rdparty/masm/yarr/YarrParser.h39
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);
*