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/event_dispatcher/event_dispatcher.rs | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'crates/shirabe/src/event_dispatcher') diff --git a/crates/shirabe/src/event_dispatcher/event_dispatcher.rs b/crates/shirabe/src/event_dispatcher/event_dispatcher.rs index f03f82db..6cc1670d 100644 --- a/crates/shirabe/src/event_dispatcher/event_dispatcher.rs +++ b/crates/shirabe/src/event_dispatcher/event_dispatcher.rs @@ -956,7 +956,13 @@ try {{ if Platform::is_windows() { path_and_args = Preg::replace_callback( php_regex!("{^\\S+}"), - |m| str_replace("/", "\\", &m[0]), + |m| { + str_replace( + "/", + "\\", + m.get(&CaptureKey::ByIndex(0)).unwrap(), + ) + }, &path_and_args, ); } @@ -985,7 +991,11 @@ try {{ path_and_args = format!( "{}{}", path_to_exec, - substr(&path_and_args, strlen(&m[0]), None) + substr( + &path_and_args, + strlen(m.get(&CaptureKey::ByIndex(0)).unwrap()), + None + ) ); } } @@ -1001,7 +1011,13 @@ try {{ if Platform::is_windows() { exec = Preg::replace_callback( php_regex!("{^\\S+}"), - |m| str_replace("/", "\\", &m[0]), + |m| { + str_replace( + "/", + "\\", + m.get(&CaptureKey::ByIndex(0)).unwrap(), + ) + }, &exec, ); } -- cgit v1.3.1-4-g156e