LibRegex: Correct the alternative matching order when one is empty

Previously we were compiling `/a|/` into what effectively would be
`/|a`, which is clearly incorrect.
This commit is contained in:
Ali Mohammad Pur 2022-02-14 12:03:33 +03:30 committed by Andreas Kling
commit 3b0943d24c
Notes: sideshowbarker 2024-07-18 03:20:18 +09:00
2 changed files with 22 additions and 7 deletions

View file

@ -450,17 +450,17 @@ void Optimizer::append_alternation(ByteCode& target, ByteCode&& left, ByteCode&&
if (left_is_empty && right_is_empty)
return;
// ForkJump right (+ left.size() + 2 + right.size())
// (left)
// Jump end (+ right.size())
// ForkJump left (+ 2 + right.size())
// (right)
// Jump end (+ left.size())
// (left)
// LABEL end
target.append(static_cast<ByteCodeValueType>(OpCodeId::ForkJump));
target.append(left.size() + 2 + right.size());
target.extend(move(left));
target.append(static_cast<ByteCodeValueType>(OpCodeId::Jump));
target.append(right.size());
target.append(2 + right.size());
target.extend(move(right));
target.append(static_cast<ByteCodeValueType>(OpCodeId::Jump));
target.append(left.size());
target.extend(move(left));
return;
}