Regex: smarter handling of start chars computation for character class
This commit is contained in:
parent
839da764e7
commit
c1f0efa3f4
|
@ -891,11 +891,24 @@ private:
|
||||||
case ParsedRegex::Class:
|
case ParsedRegex::Class:
|
||||||
{
|
{
|
||||||
auto& character_class = m_parsed_regex.character_classes[node.value];
|
auto& character_class = m_parsed_regex.character_classes[node.value];
|
||||||
for (Codepoint cp = 0; cp < CompiledRegex::StartChars::count; ++cp)
|
if (character_class.ctypes == CharacterType::None and not character_class.negative)
|
||||||
{
|
{
|
||||||
if (is_character_class(character_class, cp))
|
for (auto& range : character_class.ranges)
|
||||||
|
{
|
||||||
|
auto min = std::min(CompiledRegex::StartChars::other, range.min);
|
||||||
|
auto max = std::min(CompiledRegex::StartChars::other, range.max);
|
||||||
|
for (Codepoint cp = min; cp <= max; ++cp)
|
||||||
start_chars.map[cp] = true;
|
start_chars.map[cp] = true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (Codepoint cp = 0; cp < CompiledRegex::StartChars::other; ++cp)
|
||||||
|
{
|
||||||
|
if (start_chars.map[cp] or is_character_class(character_class, cp))
|
||||||
|
start_chars.map[cp] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
start_chars.map[CompiledRegex::StartChars::other] = true;
|
start_chars.map[CompiledRegex::StartChars::other] = true;
|
||||||
return node.quantifier.allows_none();
|
return node.quantifier.allows_none();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user