From 8dd7f51ae3ca0d3b5a6eb05c72dba435a31f9257 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Wed, 4 May 2022 22:44:12 -0600 Subject: [PATCH] fix rnd_i fixnum casting bug (#1456, #1458) --- src/arithmetic.rs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/arithmetic.rs b/src/arithmetic.rs index 1bac6bf8..02870f81 100644 --- a/src/arithmetic.rs +++ b/src/arithmetic.rs @@ -364,12 +364,19 @@ impl<'a> ArithmeticEvaluator<'a> { // integer division rounding function -- 9.1.3.1. pub(crate) fn rnd_i<'a>(n: &'a Number, arena: &mut Arena) -> Number { match n { - &Number::Integer(_) | &Number::Fixnum(_) => *n, + &Number::Integer(i) => { + if let Some(n) = i.to_i64() { + fixnum!(Number, n, arena) + } else { + *n + } + } + &Number::Fixnum(_) => *n, &Number::Float(f) => { let f = f.floor(); const I64_MIN_TO_F: OrderedFloat = OrderedFloat(i64::MIN as f64); - const I64_MAX_TO_F: OrderedFloat = OrderedFloat(i64::MIN as f64); + const I64_MAX_TO_F: OrderedFloat = OrderedFloat(i64::MAX as f64); if I64_MIN_TO_F <= f && f <= I64_MAX_TO_F { fixnum!(Number, f.into_inner() as i64, arena) @@ -382,7 +389,11 @@ pub(crate) fn rnd_i<'a>(n: &'a Number, arena: &mut Arena) -> Number { let (mut fract, mut floor) = (Rational::new(), Integer::new()); (&mut fract, &mut floor).assign(r_ref); - Number::Integer(arena_alloc!(floor, arena)) + if let Some(floor) = floor.to_i64() { + fixnum!(Number, floor, arena) + } else { + Number::Integer(arena_alloc!(floor, arena)) + } } } } -- 2.54.0