diff options
Diffstat (limited to 'src/run/mod.rs')
| -rw-r--r-- | src/run/mod.rs | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/src/run/mod.rs b/src/run/mod.rs index a31ff1a..f727b01 100644 --- a/src/run/mod.rs +++ b/src/run/mod.rs @@ -202,6 +202,7 @@ impl Executor { ) -> SpawnedCmd { match cmd { CommandKind::Builtin(builtin) => { + let mut builtin = builtin.clone_box(); builtin.special(self.se.clone(), &args[1..]); let cloned_session = self.se.clone(); let handle = wait::spawn(move || { @@ -532,7 +533,7 @@ type BuiltinResult = Result<(), BuiltinError>; pub trait Builtin: Send + Sync { fn name(&self) -> &str; - fn special(&self, session: Arc<Mutex<Session>>, args: &[BString]) {} + fn special(&mut self, session: Arc<Mutex<Session>>, args: &[BString]) {} fn io( &self, @@ -543,7 +544,17 @@ pub trait Builtin: Send + Sync { ) -> BuiltinResult; } -const BUILTINS: &[&'static dyn Builtin] = &[ +pub trait BuiltinClone : Builtin { + fn clone_box(&self) -> Box<dyn Builtin>; +} + +impl<T: 'static + Builtin + Clone> BuiltinClone for T { + fn clone_box(&self) -> Box<dyn Builtin> { + Box::new(self.clone()) + } +} + +const BUILTINS: &[&'static dyn BuiltinClone] = &[ &builtin::cd, &builtin::clear, #[cfg(debug_assertions)] @@ -565,12 +576,12 @@ const BUILTINS: &[&'static dyn Builtin] = &[ #[cfg(debug_assertions)] &builtin::debug, &builtin::terminfo, - &builtin::bind, + &builtin::bind::new(), &builtin::exit, &builtin::ct, ]; -pub fn builtin_map() -> HashMap<BString, &'static dyn Builtin> { +pub fn builtin_map() -> HashMap<BString, &'static dyn BuiltinClone> { let mut map = HashMap::new(); for &b in BUILTINS { map.insert(b.name().as_bytes().to_vec(), b); @@ -580,7 +591,7 @@ pub fn builtin_map() -> HashMap<BString, &'static dyn Builtin> { #[derive(Clone)] pub enum CommandKind { - Builtin(&'static dyn Builtin), + Builtin(&'static dyn BuiltinClone), Fun(Block), Path(PathBuf), } |
