]> Repositorios git - scryer-prolog.git/commitdiff
make indexer downcast Integers to Fixnums when possible, be slightly more judicious...
authorMark <[email protected]>
Thu, 29 Feb 2024 23:15:28 +0000 (16:15 -0700)
committerMark <[email protected]>
Thu, 29 Feb 2024 23:15:28 +0000 (16:15 -0700)
src/indexing.rs
src/machine/arithmetic_ops.rs
src/machine/dispatch.rs

index 5956dcfc99c5020eb5a874b383e9ec58a86d78b7..4eb39e2de50726c8afadd02cc354882ceff9408d 100644 (file)
@@ -1113,16 +1113,10 @@ pub(crate) fn constant_key_alternatives(
             constants.push(Literal::Atom(atom));
         }
         /*
+        // constant_to_literal takes care of the downward conversion from Integer to Fixnum
+        // if possible.
         Literal::Fixnum(ref n) => {
-            constants.push(Literal::Integer(arena_alloc!(n, arena))); //Rc::new(Integer::from(*n))));
-
-            /*
-            if *n >= 0 {
-                if let Ok(n) = usize::try_from(*n) {
-                    constants.push(Literal::Usize(n));
-                }
-            }
-            */
+            constants.push(Literal::Integer(arena_alloc!(n, arena)));
         }
         */
         Literal::Integer(ref n) => {
index 3de47a604741444f8cffd68634c6a8d6d4946fb7..8af9280cab3abd96f6e4f37c3f7d042c91d9fc00 100644 (file)
@@ -641,12 +641,10 @@ pub(crate) fn shr(n1: Number, n2: Number, arena: &mut Arena) -> Result<Number, M
             let n1_i = n1.get_num();
             let n2_i = n2.get_num();
 
-            let n1 = Integer::from(n1_i);
-
             if let Ok(n2) = usize::try_from(n2_i) {
-                Ok(Number::arena_from(n1 >> n2, arena))
+                Ok(Number::arena_from(n1_i >> n2, arena))
             } else {
-                Ok(Number::arena_from(n1 >> usize::max_value(), arena))
+                Ok(Number::arena_from(n1_i >> usize::max_value(), arena))
             }
         }
         (Number::Fixnum(n1), Number::Integer(n2)) => {
@@ -698,11 +696,10 @@ pub(crate) fn shl(n1: Number, n2: Number, arena: &mut Arena) -> Result<Number, M
             let n1_i = n1.get_num();
             let n2_i = n2.get_num();
 
-            let n1 = Integer::from(n1_i);
-
             if let Ok(n2) = usize::try_from(n2_i) {
-                Ok(Number::arena_from(n1 << n2, arena))
+                Ok(Number::arena_from(n1_i << n2, arena))
             } else {
+                let n1 = Integer::from(n1_i);
                 Ok(Number::arena_from(n1 << usize::max_value(), arena))
             }
         }
index ddd077a59ab6b8abc41a4b0f642f037fab1fb1d3..7fac89934a3e618404217f796becc99555c7ee35 100644 (file)
@@ -269,7 +269,16 @@ impl MachineState {
                         Literal::Rational(r)
                     }
                     (ArenaHeaderTag::Integer, n) => {
-                        Literal::Integer(n)
+                        let result = (&*n).try_into();
+
+                        match result {
+                            Ok(fixnum) => if let Ok(n) = Fixnum::build_with_checked(fixnum) {
+                                Literal::Fixnum(n)
+                            } else {
+                                Literal::Integer(n)
+                            },
+                            Err(_) => Literal::Integer(n)
+                        }
                     }
                     _ => {
                         unreachable!()