From adaa65f953dd6a19e27a0a05d86f9477d50884b1 Mon Sep 17 00:00:00 2001 From: Stephen Chung Date: Mon, 2 Mar 2020 15:19:41 +0800 Subject: [PATCH] Allow script functions to override built-in functions. --- src/builtin.rs | 6 ++---- src/engine.rs | 26 +++++++------------------- 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/src/builtin.rs b/src/builtin.rs index 9e6b033e..d7fa632f 100644 --- a/src/builtin.rs +++ b/src/builtin.rs @@ -195,14 +195,12 @@ impl Engine { fn print(x: T) -> String { format!("{}", x) } - fn println() -> String { - "\n".to_string() - } reg_func1!(self, "print", print, String, i32, i64, u32, u64); reg_func1!(self, "print", print, String, f32, f64, bool, char, String); reg_func1!(self, "print", print_debug, String, Array); - self.register_fn("print", println); + self.register_fn("print", || "".to_string()); + self.register_fn("print", |_: ()| "".to_string()); reg_func1!(self, "debug", print_debug, String, i32, i64, u32, u64); reg_func1!(self, "debug", print_debug, String, f32, f64, bool, char); diff --git a/src/engine.rs b/src/engine.rs index ac8ef1bf..635b7ac6 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -244,29 +244,17 @@ impl Engine { .collect::>() ); - let spec = FnSpec { + let mut spec = FnSpec { ident: ident.clone(), - args: Some(args.iter().map(|a| Any::type_id(&**a)).collect()), + args: None, }; // First search in script-defined functions (can override built-in), - // then in built-in's, then retry again with no arguments - let fn_def = self - .script_fns - .get(&spec) - .or_else(|| self.fns.get(&spec)) - .or_else(|| { - self.script_fns.get(&FnSpec { - ident: ident.clone(), - args: None, - }) - }) - .or_else(|| { - self.fns.get(&FnSpec { - ident: ident.clone(), - args: None, - }) - }); + // then in built-in's + let fn_def = self.script_fns.get(&spec).or_else(|| { + spec.args = Some(args.iter().map(|a| Any::type_id(&**a)).collect()); + self.fns.get(&spec) + }); if let Some(f) = fn_def { match **f {