From 704e0654b3e0c914d7b3c74b7a4b29a33223e767 Mon Sep 17 00:00:00 2001 From: Ali Mohammad Pur Date: Fri, 21 Jan 2022 20:10:51 +0330 Subject: [PATCH] Revert "LibRegex: Implement an ECMA262 Regex quirk with negative loo..." This partially reverts commit c11be92e23d899e28d45f67be24e47b2e5114d3a. That commit fixes one thing and breaks many more, a next commit will implement this quirk in a more sane way. --- Tests/LibRegex/Regex.cpp | 1 - Userland/Libraries/LibRegex/RegexMatcher.cpp | 15 ++------------- 2 files changed, 2 insertions(+), 14 deletions(-) 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; }