From 94d7c6dc5f2093ac3d875e92138592bba0aa2cc3 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Fri, 25 Mar 2022 18:07:22 -0600 Subject: [PATCH] fix functor/3 arity check (#1366) --- src/machine/machine_state_impl.rs | 48 +++++++++++++++---------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/machine/machine_state_impl.rs b/src/machine/machine_state_impl.rs index eccbe6af..7a90f88f 100644 --- a/src/machine/machine_state_impl.rs +++ b/src/machine/machine_state_impl.rs @@ -2309,36 +2309,36 @@ impl MachineState { return Err(self.error_form(err, stub_gen())); } + let mut type_error = |arity| { + let err = self.type_error(ValidType::Integer, arity); + return Err(self.error_form(err, stub_gen())); + }; + let arity = match Number::try_from(arity) { - Ok(Number::Fixnum(n)) => Some(n.get_num()), - Ok(Number::Integer(n)) => n.to_i64(), - Ok(Number::Rational(n)) if n.denom() == &1 => n.numer().to_i64(), - _ => { - let err = self.type_error(ValidType::Integer, arity); + Ok(Number::Float(_)) => { + return type_error(arity); + } + Ok(Number::Rational(n)) if n.denom() != &1 => { + return type_error(arity); + } + Ok(n) if n > MAX_ARITY => { + // 8.5.1.3 f) + let err = self.representation_error(RepFlag::MaxArity); return Err(self.error_form(err, stub_gen())); } - }; - - let arity = match arity { - Some(arity) => arity, - None => { - self.fail = true; - return Ok(()); + Ok(n) if n < 0 => { + // 8.5.1.3 g) + let err = self.domain_error(DomainErrorType::NotLessThanZero, n); + return Err(self.error_form(err, stub_gen())); + } + Ok(Number::Rational(n)) => n.numer().to_i64().unwrap(), + Ok(Number::Fixnum(n)) => n.get_num(), + Ok(Number::Integer(n)) => n.to_i64().unwrap(), + Err(_) => { + return type_error(arity); } }; - if arity > MAX_ARITY as i64 { - // 8.5.1.3 f) - let err = self.representation_error(RepFlag::MaxArity); - return Err(self.error_form(err, stub_gen())); - } else if arity < 0 { - // 8.5.1.3 g) - let arity = Number::Fixnum(Fixnum::build_with(arity)); - let err = self.domain_error(DomainErrorType::NotLessThanZero, arity); - - return Err(self.error_form(err, stub_gen())); - } - read_heap_cell!(store_name, (HeapCellValueTag::Cons | HeapCellValueTag::Char | HeapCellValueTag::Fixnum | HeapCellValueTag::F64) if arity == 0 => { -- 2.54.0