fix functor/3 arity check (#1366)

This commit is contained in:
Mark Thom
2022-03-25 18:07:22 -06:00
parent 23bfb4da50
commit 94d7c6dc5f

View File

@@ -2309,36 +2309,36 @@ impl MachineState {
return Err(self.error_form(err, stub_gen())); 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) { let arity = match Number::try_from(arity) {
Ok(Number::Fixnum(n)) => Some(n.get_num()), Ok(Number::Float(_)) => {
Ok(Number::Integer(n)) => n.to_i64(), return type_error(arity);
Ok(Number::Rational(n)) if n.denom() == &1 => n.numer().to_i64(), }
_ => { Ok(Number::Rational(n)) if n.denom() != &1 => {
let err = self.type_error(ValidType::Integer, arity); 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())); return Err(self.error_form(err, stub_gen()));
} }
}; Ok(n) if n < 0 => {
// 8.5.1.3 g)
let arity = match arity { let err = self.domain_error(DomainErrorType::NotLessThanZero, n);
Some(arity) => arity, return Err(self.error_form(err, stub_gen()));
None => { }
self.fail = true; Ok(Number::Rational(n)) => n.numer().to_i64().unwrap(),
return Ok(()); 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, read_heap_cell!(store_name,
(HeapCellValueTag::Cons | HeapCellValueTag::Char | HeapCellValueTag::Fixnum | (HeapCellValueTag::Cons | HeapCellValueTag::Char | HeapCellValueTag::Fixnum |
HeapCellValueTag::F64) if arity == 0 => { HeapCellValueTag::F64) if arity == 0 => {