mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-25 05:55:13 +00:00
LibRegex: Use match_ordinary_characters() in ECMA262Parser::parse_atom()
Otherwise we would only match TokenType::Char, making all of these invalid: - /foo,bar/ - /foo\/bar/ - /foo=bar/ - /foo-bar/ - /foo:bar/ Fixes #4243.
This commit is contained in:
parent
1279d2256c
commit
eea7cabdbc
Notes:
sideshowbarker
2024-07-19 01:10:57 +09:00
Author: https://github.com/linusg Commit: https://github.com/SerenityOS/serenity/commit/eea7cabdbc5 Pull-request: https://github.com/SerenityOS/serenity/pull/4245 Issue: https://github.com/SerenityOS/serenity/issues/4243 Reviewed-by: https://github.com/alimpfard ✅
3 changed files with 16 additions and 15 deletions
|
@ -154,6 +154,19 @@ Parser::Result Parser::parse(Optional<AllOptions> regex_options)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ALWAYS_INLINE bool Parser::match_ordinary_characters()
|
||||||
|
{
|
||||||
|
// NOTE: This method must not be called during bracket and repetition parsing!
|
||||||
|
// FIXME: Add assertion for that?
|
||||||
|
auto type = m_parser_state.current_token.type();
|
||||||
|
return (type == TokenType::Char
|
||||||
|
|| type == TokenType::Comma
|
||||||
|
|| type == TokenType::Slash
|
||||||
|
|| type == TokenType::EqualSign
|
||||||
|
|| type == TokenType::HyphenMinus
|
||||||
|
|| type == TokenType::Colon);
|
||||||
|
}
|
||||||
|
|
||||||
// =============================
|
// =============================
|
||||||
// PosixExtended Parser
|
// PosixExtended Parser
|
||||||
// =============================
|
// =============================
|
||||||
|
@ -172,19 +185,6 @@ ALWAYS_INLINE bool PosixExtendedParser::match_repetition_symbol()
|
||||||
|| type == TokenType::LeftCurly);
|
|| type == TokenType::LeftCurly);
|
||||||
}
|
}
|
||||||
|
|
||||||
ALWAYS_INLINE bool PosixExtendedParser::match_ordinary_characters()
|
|
||||||
{
|
|
||||||
// NOTE: This method must not be called during bracket and repetition parsing!
|
|
||||||
// FIXME: Add assertion for that?
|
|
||||||
auto type = m_parser_state.current_token.type();
|
|
||||||
return (type == TokenType::Char
|
|
||||||
|| type == TokenType::Comma
|
|
||||||
|| type == TokenType::Slash
|
|
||||||
|| type == TokenType::EqualSign
|
|
||||||
|| type == TokenType::HyphenMinus
|
|
||||||
|| type == TokenType::Colon);
|
|
||||||
}
|
|
||||||
|
|
||||||
ALWAYS_INLINE bool PosixExtendedParser::parse_repetition_symbol(ByteCode& bytecode_to_repeat, size_t& match_length_minimum)
|
ALWAYS_INLINE bool PosixExtendedParser::parse_repetition_symbol(ByteCode& bytecode_to_repeat, size_t& match_length_minimum)
|
||||||
{
|
{
|
||||||
if (match(TokenType::LeftCurly)) {
|
if (match(TokenType::LeftCurly)) {
|
||||||
|
@ -964,7 +964,7 @@ bool ECMA262Parser::parse_atom(ByteCode& stack, size_t& match_length_minimum, bo
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (match(TokenType::Char)) {
|
if (match_ordinary_characters()) {
|
||||||
auto token = consume().value();
|
auto token = consume().value();
|
||||||
match_length_minimum += 1;
|
match_length_minimum += 1;
|
||||||
stack.insert_bytecode_compare_values({ { CharacterCompareType::Char, (ByteCodeValueType)token[0] } });
|
stack.insert_bytecode_compare_values({ { CharacterCompareType::Char, (ByteCodeValueType)token[0] } });
|
||||||
|
|
|
@ -90,6 +90,7 @@ protected:
|
||||||
|
|
||||||
ALWAYS_INLINE bool match(TokenType type) const;
|
ALWAYS_INLINE bool match(TokenType type) const;
|
||||||
ALWAYS_INLINE bool match(char ch) const;
|
ALWAYS_INLINE bool match(char ch) const;
|
||||||
|
ALWAYS_INLINE bool match_ordinary_characters();
|
||||||
ALWAYS_INLINE Token consume();
|
ALWAYS_INLINE Token consume();
|
||||||
ALWAYS_INLINE Token consume(TokenType type, Error error);
|
ALWAYS_INLINE Token consume(TokenType type, Error error);
|
||||||
ALWAYS_INLINE bool consume(const String&);
|
ALWAYS_INLINE bool consume(const String&);
|
||||||
|
@ -145,7 +146,6 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ALWAYS_INLINE bool match_repetition_symbol();
|
ALWAYS_INLINE bool match_repetition_symbol();
|
||||||
ALWAYS_INLINE bool match_ordinary_characters();
|
|
||||||
|
|
||||||
bool parse_internal(ByteCode&, size_t&) override;
|
bool parse_internal(ByteCode&, size_t&) override;
|
||||||
|
|
||||||
|
|
|
@ -488,6 +488,7 @@ TEST_CASE(ECMA262_parse)
|
||||||
"^[\\w+/_-]+[=]{0,2}$", // #4189
|
"^[\\w+/_-]+[=]{0,2}$", // #4189
|
||||||
"^(?:[^<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)", // #4189
|
"^(?:[^<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)", // #4189
|
||||||
"\\/", // #4189
|
"\\/", // #4189
|
||||||
|
",/=-:", // #4243
|
||||||
"\\x", // Even invalid escapes are allowed if ~unicode.
|
"\\x", // Even invalid escapes are allowed if ~unicode.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue