]> Repositorios git - scryer-prolog.git/commitdiff
solve overflow of left arithmetic shift (#518)
authorMark Thom <[email protected]>
Sun, 17 May 2020 18:20:22 +0000 (12:20 -0600)
committerMark Thom <[email protected]>
Sun, 17 May 2020 18:20:22 +0000 (12:20 -0600)
src/prolog/machine/arithmetic_ops.rs

index f51785bd6fff6c94b7232a887a508b5ac7eb0e7b..d237ca95e195595480262ba869970e0cf5de8ec8 100644 (file)
@@ -722,18 +722,12 @@ impl MachineState {
 
         match (n1, n2) {
             (Number::Fixnum(n1), Number::Fixnum(n2)) => {
-                if let Ok(n2) = u32::try_from(n2) {
-                    if let Some(result) = n1.checked_shr(n2) {
-                        return Ok(Number::from(result));
-                    }
-                }
-
                 let n1 = Integer::from(n1);
-                let n2 = Integer::from(n2);
 
-                match n2.to_u32() {
-                    Some(n2) => Ok(Number::from(n1 >> n2)),
-                    _ => Ok(Number::from(n1 >> u32::max_value())),
+                if let Ok(n2) = u32::try_from(n2) {
+                    return Ok(Number::from(n1 >> n2));
+                } else {
+                    return Ok(Number::from(n1 >> u32::max_value()));
                 }
             }
             (Number::Fixnum(n1), Number::Integer(n2)) => {
@@ -780,23 +774,12 @@ impl MachineState {
 
         match (n1, n2) {
             (Number::Fixnum(n1), Number::Fixnum(n2)) => {
-                if let Ok(n2) = u32::try_from(n2) {
-                    if n2 < 63 {
-                        if let Some(result) = n1.checked_shl(n2) {
-                            return Ok(Number::from(result));
-                        }
-                    } else {
-                        let n1 = Integer::from(n1);
-                        return Ok(Number::from(n1 << n2));
-                    }
-                }
-
                 let n1 = Integer::from(n1);
-                let n2 = Integer::from(n2);
 
-                match n2.to_u32() {
-                    Some(n2) => Ok(Number::from(n1 << n2)),
-                    _ => Ok(Number::from(n1 << u32::max_value())),
+                if let Ok(n2) = u32::try_from(n2) {
+                    return Ok(Number::from(n1 << n2));
+                } else {
+                    return Ok(Number::from(n1 << u32::max_value()));
                 }
             }
             (Number::Fixnum(n1), Number::Integer(n2)) => {