From 07c802b93a241d566161d3077b3254df4067fa1e Mon Sep 17 00:00:00 2001 From: Jonas Maier <> Date: Thu, 5 Mar 2026 17:37:52 +0100 Subject: lots of shenanigans to have proper execve reload --- src/run/builtin.rs | 10 +++++++--- src/run/mod.rs | 5 +++++ 2 files changed, 12 insertions(+), 3 deletions(-) (limited to 'src/run') diff --git a/src/run/builtin.rs b/src/run/builtin.rs index 0f90e51..da6f4f2 100644 --- a/src/run/builtin.rs +++ b/src/run/builtin.rs @@ -43,9 +43,13 @@ impl Builtin for re { session.raw.disable(); match Command::new("cargo").arg("build").status() { Ok(status) if status.success() => { - let _ = Command::new("cargo").arg("run").status(); - session.raw.disable(); - std::process::exit(0); + // build of new shell succeeded + + // unwind the entire stack intentionally to free resources + // the catch handler will check the boolean and execve into + // the new executable + super::RELOAD.store(true, std::sync::atomic::Ordering::SeqCst); + std::panic::resume_unwind(Box::new(42)); } _ => (), } diff --git a/src/run/mod.rs b/src/run/mod.rs index 6484e30..0000547 100644 --- a/src/run/mod.rs +++ b/src/run/mod.rs @@ -2,12 +2,17 @@ use std::collections::HashMap; use std::fs; use std::os::unix::fs::PermissionsExt; use std::path::PathBuf; +#[cfg(debug_assertions)] +use std::sync::atomic::AtomicBool; use crate::parse::Ast; use crate::*; mod builtin; +#[cfg(debug_assertions)] +pub static RELOAD: AtomicBool = AtomicBool::new(false); + pub fn run(se: &mut Session, cmd: Vec) { let parsed = parse::do_parse(&cmd); -- cgit v1.2.3