From c501a6e558a7d58851b5fe34a357e94346b75f01 Mon Sep 17 00:00:00 2001 From: mark Date: Fri, 12 May 2023 15:03:20 +0200 Subject: [PATCH] fixed bug with function args and custom types --- mers/src/script/builtins.rs | 14 +++++++------- mers/src/script/code_runnable.rs | 8 +++++--- mers/src/script/val_type.rs | 4 ++-- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/mers/src/script/builtins.rs b/mers/src/script/builtins.rs index 3192fc3..f48ad33 100755 --- a/mers/src/script/builtins.rs +++ b/mers/src/script/builtins.rs @@ -553,7 +553,7 @@ impl BuiltinFunction { for (i, o) in io { if i.iter() .zip(input.iter().skip(1)) - .all(|(i, input)| input.contains(i)) + .all(|(i, input)| input.contains(i, info)) { out = out | o; } @@ -694,8 +694,8 @@ impl BuiltinFunction { let mut might_be_string = false; if let Self::Add = self { match ( - input[0].contains(&VSingleType::String), - input[1].contains(&VSingleType::String), + input[0].contains(&VSingleType::String, info), + input[1].contains(&VSingleType::String, info), ) { (true, true) => might_be_string = true, (true, false) | (false, true) => unreachable!(), @@ -704,12 +704,12 @@ impl BuiltinFunction { } let o = match ( ( - input[0].contains(&VSingleType::Int), - input[0].contains(&VSingleType::Float), + input[0].contains(&VSingleType::Int, info), + input[0].contains(&VSingleType::Float, info), ), ( - input[1].contains(&VSingleType::Int), - input[1].contains(&VSingleType::Float), + input[1].contains(&VSingleType::Int, info), + input[1].contains(&VSingleType::Float, info), ), ) { ((true, false), (true, false)) => VSingleType::Int.to(), diff --git a/mers/src/script/code_runnable.rs b/mers/src/script/code_runnable.rs index 8945f3d..a62a00e 100755 --- a/mers/src/script/code_runnable.rs +++ b/mers/src/script/code_runnable.rs @@ -58,13 +58,13 @@ impl RFunction { }) .expect("invalid args for function! possible issue with type-checker if this can be reached! feel free to report a bug.") } - pub fn out_vt(&self, input_types: &Vec) -> VType { + pub fn out_vt(&self, input_types: &Vec, info: &GlobalScriptInfo) -> VType { let mut out = VType { types: vec![] }; for (itype, otype) in self.input_output_map.iter() { if itype .iter() .zip(input_types.iter()) - .all(|(expected, got)| got.contains(expected)) + .all(|(expected, got)| got.contains(expected, info)) { out = out | otype; } @@ -305,7 +305,9 @@ impl RStatementEnum { t.clone() } } - Self::FunctionCall(f, args) => f.out_vt(&args.iter().map(|v| v.out(info)).collect()), + Self::FunctionCall(f, args) => { + f.out_vt(&args.iter().map(|v| v.out(info)).collect(), info) + } Self::LibFunction(.., out) => out.clone(), Self::Block(b) => b.out(info), Self::If(_, a, b) => { diff --git a/mers/src/script/val_type.rs b/mers/src/script/val_type.rs index 21de3c5..d5e9291 100755 --- a/mers/src/script/val_type.rs +++ b/mers/src/script/val_type.rs @@ -176,8 +176,8 @@ impl VType { t.enum_variants(enum_variants); } } - pub fn contains(&self, t: &VSingleType) -> bool { - self.types.contains(t) + pub fn contains(&self, t: &VSingleType, info: &GlobalScriptInfo) -> bool { + self.types.iter().any(|s| t.fits_in(s, info)) } pub fn noenum(self) -> Self { let mut o = Self { types: vec![] };