From 12d8f2792a677e3e3beabec780cb2d93719095f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9F=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=20=5BArtyom=20Pavlov=5D?= Date: Sun, 29 Jul 2018 07:35:52 +0300 Subject: [PATCH] review update --- src/libcore/time.rs | 45 +++++++++++++++++++-------------------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/src/libcore/time.rs b/src/libcore/time.rs index fcd2726b84dea..56e45146f5911 100644 --- a/src/libcore/time.rs +++ b/src/libcore/time.rs @@ -21,10 +21,9 @@ //! assert_eq!(Duration::new(5, 0), Duration::from_secs(5)); //! ``` -use fmt; +use {fmt, u64}; use iter::Sum; use ops::{Add, Sub, Mul, Div, AddAssign, SubAssign, MulAssign, DivAssign}; -use {u64, u128}; const NANOS_PER_SEC: u32 = 1_000_000_000; const NANOS_PER_MILLI: u32 = 1_000_000; @@ -517,22 +516,20 @@ impl Mul for Duration { fn mul(self, rhs: f64) -> Duration { const NPS: f64 = NANOS_PER_SEC as f64; + if rhs.is_sign_negative() { + panic!("duration can not be multiplied by negative float"); + } let nanos_f64 = rhs * (NPS * (self.secs as f64) + (self.nanos as f64)); if !nanos_f64.is_finite() { panic!("got non-finite value when multiplying duration by float"); } - if nanos_f64 > (u128::MAX as f64) { + if nanos_f64 > ((u64::MAX as u128)*(NANOS_PER_SEC as u128)) as f64 { panic!("overflow when multiplying duration by float"); }; let nanos_u128 = nanos_f64 as u128; - let secs = nanos_u128 / (NANOS_PER_SEC as u128); - let nanos = nanos_u128 % (NANOS_PER_SEC as u128); - if secs > (u64::MAX as u128) { - panic!("overflow when multiplying duration by float"); - } Duration { - secs: secs as u64, - nanos: nanos as u32, + secs: (nanos_u128 / (NANOS_PER_SEC as u128)) as u64, + nanos: (nanos_u128 % (NANOS_PER_SEC as u128)) as u32, } } } @@ -543,22 +540,20 @@ impl Mul for f64 { fn mul(self, rhs: Duration) -> Duration { const NPS: f64 = NANOS_PER_SEC as f64; + if self.is_sign_negative() { + panic!("duration can not be multiplied by negative float"); + } let nanos_f64 = self * (NPS * (rhs.secs as f64) + (rhs.nanos as f64)); if !nanos_f64.is_finite() { panic!("got non-finite value when multiplying float by duration"); } - if nanos_f64 > (u128::MAX as f64) { + if nanos_f64 > ((u64::MAX as u128)*(NANOS_PER_SEC as u128)) as f64 { panic!("overflow when multiplying float by duration"); }; let nanos_u128 = nanos_f64 as u128; - let secs = nanos_u128 / (NANOS_PER_SEC as u128); - let nanos = nanos_u128 % (NANOS_PER_SEC as u128); - if secs > (u64::MAX as u128) { - panic!("overflow when multiplying float by duration"); - } Duration { - secs: secs as u64, - nanos: nanos as u32, + secs: (nanos_u128 / (NANOS_PER_SEC as u128)) as u64, + nanos: (nanos_u128 % (NANOS_PER_SEC as u128)) as u32, } } } @@ -592,22 +587,20 @@ impl Div for Duration { fn div(self, rhs: f64) -> Duration { const NPS: f64 = NANOS_PER_SEC as f64; + if rhs.is_sign_negative() { + panic!("duration can not be divided by negative float"); + } let nanos_f64 = (NPS * (self.secs as f64) + (self.nanos as f64)) / rhs; if !nanos_f64.is_finite() { panic!("got non-finite value when dividing duration by float"); } - if nanos_f64 > (u128::MAX as f64) { + if nanos_f64 > ((u64::MAX as u128)*(NANOS_PER_SEC as u128)) as f64 { panic!("overflow when dividing duration by float"); }; let nanos_u128 = nanos_f64 as u128; - let secs = nanos_u128 / (NANOS_PER_SEC as u128); - let nanos = nanos_u128 % (NANOS_PER_SEC as u128); - if secs > (u64::MAX as u128) { - panic!("overflow when dividing duration by float"); - } Duration { - secs: secs as u64, - nanos: nanos as u32, + secs: (nanos_u128 / (NANOS_PER_SEC as u128)) as u64, + nanos: (nanos_u128 % (NANOS_PER_SEC as u128)) as u32, } } }