mirror of
https://github.com/RGBCube/serenity
synced 2025-05-30 14:58:11 +00:00
LibRegex: Don't treat ForkReplace* as new forks
This commit is contained in:
parent
0ea399d8d6
commit
00326a63ed
2 changed files with 15 additions and 4 deletions
|
@ -1067,6 +1067,12 @@ TEST_CASE(negative_lookahead)
|
||||||
EXPECT_EQ(re.match(":1"sv).success, false);
|
EXPECT_EQ(re.match(":1"sv).success, false);
|
||||||
EXPECT_EQ(re.match(":foobar"sv).success, true);
|
EXPECT_EQ(re.match(":foobar"sv).success, true);
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
// Correctly count forks with nested groups and optimised loops
|
||||||
|
Regex<ECMA262> re("^((?:[^\\n]|\\n(?! *\\n))+)(?:\\n *)+\\n");
|
||||||
|
EXPECT_EQ(re.match("foo\n\n"sv).success, true);
|
||||||
|
EXPECT_EQ(re.match("foo\n"sv).success, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE(single_match_flag)
|
TEST_CASE(single_match_flag)
|
||||||
|
|
|
@ -267,7 +267,6 @@ ALWAYS_INLINE ExecutionResult OpCode_ForkReplaceStay::execute(MatchInput const&
|
||||||
{
|
{
|
||||||
state.fork_at_position = state.instruction_position + size() + offset();
|
state.fork_at_position = state.instruction_position + size() + offset();
|
||||||
input.fork_to_replace = state.instruction_position;
|
input.fork_to_replace = state.instruction_position;
|
||||||
state.forks_since_last_save++;
|
|
||||||
return ExecutionResult::Fork_PrioLow;
|
return ExecutionResult::Fork_PrioLow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -384,8 +383,10 @@ ALWAYS_INLINE ExecutionResult OpCode_SaveRightCaptureGroup::execute(MatchInput c
|
||||||
{
|
{
|
||||||
auto& match = state.capture_group_matches.at(input.match_index).at(id());
|
auto& match = state.capture_group_matches.at(input.match_index).at(id());
|
||||||
auto start_position = match.left_column;
|
auto start_position = match.left_column;
|
||||||
if (state.string_position < start_position)
|
if (state.string_position < start_position) {
|
||||||
|
dbgln("Right capture group {} is before left capture group {}!", state.string_position, start_position);
|
||||||
return ExecutionResult::Failed_ExecuteLowPrioForks;
|
return ExecutionResult::Failed_ExecuteLowPrioForks;
|
||||||
|
}
|
||||||
|
|
||||||
auto length = state.string_position - start_position;
|
auto length = state.string_position - start_position;
|
||||||
|
|
||||||
|
@ -1071,11 +1072,15 @@ ALWAYS_INLINE ExecutionResult OpCode_JumpNonEmpty::execute(MatchInput const& inp
|
||||||
|
|
||||||
state.fork_at_position = state.instruction_position + size() + offset();
|
state.fork_at_position = state.instruction_position + size() + offset();
|
||||||
|
|
||||||
if (form == OpCodeId::ForkJump)
|
if (form == OpCodeId::ForkJump) {
|
||||||
|
state.forks_since_last_save++;
|
||||||
return ExecutionResult::Fork_PrioHigh;
|
return ExecutionResult::Fork_PrioHigh;
|
||||||
|
}
|
||||||
|
|
||||||
if (form == OpCodeId::ForkStay)
|
if (form == OpCodeId::ForkStay) {
|
||||||
|
state.forks_since_last_save++;
|
||||||
return ExecutionResult::Fork_PrioLow;
|
return ExecutionResult::Fork_PrioLow;
|
||||||
|
}
|
||||||
|
|
||||||
if (form == OpCodeId::ForkReplaceStay) {
|
if (form == OpCodeId::ForkReplaceStay) {
|
||||||
input.fork_to_replace = state.instruction_position;
|
input.fork_to_replace = state.instruction_position;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue