From 5114a8199a87c9e5584d92848e95deba22b73e98 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Tue, 18 Aug 2026 01:56:31 +0900 Subject: refactor(preg): back PregMatches with regex::Captures PregMatches was an IndexMap of owned Strings copied out of the match, so every preg_match2/preg_replace_callback call allocated a String per capture group (twice over for a named group) whether or not the caller read it. It now wraps the regex::Captures itself, held alongside the pattern it came from so groups stay reachable by both their named and their numbered form, and hands out &str borrowed from the subject. The subject's lifetime becomes a parameter of the type. Co-Authored-By: Claude Opus 5 (1M context) --- crates/shirabe-symfony-process/src/process.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'crates/shirabe-symfony-process/src/process.rs') diff --git a/crates/shirabe-symfony-process/src/process.rs b/crates/shirabe-symfony-process/src/process.rs index 96853e90..0f7d3814 100644 --- a/crates/shirabe-symfony-process/src/process.rs +++ b/crates/shirabe-symfony-process/src/process.rs @@ -939,8 +939,11 @@ impl Process { ) | [^"]*+ )"/x"# ), |m: &PregMatches| -> anyhow::Result { - let m0 = m[&CaptureKey::ByIndex(0)].clone().unwrap_or_default(); - let m1 = m.get(&CaptureKey::ByIndex(1)).cloned().flatten(); + let m0 = m + .get(&CaptureKey::ByIndex(0)) + .unwrap_or_default() + .to_string(); + let m1 = m.get(&CaptureKey::ByIndex(1)).map(str::to_string); if m1.is_none() { return Ok(m0); } @@ -1071,9 +1074,8 @@ impl Process { |matches: &PregMatches| -> anyhow::Result { let key = matches .get(&CaptureKey::ByIndex(1)) - .cloned() - .flatten() - .unwrap_or_default(); + .unwrap_or_default() + .to_string(); match env.get(&key) { None => Err(InvalidArgumentException::new(format!( "Command line is missing a value for parameter \"{}\": {}", -- cgit v1.3.1-4-g156e