diff options
author | David Symonds <dsymonds@golang.org> | 2013-01-30 17:07:26 +1100 |
---|---|---|
committer | David Symonds <dsymonds@golang.org> | 2013-01-30 17:07:26 +1100 |
commit | 6e8ab8784338b90a5e515346a6193852f33d397b (patch) | |
tree | 53ca74392fa2bf4691b7dda92b0a9eb558f6b326 | |
parent | e182aafb024b07fe021c8311f4c42ef0772c058d (diff) | |
download | protobuf-6e8ab8784338b90a5e515346a6193852f33d397b.tar.gz |
goprotobuf: Fix text formatting of typed nil.
R=adg
CC=golang-dev
https://codereview.appspot.com/7223057
-rw-r--r-- | proto/text.go | 5 | ||||
-rw-r--r-- | proto/text_test.go | 14 |
2 files changed, 17 insertions, 2 deletions
diff --git a/proto/text.go b/proto/text.go index fc3763e..64a4ae7 100644 --- a/proto/text.go +++ b/proto/text.go @@ -615,7 +615,8 @@ func (w *textWriter) writeIndent() { } func marshalText(w io.Writer, pb Message, compact bool) error { - if pb == nil { + val := reflect.ValueOf(pb) + if pb == nil || val.IsNil() { w.Write([]byte("<nil>")) return nil } @@ -632,7 +633,7 @@ func marshalText(w io.Writer, pb Message, compact bool) error { } // Dereference the received pointer so we don't have outer < and >. - v := reflect.Indirect(reflect.ValueOf(pb)) + v := reflect.Indirect(val) if err := writeStruct(aw, v); err != nil { return err } diff --git a/proto/text_test.go b/proto/text_test.go index 69ae0cc..4904295 100644 --- a/proto/text_test.go +++ b/proto/text_test.go @@ -152,6 +152,20 @@ func TestMarshalText(t *testing.T) { } } +func TestMarshalTextNil(t *testing.T) { + want := "<nil>" + tests := []proto.Message{nil, (*pb.MyMessage)(nil)} + for i, test := range tests { + buf := new(bytes.Buffer) + if err := proto.MarshalText(buf, test); err != nil { + t.Fatal(err) + } + if got := buf.String(); got != want { + t.Errorf("%d: got %q want %q", i, got, want) + } + } +} + func BenchmarkMarshalTextBuffered(b *testing.B) { buf := new(bytes.Buffer) m := newTestMessage() |