From 1400e3cf58c14594f06d98db25e10f908480ce67 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Fri, 30 Jul 2021 09:41:41 -0400 Subject: [PATCH] LibRegex: Allow separately parsing patterns and creating Regex objects Adds a static method to parse a regex pattern and return the result, and a constructor to accept a parse result. This is to allow LibJS to parse the pattern string of a RegExpLiteral once and hand off regex objects any number of times thereafter. --- Userland/Libraries/LibRegex/RegexMatcher.cpp | 18 ++++++++++++++++++ Userland/Libraries/LibRegex/RegexMatcher.h | 3 +++ 2 files changed, 21 insertions(+) diff --git a/Userland/Libraries/LibRegex/RegexMatcher.cpp b/Userland/Libraries/LibRegex/RegexMatcher.cpp index bd9680d41a..e30d285716 100644 --- a/Userland/Libraries/LibRegex/RegexMatcher.cpp +++ b/Userland/Libraries/LibRegex/RegexMatcher.cpp @@ -18,6 +18,15 @@ namespace regex { static RegexDebug s_regex_dbg(stderr); #endif +template +regex::Parser::Result Regex::parse_pattern(StringView pattern, typename ParserTraits::OptionsType regex_options) +{ + regex::Lexer lexer(pattern); + + Parser parser(lexer, regex_options); + return parser.parse(); +} + template Regex::Regex(String pattern, typename ParserTraits::OptionsType regex_options) : pattern_value(move(pattern)) @@ -31,6 +40,15 @@ Regex::Regex(String pattern, typename ParserTraits::OptionsType matcher = make>(this, regex_options); } +template +Regex::Regex(regex::Parser::Result parse_result, String pattern, typename ParserTraits::OptionsType regex_options) + : pattern_value(move(pattern)) + , parser_result(move(parse_result)) +{ + if (parser_result.error == regex::Error::NoError) + matcher = make>(this, regex_options); +} + template Regex::Regex(Regex&& regex) : pattern_value(move(regex.pattern_value)) diff --git a/Userland/Libraries/LibRegex/RegexMatcher.h b/Userland/Libraries/LibRegex/RegexMatcher.h index 35e72962ce..1229bacc94 100644 --- a/Userland/Libraries/LibRegex/RegexMatcher.h +++ b/Userland/Libraries/LibRegex/RegexMatcher.h @@ -80,7 +80,10 @@ public: OwnPtr> matcher { nullptr }; mutable size_t start_offset { 0 }; + static regex::Parser::Result parse_pattern(StringView pattern, typename ParserTraits::OptionsType regex_options = {}); + explicit Regex(String pattern, typename ParserTraits::OptionsType regex_options = {}); + Regex(regex::Parser::Result parse_result, String pattern, typename ParserTraits::OptionsType regex_options = {}); ~Regex() = default; Regex(Regex&&); Regex& operator=(Regex&&);