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) --- .../src/input/string_input.rs | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) (limited to 'crates/shirabe-symfony-console/src/input/string_input.rs') diff --git a/crates/shirabe-symfony-console/src/input/string_input.rs b/crates/shirabe-symfony-console/src/input/string_input.rs index b0c3b159..0dcc1a9d 100644 --- a/crates/shirabe-symfony-console/src/input/string_input.rs +++ b/crates/shirabe-symfony-console/src/input/string_input.rs @@ -61,15 +61,14 @@ impl StringInput { if token.is_some() { tokens.push(token.take().unwrap()); } - cursor += - shirabe_php_shim::strlen(m[&CaptureKey::ByIndex(0)].as_deref().unwrap_or("")); + cursor += shirabe_php_shim::strlen(m.get(&CaptureKey::ByIndex(0)).unwrap_or("")); } else if let Some(m) = preg_match2( format!(r#"/([^="'\s]+?)(=?)({}+)/A"#, Self::REGEX_QUOTED_STRING), input, cursor as usize, ) { let inner = shirabe_php_shim::substr( - m[&CaptureKey::ByIndex(3)].as_deref().unwrap_or(""), + m.get(&CaptureKey::ByIndex(3)).unwrap_or(""), 1, Some(-1), ); @@ -78,12 +77,11 @@ impl StringInput { token = Some(format!( "{}{}{}{}", token.unwrap_or_default(), - m[&CaptureKey::ByIndex(1)].as_deref().unwrap_or(""), - m[&CaptureKey::ByIndex(2)].as_deref().unwrap_or(""), + m.get(&CaptureKey::ByIndex(1)).unwrap_or(""), + m.get(&CaptureKey::ByIndex(2)).unwrap_or(""), shirabe_php_shim::stripcslashes(&replaced) )); - cursor += - shirabe_php_shim::strlen(m[&CaptureKey::ByIndex(0)].as_deref().unwrap_or("")); + cursor += shirabe_php_shim::strlen(m.get(&CaptureKey::ByIndex(0)).unwrap_or("")); } else if let Some(m) = preg_match2( format!(r"/{}/A", Self::REGEX_QUOTED_STRING), input, @@ -93,13 +91,12 @@ impl StringInput { "{}{}", token.unwrap_or_default(), shirabe_php_shim::stripcslashes(&shirabe_php_shim::substr( - m[&CaptureKey::ByIndex(0)].as_deref().unwrap_or(""), + m.get(&CaptureKey::ByIndex(0)).unwrap_or(""), 1, Some(-1) )) )); - cursor += - shirabe_php_shim::strlen(m[&CaptureKey::ByIndex(0)].as_deref().unwrap_or("")); + cursor += shirabe_php_shim::strlen(m.get(&CaptureKey::ByIndex(0)).unwrap_or("")); } else if let Some(m) = preg_match2( format!(r"/{}/A", Self::REGEX_UNQUOTED_STRING), input, @@ -108,10 +105,9 @@ impl StringInput { token = Some(format!( "{}{}", token.unwrap_or_default(), - m[&CaptureKey::ByIndex(1)].as_deref().unwrap_or("") + m.get(&CaptureKey::ByIndex(1)).unwrap_or("") )); - cursor += - shirabe_php_shim::strlen(m[&CaptureKey::ByIndex(0)].as_deref().unwrap_or("")); + cursor += shirabe_php_shim::strlen(m.get(&CaptureKey::ByIndex(0)).unwrap_or("")); } else { // should never happen return Err(InvalidArgumentException::new(format!( -- cgit v1.3.1-4-g156e