]> Repositorios git - scryer-prolog.git/commitdiff
fix rnd_i fixnum casting bug (#1456, #1458)
authorMark Thom <[email protected]>
Thu, 5 May 2022 04:44:12 +0000 (22:44 -0600)
committerMark Thom <[email protected]>
Thu, 5 May 2022 04:44:12 +0000 (22:44 -0600)
src/arithmetic.rs

index 1bac6bf81e7b76c733c14c08da54d04e0714643f..02870f8106baf704e11bc6d9bf2f36f73a9c6d4b 100644 (file)
@@ -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<f64> = OrderedFloat(i64::MIN as f64);
-            const I64_MAX_TO_F: OrderedFloat<f64> = OrderedFloat(i64::MIN as f64);
+            const I64_MAX_TO_F: OrderedFloat<f64> = 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))
+            }
         }
     }
 }