about summary refs log tree commit diff
diff options
context:
space:
mode:
authorАртём Павлов [Artyom Pavlov] <newpavlov@gmail.com>2018-07-29 07:35:52 +0300
committerАртём Павлов [Artyom Pavlov] <newpavlov@gmail.com>2018-07-29 07:35:52 +0300
commit12d8f2792a677e3e3beabec780cb2d93719095f8 (patch)
tree0437312df72962c6e105db0bd44dc32b60bdb76e
parentc24fb126e7cdd73163af67c264bf626aebbeee84 (diff)
downloadrust-12d8f2792a677e3e3beabec780cb2d93719095f8.tar.gz
rust-12d8f2792a677e3e3beabec780cb2d93719095f8.zip
review update
-rw-r--r--src/libcore/time.rs45
1 files changed, 19 insertions, 26 deletions
diff --git a/src/libcore/time.rs b/src/libcore/time.rs
index fcd2726b84d..56e45146f59 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<f64> 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<Duration> 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<f64> 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,
         }
     }
 }