From efa8d6230946b1b2da4158d08b72bf50b5cc85c5 Mon Sep 17 00:00:00 2001 From: Jeong YunWon Date: Sun, 9 Aug 2020 18:57:43 +0900 Subject: [PATCH] Move more funcitons into float_ops --- common/src/float_ops.rs | 38 ++++++++++++++++++++++++++++++++++++++ vm/src/obj/objfloat.rs | 33 +++++++-------------------------- 2 files changed, 45 insertions(+), 26 deletions(-) diff --git a/common/src/float_ops.rs b/common/src/float_ops.rs index d7ebadee2..75bbcb3e1 100644 --- a/common/src/float_ops.rs +++ b/common/src/float_ops.rs @@ -176,6 +176,44 @@ pub fn to_hex(value: f64) -> String { } } +pub fn div(v1: f64, v2: f64) -> Option { + if v2 != 0.0 { + Some(v1 / v2) + } else { + None + } +} + +pub fn mod_(v1: f64, v2: f64) -> Option { + if v2 != 0.0 { + Some(v1 % v2) + } else { + None + } +} + +pub fn floordiv(v1: f64, v2: f64) -> Option { + if v2 != 0.0 { + Some((v1 / v2).floor()) + } else { + None + } +} + +pub fn divmod(v1: f64, v2: f64) -> Option<(f64, f64)> { + if v2 != 0.0 { + let mut m = v1 % v2; + let mut d = (v1 - m) / v2; + if v2.is_sign_negative() != m.is_sign_negative() { + m += v2; + d -= 1.0; + } + Some((d, m)) + } else { + None + } +} + #[test] fn test_to_hex() { use rand::Rng; diff --git a/vm/src/obj/objfloat.rs b/vm/src/obj/objfloat.rs index a8a0c0baa..ad3fc5697 100644 --- a/vm/src/obj/objfloat.rs +++ b/vm/src/obj/objfloat.rs @@ -76,19 +76,13 @@ macro_rules! impl_try_from_object_float { impl_try_from_object_float!(f32, f64); fn inner_div(v1: f64, v2: f64, vm: &VirtualMachine) -> PyResult { - if v2 != 0.0 { - Ok(v1 / v2) - } else { - Err(vm.new_zero_division_error("float division by zero".to_owned())) - } + float_ops::div(v1, v2) + .ok_or_else(|| vm.new_zero_division_error("float division by zero".to_owned())) } fn inner_mod(v1: f64, v2: f64, vm: &VirtualMachine) -> PyResult { - if v2 != 0.0 { - Ok(v1 % v2) - } else { - Err(vm.new_zero_division_error("float mod by zero".to_owned())) - } + float_ops::mod_(v1, v2) + .ok_or_else(|| vm.new_zero_division_error("float mod by zero".to_owned())) } pub fn try_bigint(value: f64, vm: &VirtualMachine) -> PyResult { @@ -114,25 +108,12 @@ pub fn try_bigint(value: f64, vm: &VirtualMachine) -> PyResult { } fn inner_floordiv(v1: f64, v2: f64, vm: &VirtualMachine) -> PyResult { - if v2 != 0.0 { - Ok((v1 / v2).floor()) - } else { - Err(vm.new_zero_division_error("float floordiv by zero".to_owned())) - } + float_ops::floordiv(v1, v2) + .ok_or_else(|| vm.new_zero_division_error("float floordiv by zero".to_owned())) } fn inner_divmod(v1: f64, v2: f64, vm: &VirtualMachine) -> PyResult<(f64, f64)> { - if v2 != 0.0 { - let mut m = v1 % v2; - let mut d = (v1 - m) / v2; - if v2.is_sign_negative() != m.is_sign_negative() { - m += v2; - d -= 1.0; - } - Ok((d, m)) - } else { - Err(vm.new_zero_division_error("float divmod()".to_owned())) - } + float_ops::divmod(v1, v2).ok_or_else(|| vm.new_zero_division_error("float divmod()".to_owned())) } pub fn float_pow(v1: f64, v2: f64, vm: &VirtualMachine) -> PyResult {