diff --git a/Tests/LibRegex/Regex.cpp b/Tests/LibRegex/Regex.cpp index c9bb6e1622..0193ce1b46 100644 --- a/Tests/LibRegex/Regex.cpp +++ b/Tests/LibRegex/Regex.cpp @@ -682,7 +682,6 @@ TEST_CASE(ECMA262_match) { "[\\0]"sv, "\0"sv, true, combine_flags(ECMAScriptFlags::Unicode, ECMAScriptFlags::BrowserExtended) }, { "[\\01]"sv, "\1"sv, true, ECMAScriptFlags::BrowserExtended }, { "(\0|a)"sv, "a"sv, true }, // #9686, Should allow null bytes in pattern - { "(.*?)a(?!(a+)b\\2c)\\2(.*)"sv, "baaabaac"sv, true }, // #6042, Groups inside lookarounds may be referenced outside, but their contents appear empty if the pattern in the lookaround fails. { "a|$"sv, "x"sv, true, (ECMAScriptFlags)regex::AllFlags::Global }, // #11940, Global (not the 'g' flag) regexps should attempt to match the zero-length end of the string too. }; // clang-format on diff --git a/Userland/Libraries/LibRegex/RegexMatcher.cpp b/Userland/Libraries/LibRegex/RegexMatcher.cpp index 18da4dd370..d6d9db077b 100644 --- a/Userland/Libraries/LibRegex/RegexMatcher.cpp +++ b/Userland/Libraries/LibRegex/RegexMatcher.cpp @@ -489,14 +489,7 @@ Optional Matcher::execute(MatchInput const& input, MatchState& sta return true; case ExecutionResult::Failed: if (!states_to_try_next.is_empty()) { - auto next_state = states_to_try_next.take_last(); - // Note: ECMA262 quirk: Note 3, https://tc39.es/ecma262/#sec-runtime-semantics-canonicalize-ch - // capture groups defined in lookarounds "leak" outside the regex, - // but their contents are empty if the lookaround fails. - // This is done by manually clearing the groups where needed, and leaking their contents here. - if constexpr (IsSame) - swap(next_state.capture_group_matches, state.capture_group_matches); - state = move(next_state); + state = states_to_try_next.take_last(); continue; } return false; @@ -506,11 +499,7 @@ Optional Matcher::execute(MatchInput const& input, MatchState& sta return {}; return false; } - auto next_state = states_to_try_next.take_last(); - // See note above about an ECMA262 quirk. - if constexpr (IsSame) - swap(next_state.capture_group_matches, state.capture_group_matches); - state = move(next_state); + state = states_to_try_next.take_last(); ++recursion_level; continue; }