From 5ecd58406326a315d3ce88c559d2f948db210d02 Mon Sep 17 00:00:00 2001 From: Mahmoud Al-Qudsi Date: Fri, 26 May 2023 21:53:43 -0500 Subject: [PATCH] Merge VarDispatchTable tables There was only one entry in the named table, so the previous layout was quite wasteful. This should speed up lookups and reduce memory overhead. --- fish-rust/src/env_dispatch.rs | 37 +++++++++++++---------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/fish-rust/src/env_dispatch.rs b/fish-rust/src/env_dispatch.rs index 4e40fb3e9..579383d6e 100644 --- a/fish-rust/src/env_dispatch.rs +++ b/fish-rust/src/env_dispatch.rs @@ -89,10 +89,14 @@ mod env_dispatch_ffi { type NamedEnvCallback = fn(name: &wstr, env: &EnvStack); type AnonEnvCallback = fn(env: &EnvStack); +enum EnvCallback { + Named(NamedEnvCallback), + Anon(AnonEnvCallback), +} + #[derive(Default)] struct VarDispatchTable { - named_table: HashMap<&'static wstr, NamedEnvCallback>, - anon_table: HashMap<&'static wstr, AnonEnvCallback>, + table: HashMap<&'static wstr, EnvCallback>, } // TODO: Delete this after input_common is ported (and pass the input_function function directly). @@ -103,36 +107,23 @@ fn update_wait_on_escape_ms(vars: &EnvStack) { } impl VarDispatchTable { - fn observes_var(&self, name: &wstr) -> bool { - self.named_table.contains_key(name) || self.anon_table.contains_key(name) - } - /// Add a callback for the variable `name`. We must not already be observing this variable. pub fn add(&mut self, name: &'static wstr, callback: NamedEnvCallback) { - let prev = self.named_table.insert(name, callback); - assert!( - prev.is_none() && !self.anon_table.contains_key(name), - "Already observing {}", - name - ); + let prev = self.table.insert(name, EnvCallback::Named(callback)); + assert!(prev.is_none(), "Already observing {}", name); } /// Add an callback for the variable `name`. We must not already be observing this variable. pub fn add_anon(&mut self, name: &'static wstr, callback: AnonEnvCallback) { - let prev = self.anon_table.insert(name, callback); - assert!( - prev.is_none() && !self.named_table.contains_key(name), - "Already observing {}", - name - ); + let prev = self.table.insert(name, EnvCallback::Anon(callback)); + assert!(prev.is_none(), "Already observing {}", name); } pub fn dispatch(&self, key: &wstr, vars: &EnvStack) { - if let Some(named) = self.named_table.get(key) { - (named)(key, vars); - } - if let Some(anon) = self.anon_table.get(key) { - (anon)(vars); + match self.table.get(key) { + Some(EnvCallback::Named(named)) => (named)(key, vars), + Some(EnvCallback::Anon(anon)) => (anon)(vars), + None => (), } } }