File tree Expand file tree Collapse file tree 5 files changed +16
-32
lines changed Expand file tree Collapse file tree 5 files changed +16
-32
lines changed Original file line number Diff line number Diff line change @@ -23,7 +23,7 @@ refs/tags/0.9: 36870b185fc5f5486636d4515f0e22677493f225
23
23
refs/tags/0.10: ac33f2b15782272ae348dbd7b14b8257b2148b5a
24
24
refs/tags/0.11.0: e1247cb1d0d681be034adb4b558b5a0c0d5720f9
25
25
refs/tags/0.12.0: f0c419429ef30723ceaf6b42f9b5a2aeb5d2e2d1
26
- refs/heads/beta: 9da7706dd64bbf055e3f32fe12286a521d8ac7ac
26
+ refs/heads/beta: 224023dfd167afca95665ebf9f927fa1c301f950
27
27
refs/tags/1.0.0-alpha: e42bd6d93a1d3433c486200587f8f9e12590a4d7
28
28
refs/heads/tmp: 370fe2786109360f7c35b8ba552b83b773dd71d6
29
29
refs/tags/1.0.0-alpha.2: 4c705f6bc559886632d3871b04f58aab093bfa2f
Original file line number Diff line number Diff line change @@ -537,21 +537,25 @@ macro_rules! int_impl {
537
537
let mut base = self ;
538
538
let mut acc = Self :: one( ) ;
539
539
540
- while exp > 1 {
540
+ let mut prev_base = self ;
541
+ let mut base_oflo = false ;
542
+ while exp > 0 {
541
543
if ( exp & 1 ) == 1 {
542
- acc = acc * base;
544
+ if base_oflo {
545
+ // ensure overflow occurs in the same manner it
546
+ // would have otherwise (i.e. signal any exception
547
+ // it would have otherwise).
548
+ acc = acc * ( prev_base * prev_base) ;
549
+ } else {
550
+ acc = acc * base;
551
+ }
543
552
}
553
+ prev_base = base;
554
+ let ( new_base, new_base_oflo) = base. overflowing_mul( base) ;
555
+ base = new_base;
556
+ base_oflo = new_base_oflo;
544
557
exp /= 2 ;
545
- base = base * base;
546
- }
547
-
548
- // Deal with the final bit of the exponent separately, since
549
- // squaring the base afterwards is not necessary and may cause a
550
- // needless overflow.
551
- if exp == 1 {
552
- acc = acc * base;
553
558
}
554
-
555
559
acc
556
560
}
557
561
Original file line number Diff line number Diff line change @@ -954,7 +954,6 @@ mod tests {
954
954
assert ! ( kind == ErrorKind :: WouldBlock || kind == ErrorKind :: TimedOut ) ;
955
955
} ) ;
956
956
assert ! ( wait > Duration :: from_millis( 400 ) ) ;
957
- assert ! ( wait < Duration :: from_millis( 1600 ) ) ;
958
957
}
959
958
960
959
#[ test]
@@ -977,6 +976,5 @@ mod tests {
977
976
assert ! ( kind == ErrorKind :: WouldBlock || kind == ErrorKind :: TimedOut ) ;
978
977
} ) ;
979
978
assert ! ( wait > Duration :: from_millis( 400 ) ) ;
980
- assert ! ( wait < Duration :: from_millis( 1600 ) ) ;
981
979
}
982
980
}
Original file line number Diff line number Diff line change @@ -379,7 +379,6 @@ mod tests {
379
379
assert ! ( kind == ErrorKind :: WouldBlock || kind == ErrorKind :: TimedOut ) ;
380
380
} ) ;
381
381
assert ! ( wait > Duration :: from_millis( 400 ) ) ;
382
- assert ! ( wait < Duration :: from_millis( 1600 ) ) ;
383
382
}
384
383
385
384
#[ test]
@@ -400,6 +399,5 @@ mod tests {
400
399
assert ! ( kind == ErrorKind :: WouldBlock || kind == ErrorKind :: TimedOut ) ;
401
400
} ) ;
402
401
assert ! ( wait > Duration :: from_millis( 400 ) ) ;
403
- assert ! ( wait < Duration :: from_millis( 1600 ) ) ;
404
402
}
405
403
}
Load Diff This file was deleted.
You can’t perform that action at this time.
0 commit comments