fix functor/3 arity check (#1366)
This commit is contained in:
@@ -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 => {
|
||||||
|
|||||||
Reference in New Issue
Block a user