]> Cypherpunks repositories - gostls13.git/commitdiff
Revert "time: optimize Sub"
authorJoe Tsai <thebrokentoaster@gmail.com>
Fri, 16 Aug 2019 03:16:34 +0000 (03:16 +0000)
committerJoe Tsai <thebrokentoaster@gmail.com>
Fri, 16 Aug 2019 17:01:35 +0000 (17:01 +0000)
This reverts commit CL 131196 because there is a bug
in the calculation of nanoseconds.

Fixes #33677

Change-Id: Ic8e94c547ee29b8aeda1b9a5cb9764dbf47b14b4
Reviewed-on: https://go-review.googlesource.com/c/go/+/190497
Run-TryBot: Andrew Bonventre <andybons@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com>
Reviewed-by: Andrew Bonventre <andybons@golang.org>
src/time/time.go
src/time/time_test.go

index c8116a74f43b78ff51d9a8843d0656a2561b7d2c..0d1cb9e5a153cda1dd3e71ee0ae11736dbe185f9 100644 (file)
@@ -906,33 +906,16 @@ func (t Time) Sub(u Time) Duration {
                }
                return d
        }
-
-       ts, us := t.sec(), u.sec()
-
-       var sec, nsec, d int64
-
-       ssub := ts - us
-       if (ssub < ts) != (us > 0) {
-               goto overflow
-       }
-
-       if ssub < int64(minDuration/Second) || ssub > int64(maxDuration/Second) {
-               goto overflow
-       }
-       sec = ssub * int64(Second)
-
-       nsec = int64(t.nsec() - u.nsec())
-       d = sec + nsec
-       if (d > sec) != (nsec > 0) {
-               goto overflow
-       }
-       return Duration(d)
-
-overflow:
-       if t.Before(u) {
+       d := Duration(t.sec()-u.sec())*Second + Duration(t.nsec()-u.nsec())
+       // Check for overflow or underflow.
+       switch {
+       case u.Add(d).Equal(t):
+               return d // d is correct
+       case t.Before(u):
                return minDuration // t - u is negative out of range
+       default:
+               return maxDuration // t - u is positive out of range
        }
-       return maxDuration // t - u is positive out of range
 }
 
 // Since returns the time elapsed since t.
index dd3a8160cd86d7c706d9ad5d462c0db210c08f4c..0ac3c3a27fae338c61476ee7cd7c043efc039b70 100644 (file)
@@ -690,7 +690,7 @@ var gobTests = []Time{
        Date(0, 1, 2, 3, 4, 5, 6, UTC),
        Date(7, 8, 9, 10, 11, 12, 13, FixedZone("", 0)),
        Unix(81985467080890095, 0x76543210), // Time.sec: 0x0123456789ABCDEF
-       {},                                  // nil location
+       {}, // nil location
        Date(1, 2, 3, 4, 5, 6, 7, FixedZone("", 32767*60)),
        Date(1, 2, 3, 4, 5, 6, 7, FixedZone("", -32768*60)),
 }
@@ -1008,14 +1008,6 @@ func TestSub(t *testing.T) {
        }
 }
 
-func BenchmarkSub(b *testing.B) {
-       for i := 0; i < b.N; i++ {
-               for _, st := range subTests {
-                       st.t.Sub(st.u)
-               }
-       }
-}
-
 var nsDurationTests = []struct {
        d    Duration
        want int64