From: Mark Thom Date: Sat, 26 Mar 2022 00:07:22 +0000 (-0600) Subject: fix functor/3 arity check (#1366) X-Git-Tag: v0.9.1~96 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=94d7c6dc5f2093ac3d875e92138592bba0aa2cc3;p=scryer-prolog.git fix functor/3 arity check (#1366) --- 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 => {