From c2047754c300b68c05d65faa8dc2925fe67b71b4 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sat, 14 Jan 2017 00:05:42 +0000 Subject: libgo: update to Go 1.8 release candidate 1 Compiler changes: * Change map assignment to use mapassign and assign value directly. * Change string iteration to use decoderune, faster for ASCII strings. * Change makeslice to take int, and use makeslice64 for larger values. * Add new noverflow field to hmap struct used for maps. Unresolved problems, to be fixed later: * Commented out test in go/types/sizes_test.go that doesn't compile. * Commented out reflect.TestStructOf test for padding after zero-sized field. Reviewed-on: https://go-review.googlesource.com/35231 gotools/: Updates for Go 1.8rc1. * Makefile.am (go_cmd_go_files): Add bug.go. (s-zdefaultcc): Write defaultPkgConfig. * Makefile.in: Rebuild. From-SVN: r244456 --- libgo/go/flag/export_test.go | 1 + libgo/go/flag/flag.go | 37 ++++++++++++++++++++++++------------- 2 files changed, 25 insertions(+), 13 deletions(-) (limited to 'libgo/go/flag') diff --git a/libgo/go/flag/export_test.go b/libgo/go/flag/export_test.go index 12d3dc7..edbe83c 100644 --- a/libgo/go/flag/export_test.go +++ b/libgo/go/flag/export_test.go @@ -13,5 +13,6 @@ import "os" // exit the program. func ResetForTesting(usage func()) { CommandLine = NewFlagSet(os.Args[0], ContinueOnError) + CommandLine.Usage = commandLineUsage Usage = usage } diff --git a/libgo/go/flag/flag.go b/libgo/go/flag/flag.go index fa0f05e..bbbc55a 100644 --- a/libgo/go/flag/flag.go +++ b/libgo/go/flag/flag.go @@ -94,7 +94,7 @@ func (b *boolValue) Set(s string) error { func (b *boolValue) Get() interface{} { return bool(*b) } -func (b *boolValue) String() string { return fmt.Sprintf("%v", *b) } +func (b *boolValue) String() string { return strconv.FormatBool(bool(*b)) } func (b *boolValue) IsBoolFlag() bool { return true } @@ -121,7 +121,7 @@ func (i *intValue) Set(s string) error { func (i *intValue) Get() interface{} { return int(*i) } -func (i *intValue) String() string { return fmt.Sprintf("%v", *i) } +func (i *intValue) String() string { return strconv.Itoa(int(*i)) } // -- int64 Value type int64Value int64 @@ -139,7 +139,7 @@ func (i *int64Value) Set(s string) error { func (i *int64Value) Get() interface{} { return int64(*i) } -func (i *int64Value) String() string { return fmt.Sprintf("%v", *i) } +func (i *int64Value) String() string { return strconv.FormatInt(int64(*i), 10) } // -- uint Value type uintValue uint @@ -157,7 +157,7 @@ func (i *uintValue) Set(s string) error { func (i *uintValue) Get() interface{} { return uint(*i) } -func (i *uintValue) String() string { return fmt.Sprintf("%v", *i) } +func (i *uintValue) String() string { return strconv.FormatUint(uint64(*i), 10) } // -- uint64 Value type uint64Value uint64 @@ -175,7 +175,7 @@ func (i *uint64Value) Set(s string) error { func (i *uint64Value) Get() interface{} { return uint64(*i) } -func (i *uint64Value) String() string { return fmt.Sprintf("%v", *i) } +func (i *uint64Value) String() string { return strconv.FormatUint(uint64(*i), 10) } // -- string Value type stringValue string @@ -192,7 +192,7 @@ func (s *stringValue) Set(val string) error { func (s *stringValue) Get() interface{} { return string(*s) } -func (s *stringValue) String() string { return fmt.Sprintf("%s", *s) } +func (s *stringValue) String() string { return string(*s) } // -- float64 Value type float64Value float64 @@ -210,7 +210,7 @@ func (f *float64Value) Set(s string) error { func (f *float64Value) Get() interface{} { return float64(*f) } -func (f *float64Value) String() string { return fmt.Sprintf("%v", *f) } +func (f *float64Value) String() string { return strconv.FormatFloat(float64(*f), 'g', -1, 64) } // -- time.Duration Value type durationValue time.Duration @@ -238,6 +238,8 @@ func (d *durationValue) String() string { return (*time.Duration)(d).String() } // rather than using the next command-line argument. // // Set is called once, in command line order, for each flag present. +// The flag package may call the String method with a zero-valued receiver, +// such as a nil pointer. type Value interface { String() string Set(string) error @@ -500,7 +502,7 @@ func PrintDefaults() { } // defaultUsage is the default function to print a usage message. -func defaultUsage(f *FlagSet) { +func (f *FlagSet) defaultUsage() { if f.name == "" { fmt.Fprintf(f.out(), "Usage:\n") } else { @@ -819,11 +821,7 @@ func (f *FlagSet) failf(format string, a ...interface{}) error { // or the appropriate default usage function otherwise. func (f *FlagSet) usage() { if f.Usage == nil { - if f == CommandLine { - Usage() - } else { - defaultUsage(f) - } + f.defaultUsage() } else { f.Usage() } @@ -953,6 +951,18 @@ func Parsed() bool { // methods of CommandLine. var CommandLine = NewFlagSet(os.Args[0], ExitOnError) +func init() { + // Override generic FlagSet default Usage with call to global Usage. + // Note: This is not CommandLine.Usage = Usage, + // because we want any eventual call to use any updated value of Usage, + // not the value it has when this line is run. + CommandLine.Usage = commandLineUsage +} + +func commandLineUsage() { + Usage() +} + // NewFlagSet returns a new, empty flag set with the specified name and // error handling property. func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet { @@ -960,6 +970,7 @@ func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet { name: name, errorHandling: errorHandling, } + f.Usage = f.defaultUsage return f } -- cgit v1.1