LibRegex: Don't use Optional<T> inside regex::Match

This prevented Match from being trivially copyable, which we want it to
be for fast Vector copying.
This commit is contained in:
Andreas Kling 2025-04-14 15:33:33 +02:00 committed by Andreas Kling
parent 54edf29f1b
commit 5308d77600
Notes: github-actions[bot] 2025-04-14 15:41:20 +00:00
3 changed files with 11 additions and 8 deletions

View file

@ -328,9 +328,9 @@ static ThrowCompletionOr<Value> regexp_builtin_exec(VM& vm, RegExpObject& regexp
MUST(array->create_data_property_or_throw(i, captured_value));
// e. If the ith capture of R was defined with a GroupName, then
if (capture.capture_group_name.has_value()) {
if (capture.capture_group_name >= 0) {
// i. Let s be the CapturingGroupName of the corresponding RegExpIdentifierName.
auto group_name = regex.parser_result.bytecode.get_string(capture.capture_group_name.release_value());
auto group_name = regex.parser_result.bytecode.get_string(capture.capture_group_name);
// ii. Perform ! CreateDataPropertyOrThrow(groups, s, capturedValue).
MUST(groups_object->create_data_property_or_throw(group_name, captured_value));

View file

@ -502,7 +502,7 @@ public:
void reset()
{
view = view.typed_null_view();
capture_group_name.clear();
capture_group_name = -1;
line = 0;
column = 0;
global_offset = 0;
@ -510,7 +510,10 @@ public:
}
RegexStringView view {};
Optional<size_t> capture_group_name {}; // This is a string table index.
// This is a string table index. -1 if none. Not using Optional to keep the struct trivially copyable.
ssize_t capture_group_name { -1 };
size_t line { 0 };
size_t column { 0 };
size_t global_offset { 0 };

View file

@ -426,10 +426,10 @@ TEST_CASE(named_capture_group)
EXPECT_EQ(result.count, 2u);
EXPECT_EQ(result.matches.at(0).view, "Opacity=255");
EXPECT_EQ(result.capture_group_matches.at(0).at(0).view, "255");
EXPECT_EQ(re.parser_result.bytecode.get_string(result.capture_group_matches.at(0).at(0).capture_group_name.value()), "Test");
EXPECT_EQ(re.parser_result.bytecode.get_string(result.capture_group_matches.at(0).at(0).capture_group_name), "Test");
EXPECT_EQ(result.matches.at(1).view, "AudibleBeep=0");
EXPECT_EQ(result.capture_group_matches.at(1).at(0).view, "0");
EXPECT_EQ(re.parser_result.bytecode.get_string(result.capture_group_matches.at(1).at(0).capture_group_name.value()), "Test");
EXPECT_EQ(re.parser_result.bytecode.get_string(result.capture_group_matches.at(1).at(0).capture_group_name), "Test");
}
TEST_CASE(ecma262_named_capture_group_with_dollar_sign)
@ -449,10 +449,10 @@ TEST_CASE(ecma262_named_capture_group_with_dollar_sign)
EXPECT_EQ(result.count, 2u);
EXPECT_EQ(result.matches.at(0).view, "Opacity=255");
EXPECT_EQ(result.capture_group_matches.at(0).at(0).view, "255");
EXPECT_EQ(re.parser_result.bytecode.get_string(result.capture_group_matches.at(0).at(0).capture_group_name.value()), "$Test$");
EXPECT_EQ(re.parser_result.bytecode.get_string(result.capture_group_matches.at(0).at(0).capture_group_name), "$Test$");
EXPECT_EQ(result.matches.at(1).view, "AudibleBeep=0");
EXPECT_EQ(result.capture_group_matches.at(1).at(0).view, "0");
EXPECT_EQ(re.parser_result.bytecode.get_string(result.capture_group_matches.at(1).at(0).capture_group_name.value()), "$Test$");
EXPECT_EQ(re.parser_result.bytecode.get_string(result.capture_group_matches.at(1).at(0).capture_group_name), "$Test$");
}
TEST_CASE(a_star)