diff --git a/Userland/Libraries/LibRegex/RegexOptimizer.cpp b/Userland/Libraries/LibRegex/RegexOptimizer.cpp index 6448a830c2..1445ced1e5 100644 --- a/Userland/Libraries/LibRegex/RegexOptimizer.cpp +++ b/Userland/Libraries/LibRegex/RegexOptimizer.cpp @@ -32,6 +32,8 @@ typename Regex::BasicBlockList Regex::split_basic_blocks(ByteCod BasicBlockList block_boundaries; size_t end_of_last_block = 0; + auto bytecode_size = bytecode.size(); + MatchState state; state.instruction_position = 0; auto check_jump = [&](OpCode const& opcode) { @@ -88,14 +90,14 @@ typename Regex::BasicBlockList Regex::split_basic_blocks(ByteCod } auto next_ip = state.instruction_position + opcode.size(); - if (next_ip < bytecode.size()) + if (next_ip < bytecode_size) state.instruction_position = next_ip; else break; } - if (end_of_last_block < bytecode.size()) - block_boundaries.append({ end_of_last_block, bytecode.size() }); + if (end_of_last_block < bytecode_size) + block_boundaries.append({ end_of_last_block, bytecode_size }); quick_sort(block_boundaries, [](auto& a, auto& b) { return a.start < b.start; }); @@ -382,6 +384,7 @@ void Regex::attempt_rewrite_loops_as_atomic_groups(BasicBlockList const& if (!needed_patches.is_empty()) { MatchState state; + auto bytecode_size = bytecode.size(); state.instruction_position = 0; struct Patch { ssize_t value; @@ -389,7 +392,7 @@ void Regex::attempt_rewrite_loops_as_atomic_groups(BasicBlockList const& bool should_negate { false }; }; for (;;) { - if (state.instruction_position >= bytecode.size()) + if (state.instruction_position >= bytecode_size) break; auto& opcode = bytecode.get_opcode(state); @@ -471,6 +474,9 @@ void Optimizer::append_alternation(ByteCode& target, ByteCode&& left, ByteCode&& return; } + left.flatten(); + right.flatten(); + auto left_blocks = Regex::split_basic_blocks(left); auto right_blocks = Regex::split_basic_blocks(right);