mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 15:38:10 +00:00
LibRegex: Correct jump offset to the start of the loop block
Previously we were jumping to the new end of the previous block (created by the newly inserted ForkStay), correct the offset to jump to the correct block as shown in the comments. Fixes #12033.
This commit is contained in:
parent
3de51a4b99
commit
bfe8f312f3
2 changed files with 5 additions and 3 deletions
|
@ -376,7 +376,7 @@ void Regex<Parser>::attempt_rewrite_loops_as_atomic_groups(BasicBlockList const&
|
|||
if (candidate.new_target_block.has_value()) {
|
||||
// Insert a fork-stay targeted at the second block.
|
||||
bytecode.insert(candidate.forking_block.start, (ByteCodeValueType)OpCodeId::ForkStay);
|
||||
bytecode.insert(candidate.forking_block.start + 1, candidate.new_target_block->start - candidate.forking_block.start);
|
||||
bytecode.insert(candidate.forking_block.start + 1, candidate.new_target_block->start - candidate.forking_block.start + 2);
|
||||
needed_patches.insert(candidate.forking_block.start, 2u);
|
||||
}
|
||||
}
|
||||
|
@ -427,9 +427,9 @@ void Regex<Parser>::attempt_rewrite_loops_as_atomic_groups(BasicBlockList const&
|
|||
if (patch_it.key() == ip)
|
||||
return;
|
||||
|
||||
if (patch_point.value < 0 && target_offset < patch_it.key() && ip > patch_it.key())
|
||||
if (patch_point.value < 0 && target_offset <= patch_it.key() && ip > patch_it.key())
|
||||
bytecode[patch_point.offset] += (patch_point.should_negate ? 1 : -1) * (*patch_it);
|
||||
else if (patch_point.value > 0 && target_offset > patch_it.key() && ip < patch_it.key())
|
||||
else if (patch_point.value > 0 && target_offset >= patch_it.key() && ip < patch_it.key())
|
||||
bytecode[patch_point.offset] += (patch_point.should_negate ? -1 : 1) * (*patch_it);
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue