diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2014-07-19 08:53:52 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2014-07-19 08:53:52 +0000 |
commit | 00d86ac99f5dd6afa5bbd7c38ffe1c585edd2387 (patch) | |
tree | b988e32ea14a3dc1b4718b1fdfa47bab087ae96c /libgo/go/time | |
parent | bcf2fc6ee0a7edbe7de4299f28b66527c07bb0a2 (diff) | |
download | gcc-00d86ac99f5dd6afa5bbd7c38ffe1c585edd2387.zip gcc-00d86ac99f5dd6afa5bbd7c38ffe1c585edd2387.tar.gz gcc-00d86ac99f5dd6afa5bbd7c38ffe1c585edd2387.tar.bz2 |
libgo: Update to Go 1.3 release.
From-SVN: r212837
Diffstat (limited to 'libgo/go/time')
-rw-r--r-- | libgo/go/time/format.go | 9 | ||||
-rw-r--r-- | libgo/go/time/format_test.go | 1 | ||||
-rw-r--r-- | libgo/go/time/internal_test.go | 2 | ||||
-rw-r--r-- | libgo/go/time/sleep.go | 12 | ||||
-rw-r--r-- | libgo/go/time/sleep_test.go | 28 | ||||
-rw-r--r-- | libgo/go/time/sys_unix.go | 2 | ||||
-rw-r--r-- | libgo/go/time/tick.go | 3 | ||||
-rw-r--r-- | libgo/go/time/time.go | 2 | ||||
-rw-r--r-- | libgo/go/time/time_test.go | 1 | ||||
-rw-r--r-- | libgo/go/time/zoneinfo_read.go | 4 | ||||
-rw-r--r-- | libgo/go/time/zoneinfo_test.go | 10 | ||||
-rw-r--r-- | libgo/go/time/zoneinfo_unix.go | 2 | ||||
-rw-r--r-- | libgo/go/time/zoneinfo_windows.go | 2 |
13 files changed, 40 insertions, 38 deletions
diff --git a/libgo/go/time/format.go b/libgo/go/time/format.go index 6f92c12..9f210ea 100644 --- a/libgo/go/time/format.go +++ b/libgo/go/time/format.go @@ -102,7 +102,7 @@ const ( // std0x records the std values for "01", "02", ..., "06". var std0x = [...]int{stdZeroMonth, stdZeroDay, stdZeroHour12, stdZeroMinute, stdZeroSecond, stdYear} -// startsWithLowerCase reports whether the the string has a lower-case letter at the beginning. +// startsWithLowerCase reports whether the string has a lower-case letter at the beginning. // Its purpose is to prevent matching strings like "Month" when looking for "Mon". func startsWithLowerCase(str string) bool { if len(str) == 0 { @@ -1037,8 +1037,8 @@ func parseTimeZone(value string) (length int, ok bool) { if len(value) < 3 { return 0, false } - // Special case 1: This is the only zone with a lower-case letter. - if len(value) >= 4 && value[:4] == "ChST" { + // Special case 1: ChST and MeST are the only zones with a lower-case letter. + if len(value) >= 4 && (value[:4] == "ChST" || value[:4] == "MeST") { return 4, true } // Special case 2: GMT may have an hour offset; treat it specially. @@ -1240,5 +1240,8 @@ func ParseDuration(s string) (Duration, error) { if neg { f = -f } + if f < float64(-1<<63) || f > float64(1<<63-1) { + return 0, errors.New("time: overflow parsing duration") + } return Duration(f), nil } diff --git a/libgo/go/time/format_test.go b/libgo/go/time/format_test.go index 9327339..70e653e 100644 --- a/libgo/go/time/format_test.go +++ b/libgo/go/time/format_test.go @@ -333,6 +333,7 @@ var parseTimeZoneTests = []ParseTimeZoneTest{ {"GMT-5 hi there", 5, true}, {"GMT-51 hi there", 3, true}, {"ChST hi there", 4, true}, + {"MeST hi there", 4, true}, {"MSDx", 3, true}, {"MSDY", 0, false}, // four letters must end in T. {"ESAST hi", 5, true}, diff --git a/libgo/go/time/internal_test.go b/libgo/go/time/internal_test.go index 4ba6d47..2243d36 100644 --- a/libgo/go/time/internal_test.go +++ b/libgo/go/time/internal_test.go @@ -29,7 +29,7 @@ func CheckRuntimeTimerOverflow() error { // detection logic in NewTimer: we're testing the underlying // runtime.addtimer function. r := &runtimeTimer{ - when: nano() + (1<<63 - 1), + when: runtimeNano() + (1<<63 - 1), f: empty, arg: nil, } diff --git a/libgo/go/time/sleep.go b/libgo/go/time/sleep.go index 4f55beb..6a03f41 100644 --- a/libgo/go/time/sleep.go +++ b/libgo/go/time/sleep.go @@ -8,10 +8,8 @@ package time // A negative or zero duration causes Sleep to return immediately. func Sleep(d Duration) -func nano() int64 { - sec, nsec := now() - return sec*1e9 + int64(nsec) -} +// runtimeNano returns the current value of the runtime clock in nanoseconds. +func runtimeNano() int64 // Interface to timers implemented in package runtime. // Must be in sync with ../runtime/runtime.h:/^struct.Timer$ @@ -29,9 +27,9 @@ type runtimeTimer struct { // zero because of an overflow, MaxInt64 is returned. func when(d Duration) int64 { if d <= 0 { - return nano() + return runtimeNano() } - t := nano() + int64(d) + t := runtimeNano() + int64(d) if t < 0 { t = 1<<63 - 1 // math.MaxInt64 } @@ -92,7 +90,7 @@ func sendTime(now int64, c interface{}) { // the desired behavior when the reader gets behind, // because the sends are periodic. select { - case c.(chan Time) <- Unix(0, now): + case c.(chan Time) <- Now(): default: } } diff --git a/libgo/go/time/sleep_test.go b/libgo/go/time/sleep_test.go index e86e294..7c2dcaf 100644 --- a/libgo/go/time/sleep_test.go +++ b/libgo/go/time/sleep_test.go @@ -74,26 +74,13 @@ func benchmark(b *testing.B, bench func(n int)) { for i := 0; i < len(garbage); i++ { garbage[i] = AfterFunc(Hour, nil) } - - const batch = 1000 - P := runtime.GOMAXPROCS(-1) - N := int32(b.N / batch) - b.ResetTimer() - var wg sync.WaitGroup - wg.Add(P) - - for p := 0; p < P; p++ { - go func() { - for atomic.AddInt32(&N, -1) >= 0 { - bench(batch) - } - wg.Done() - }() - } - - wg.Wait() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + bench(1000) + } + }) b.StopTimer() for i := 0; i < len(garbage); i++ { @@ -361,19 +348,18 @@ func TestReset(t *testing.T) { // Test that sleeping for an interval so large it overflows does not // result in a short sleep duration. func TestOverflowSleep(t *testing.T) { - const timeout = 25 * Millisecond const big = Duration(int64(1<<63 - 1)) select { case <-After(big): t.Fatalf("big timeout fired") - case <-After(timeout): + case <-After(25 * Millisecond): // OK } const neg = Duration(-1 << 63) select { case <-After(neg): // OK - case <-After(timeout): + case <-After(1 * Second): t.Fatalf("negative timeout didn't fire") } } diff --git a/libgo/go/time/sys_unix.go b/libgo/go/time/sys_unix.go index 36c214b..379e13d 100644 --- a/libgo/go/time/sys_unix.go +++ b/libgo/go/time/sys_unix.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin dragonfly freebsd linux netbsd openbsd solaris +// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris package time diff --git a/libgo/go/time/tick.go b/libgo/go/time/tick.go index b92c339..1900784 100644 --- a/libgo/go/time/tick.go +++ b/libgo/go/time/tick.go @@ -17,6 +17,7 @@ type Ticker struct { // time with a period specified by the duration argument. // It adjusts the intervals or drops ticks to make up for slow receivers. // The duration d must be greater than zero; if not, NewTicker will panic. +// Stop the ticker to release associated resources. func NewTicker(d Duration) *Ticker { if d <= 0 { panic(errors.New("non-positive interval for NewTicker")) @@ -28,7 +29,7 @@ func NewTicker(d Duration) *Ticker { t := &Ticker{ C: c, r: runtimeTimer{ - when: nano() + int64(d), + when: when(d), period: int64(d), f: sendTime, arg: c, diff --git a/libgo/go/time/time.go b/libgo/go/time/time.go index c504df7..0a2b091 100644 --- a/libgo/go/time/time.go +++ b/libgo/go/time/time.go @@ -934,6 +934,8 @@ func (t *Time) GobDecode(data []byte) error { // The time is a quoted string in RFC 3339 format, with sub-second precision added if present. func (t Time) MarshalJSON() ([]byte, error) { if y := t.Year(); y < 0 || y >= 10000 { + // RFC 3339 is clear that years are 4 digits exactly. + // See golang.org/issue/4556#c15 for more discussion. return nil, errors.New("Time.MarshalJSON: year outside of range [0,9999]") } return []byte(t.Format(`"` + RFC3339Nano + `"`)), nil diff --git a/libgo/go/time/time_test.go b/libgo/go/time/time_test.go index 2615517..4ae7da5 100644 --- a/libgo/go/time/time_test.go +++ b/libgo/go/time/time_test.go @@ -842,6 +842,7 @@ var parseDurationTests = []struct { {"-.", false, 0}, {".s", false, 0}, {"+.s", false, 0}, + {"3000000h", false, 0}, // overflow } func TestParseDuration(t *testing.T) { diff --git a/libgo/go/time/zoneinfo_read.go b/libgo/go/time/zoneinfo_read.go index 4bb4bf6..de9ebb4 100644 --- a/libgo/go/time/zoneinfo_read.go +++ b/libgo/go/time/zoneinfo_read.go @@ -68,7 +68,7 @@ func loadZoneData(bytes []byte) (l *Location, err error) { // 1-byte version, then 15 bytes of padding var p []byte - if p = d.read(16); len(p) != 16 || p[0] != 0 && p[0] != '2' { + if p = d.read(16); len(p) != 16 || p[0] != 0 && p[0] != '2' && p[0] != '3' { return nil, badData } @@ -123,7 +123,7 @@ func loadZoneData(bytes []byte) (l *Location, err error) { return nil, badData } - // If version == 2, the entire file repeats, this time using + // If version == 2 or 3, the entire file repeats, this time using // 8-byte ints for txtimes and leap seconds. // We won't need those until 2106. diff --git a/libgo/go/time/zoneinfo_test.go b/libgo/go/time/zoneinfo_test.go index 03f54a6..ede5330 100644 --- a/libgo/go/time/zoneinfo_test.go +++ b/libgo/go/time/zoneinfo_test.go @@ -9,6 +9,16 @@ import ( "time" ) +func TestVersion3(t *testing.T) { + t.Skip("gccgo does not use the zip file") + time.ForceZipFileForTesting(true) + defer time.ForceZipFileForTesting(false) + _, err := time.LoadLocation("Asia/Jerusalem") + if err != nil { + t.Fatal(err) + } +} + // Test that we get the correct results for times before the first // transition time. To do this we explicitly check early dates in a // couple of specific timezones. diff --git a/libgo/go/time/zoneinfo_unix.go b/libgo/go/time/zoneinfo_unix.go index e70decb..3fe8e55 100644 --- a/libgo/go/time/zoneinfo_unix.go +++ b/libgo/go/time/zoneinfo_unix.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin dragonfly freebsd linux netbsd openbsd solaris +// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris // Parse "zoneinfo" time zone file. // This is a fairly standard file format used on OS X, Linux, BSD, Sun, and others. diff --git a/libgo/go/time/zoneinfo_windows.go b/libgo/go/time/zoneinfo_windows.go index 377a892..6046743 100644 --- a/libgo/go/time/zoneinfo_windows.go +++ b/libgo/go/time/zoneinfo_windows.go @@ -90,7 +90,7 @@ func toEnglishName(stdname, dstname string) (string, error) { return "", errors.New(`English name for time zone "` + stdname + `" not found in registry`) } -// extractCAPS exracts capital letters from description desc. +// extractCAPS extracts capital letters from description desc. func extractCAPS(desc string) string { var short []rune for _, c := range desc { |