goprotobuf: Handle XXX_unrecognized correctly.
In particular,
- add it to marshaled messages
- examine it in Clone, Equal
R=r
CC=golang-dev
http://codereview.appspot.com/6449091
diff --git a/proto/clone.go b/proto/clone.go
index a48f3bc..b23f46b 100644
--- a/proto/clone.go
+++ b/proto/clone.go
@@ -43,8 +43,8 @@
// Clone returns a deep copy of a protocol buffer.
func Clone(pb Message) Message {
in := reflect.ValueOf(pb)
- if in.Kind() != reflect.Ptr || in.Elem().Kind() != reflect.Struct {
- return nil
+ if in.IsNil() {
+ return pb
}
out := reflect.New(in.Type().Elem())
@@ -66,12 +66,17 @@
copyExtension(emOut.ExtensionMap(), emIn.ExtensionMap())
}
- // TODO: Deal with XXX_unrecognized.
+ uin := in.FieldByName("XXX_unrecognized").Bytes()
+ if len(uin) > 0 {
+ out.FieldByName("XXX_unrecognized").SetBytes(append([]byte(nil), uin...))
+ }
}
func copyAny(out, in reflect.Value) {
if in.Type() == protoMessageType {
- out.Set(reflect.ValueOf(Clone(in.Interface().(Message))))
+ if !in.IsNil() {
+ out.Set(reflect.ValueOf(Clone(in.Interface().(Message))))
+ }
return
}
switch in.Kind() {