goprotobuf: Fix text formatting of typed nil.
R=adg
CC=golang-dev
https://codereview.appspot.com/7223057
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 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 @@
}
// 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 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()