From 161f31f42bf7a77b4793a5b43063f1b4e4262e8f Mon Sep 17 00:00:00 2001 From: Johannes Altmanninger Date: Sun, 3 May 2026 16:36:49 +0800 Subject: [PATCH] run_1_job: remove code clone for profiling --- src/parse_execution.rs | 53 +++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/src/parse_execution.rs b/src/parse_execution.rs index 1b4096e11..0a454690c 100644 --- a/src/parse_execution.rs +++ b/src/parse_execution.rs @@ -1550,11 +1550,25 @@ fn run_1_job( .scoped_replace(Some(executing_node)); // Profiling support. - let profile_item_id = ctx.parser().create_profile_item(); - let start_time = if profile_item_id.is_some() { - ProfileItem::now() - } else { - 0 + let finalize_profile_item = { + let profile_item_id = ctx.parser().create_profile_item(); + let start_time = if profile_item_id.is_some() { + ProfileItem::now() + } else { + 0 + }; + move |ctx: &OperationContext<'_>, cmd: WString, skipped: bool| { + let Some(profile_item_id) = profile_item_id else { + return; + }; + let parser = ctx.parser(); + let mut profile_items = parser.profile_items_mut(); + let profile_item = &mut profile_items[profile_item_id]; + profile_item.duration = ProfileItem::now() - start_time; + profile_item.level = ctx.parser().scope().eval_level; + profile_item.cmd = cmd; + profile_item.skipped = skipped; + } }; let job_is_background = job_node.bg.is_some(); @@ -1607,16 +1621,11 @@ fn run_1_job( }; } - if let Some(profile_item_id) = profile_item_id { - let parser = ctx.parser(); - let mut profile_items = parser.profile_items_mut(); - let profile_item = &mut profile_items[profile_item_id]; - profile_item.duration = ProfileItem::now() - start_time; - profile_item.level = ctx.parser().scope().eval_level; - profile_item.cmd = - profiling_cmd_name_for_redirectable_block(statement, self.pstree()); - profile_item.skipped = false; - } + finalize_profile_item( + ctx, + profiling_cmd_name_for_redirectable_block(statement, self.pstree()), + false, + ); return result; } @@ -1684,15 +1693,11 @@ fn run_1_job( } } - if let Some(profile_item_id) = profile_item_id { - let parser = ctx.parser(); - let mut profile_items = parser.profile_items_mut(); - let profile_item = &mut profile_items[profile_item_id]; - profile_item.duration = ProfileItem::now() - start_time; - profile_item.level = ctx.parser().scope().eval_level; - profile_item.cmd = job.command().to_owned(); - profile_item.skipped = pop_result != EndExecutionReason::Ok; - } + finalize_profile_item( + ctx, + job.command().to_owned(), + pop_result != EndExecutionReason::Ok, + ); job_reap(ctx.parser(), false, Some(&self.block_io)); // clean up jobs pop_result