From 9f3351469d4c239570bebccc7465e1ce0db1e175 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Sun, 17 May 2020 12:20:22 -0600 Subject: [PATCH] solve overflow of left arithmetic shift (#518) --- src/prolog/machine/arithmetic_ops.rs | 33 +++++++--------------------- 1 file changed, 8 insertions(+), 25 deletions(-) diff --git a/src/prolog/machine/arithmetic_ops.rs b/src/prolog/machine/arithmetic_ops.rs index f51785bd..d237ca95 100644 --- a/src/prolog/machine/arithmetic_ops.rs +++ b/src/prolog/machine/arithmetic_ops.rs @@ -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)) => { -- 2.54.0