summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
authorAli Mohammad Pur <ali.mpfard@gmail.com>2021-09-06 16:53:06 +0430
committerAli Mohammad Pur <Ali.mpfard@gmail.com>2021-09-06 18:21:13 +0430
commit88d148b46a2ff1093a3ece5db835f2c51fc03bd7 (patch)
tree94ce1aad0bd9c0bfcc930263b6ffbe4c86a20dca /Userland
parent645e29a88b2a65939fdb584a76b469d82cf36062 (diff)
downloadserenity-88d148b46a2ff1093a3ece5db835f2c51fc03bd7.zip
LibRegex: Avoid keeping track of checkpoints across forks
Doing so would increase memory consumption by quite a bit, since many useless copies of the checkpoints hashmap would be created and later thrown away.
Diffstat (limited to 'Userland')
-rw-r--r--Userland/Libraries/LibRegex/RegexByteCode.cpp8
-rw-r--r--Userland/Libraries/LibRegex/RegexMatch.h2
2 files changed, 5 insertions, 5 deletions
diff --git a/Userland/Libraries/LibRegex/RegexByteCode.cpp b/Userland/Libraries/LibRegex/RegexByteCode.cpp
index 5d2b1eaa94..ded6ff79ea 100644
--- a/Userland/Libraries/LibRegex/RegexByteCode.cpp
+++ b/Userland/Libraries/LibRegex/RegexByteCode.cpp
@@ -871,17 +871,17 @@ ALWAYS_INLINE ExecutionResult OpCode_ResetRepeat::execute(MatchInput const&, Mat
return ExecutionResult::Continue;
}
-ALWAYS_INLINE ExecutionResult OpCode_Checkpoint::execute(MatchInput const&, MatchState& state) const
+ALWAYS_INLINE ExecutionResult OpCode_Checkpoint::execute(MatchInput const& input, MatchState& state) const
{
- state.checkpoints.set(state.instruction_position, state.string_position);
+ input.checkpoints.set(state.instruction_position, state.string_position);
return ExecutionResult::Continue;
}
-ALWAYS_INLINE ExecutionResult OpCode_JumpNonEmpty::execute(MatchInput const&, MatchState& state) const
+ALWAYS_INLINE ExecutionResult OpCode_JumpNonEmpty::execute(MatchInput const& input, MatchState& state) const
{
auto current_position = state.string_position;
auto checkpoint_ip = state.instruction_position + size() + checkpoint();
- if (state.checkpoints.get(checkpoint_ip).value_or(current_position) != current_position) {
+ if (input.checkpoints.get(checkpoint_ip).value_or(current_position) != current_position) {
auto form = this->form();
if (form == OpCodeId::Jump) {
diff --git a/Userland/Libraries/LibRegex/RegexMatch.h b/Userland/Libraries/LibRegex/RegexMatch.h
index 035a988234..efd5bd0e4a 100644
--- a/Userland/Libraries/LibRegex/RegexMatch.h
+++ b/Userland/Libraries/LibRegex/RegexMatch.h
@@ -513,6 +513,7 @@ struct MatchInput {
mutable size_t fail_counter { 0 };
mutable Vector<size_t> saved_positions;
mutable Vector<size_t> saved_code_unit_positions;
+ mutable HashMap<u64, u64> checkpoints;
};
struct MatchState {
@@ -524,7 +525,6 @@ struct MatchState {
Vector<Match> matches;
Vector<Vector<Match>> capture_group_matches;
Vector<u64> repetition_marks;
- HashMap<u64, u64> checkpoints;
};
}