implement hideously inefficient fix to work around rust

Signed-off-by: Ava Hahn <ava@aidanis.online>
This commit is contained in:
Ava Hahn 2023-02-24 15:09:00 -08:00
parent a1e19a19d9
commit c70cbc701d
Signed by untrusted user who does not match committer: affine
GPG key ID: 3A4645B8CF806069

View file

@ -68,7 +68,7 @@ pub struct Symbol {
impl SymTable { impl SymTable {
pub fn new() -> SymTable { pub fn new() -> SymTable {
SymTable{0: HashMap::<String, Symbol>::new()} SymTable(HashMap::<String, Symbol>::new())
} }
pub fn get(&self, arg: &String) -> Option<&Symbol> { pub fn get(&self, arg: &String) -> Option<&Symbol> {
@ -84,7 +84,7 @@ impl SymTable {
} }
pub fn call_symbol(&mut self, name: &String, args: &Seg, call_func: bool) -> Result<Box<Ctr>, String> { pub fn call_symbol(&mut self, name: &String, args: &Seg, call_func: bool) -> Result<Box<Ctr>, String> {
let symbol = match self.get(name) { let symbol = match self.remove(name) {
Some(s) => s, Some(s) => s,
None => return Err(format!("undefined symbol: {}", name)), None => return Err(format!("undefined symbol: {}", name)),
}; };
@ -100,7 +100,16 @@ impl SymTable {
cond_args = &outer_scope_seg_holder; cond_args = &outer_scope_seg_holder;
} }
symbol.call(cond_args, self) let res = symbol.call(cond_args, self);
self.insert(name.to_string(), symbol);
res
}
}
impl Default for SymTable {
fn default() -> Self {
Self::new()
} }
} }
@ -194,6 +203,7 @@ impl Symbol {
let outer_scope_eval: Box<Ctr>; let outer_scope_eval: Box<Ctr>;
if self.conditional_branches { if self.conditional_branches {
let outer_scope_eval_result = eval(args, syms); let outer_scope_eval_result = eval(args, syms);
// dont listen to clippy. using ? will move the value.
if let Err(s) = outer_scope_eval_result { if let Err(s) = outer_scope_eval_result {
return Err(s); return Err(s);
} }