Commit 115066fd authored by Ian Lance Taylor's avatar Ian Lance Taylor

Fix printing of named floating point types.

Try to avoid infinite recursion if String fails due to
printing a bad type.

Add test for String method with named basic types.

R=r
CC=golang-dev
https://golang.org/cl/207102
parent fba50ee5
...@@ -412,7 +412,7 @@ func getFloat32(a interface{}) (val float32, ok bool) { ...@@ -412,7 +412,7 @@ func getFloat32(a interface{}) (val float32, ok bool) {
} }
} }
// Must be a renamed floating-point type. // Must be a renamed floating-point type.
switch f := a.(type) { switch f := reflect.NewValue(a).(type) {
case *reflect.Float32Value: case *reflect.Float32Value:
return float32(f.Get()), true return float32(f.Get()), true
case *reflect.FloatValue: case *reflect.FloatValue:
...@@ -434,7 +434,7 @@ func getFloat64(a interface{}) (val float64, ok bool) { ...@@ -434,7 +434,7 @@ func getFloat64(a interface{}) (val float64, ok bool) {
} }
} }
// Must be a renamed floating-point type. // Must be a renamed floating-point type.
switch f := a.(type) { switch f := reflect.NewValue(a).(type) {
case *reflect.Float64Value: case *reflect.Float64Value:
return float64(f.Get()), true return float64(f.Get()), true
case *reflect.FloatValue: case *reflect.FloatValue:
...@@ -476,7 +476,7 @@ func (p *pp) unknownType(v interface{}) { ...@@ -476,7 +476,7 @@ func (p *pp) unknownType(v interface{}) {
} }
func (p *pp) printField(field interface{}, plus, sharp bool, depth int) (was_string bool) { func (p *pp) printField(field interface{}, plus, sharp bool, depth int) (was_string bool) {
if field != nil { if field != nil && depth >= 0 {
switch { switch {
default: default:
if stringer, ok := field.(Stringer); ok { if stringer, ok := field.(Stringer); ok {
...@@ -948,7 +948,7 @@ func (p *pp) doprintf(format string, a []interface{}) { ...@@ -948,7 +948,7 @@ func (p *pp) doprintf(format string, a []interface{}) {
p.buf.WriteString(reflect.Typeof(field).String()) p.buf.WriteString(reflect.Typeof(field).String())
p.buf.WriteByte('=') p.buf.WriteByte('=')
} }
p.printField(field, false, false, 0) p.printField(field, false, false, -1)
p.buf.WriteByte(')') p.buf.WriteByte(')')
} }
} }
......
// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package fmt_test
import (
. "fmt"
"testing"
)
type TI int
type TI8 int8
type TI16 int16
type TI32 int32
type TI64 int64
type TU uint
type TU8 uint8
type TU16 uint16
type TU32 uint32
type TU64 uint64
type TUI uintptr
type TF float
type TF32 float32
type TF64 float64
type TB bool
type TS string
func (v TI) String() string { return Sprintf("I: %d", v) }
func (v TI8) String() string { return Sprintf("I8: %d", v) }
func (v TI16) String() string { return Sprintf("I16: %d", v) }
func (v TI32) String() string { return Sprintf("I32: %d", v) }
func (v TI64) String() string { return Sprintf("I64: %d", v) }
func (v TU) String() string { return Sprintf("U: %d", v) }
func (v TU8) String() string { return Sprintf("U8: %d", v) }
func (v TU16) String() string { return Sprintf("U16: %d", v) }
func (v TU32) String() string { return Sprintf("U32: %d", v) }
func (v TU64) String() string { return Sprintf("U64: %d", v) }
func (v TUI) String() string { return Sprintf("UI: %d", v) }
func (v TF) String() string { return Sprintf("F: %f", v) }
func (v TF32) String() string { return Sprintf("F32: %f", v) }
func (v TF64) String() string { return Sprintf("F64: %f", v) }
func (v TB) String() string { return Sprintf("B: %t", v) }
func (v TS) String() string { return Sprintf("S: %q", v) }
func check(t *testing.T, got, want string) {
if got != want {
t.Error(got, "!=", want)
}
}
func TestStringer(t *testing.T) {
s := Sprintf("%v %v %v %v %v", TI(0), TI8(1), TI16(2), TI32(3), TI64(4))
check(t, s, "I: 0 I8: 1 I16: 2 I32: 3 I64: 4")
s = Sprintf("%v %v %v %v %v %v", TU(5), TU8(6), TU16(7), TU32(8), TU64(9), TUI(10))
check(t, s, "U: 5 U8: 6 U16: 7 U32: 8 U64: 9 UI: 10")
s = Sprintf("%v %v %v", TF(1.0), TF32(2.0), TF64(3.0))
check(t, s, "F: 1.000000 F32: 2.000000 F64: 3.000000")
s = Sprintf("%v %v", TB(true), TS("x"))
check(t, s, "B: true S: \"x\"")
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment