goprotobuf: Fix proto.Clone handling of extensions.
R=r
CC=golang-dev
http://codereview.appspot.com/5093043
diff --git a/proto/clone.go b/proto/clone.go
index 5cc3bb1..05fb388 100644
--- a/proto/clone.go
+++ b/proto/clone.go
@@ -62,9 +62,9 @@
copyAny(out.Field(i), in.Field(i))
}
- if emIn := in.FieldByName("XXX_extensions"); emIn.IsValid() {
- emOut := out.FieldByName("XXX_extensions")
- copyExtension(emOut.Interface().(map[int32]Extension), emIn.Interface().(map[int32]Extension))
+ if emIn, ok := in.Addr().Interface().(extendableProto); ok {
+ emOut := out.Addr().Interface().(extendableProto)
+ copyExtension(emOut.ExtensionMap(), emIn.ExtensionMap())
}
// TODO: Deal with XXX_unrecognized.
@@ -108,8 +108,9 @@
for extNum, eIn := range in {
eOut := Extension{desc: eIn.desc}
if eIn.value != nil {
- eOut.value = reflect.Zero(reflect.TypeOf(eIn.value))
- copyAny(reflect.ValueOf(eOut.value), reflect.ValueOf(eIn.value))
+ v := reflect.New(reflect.TypeOf(eIn.value)).Elem()
+ copyAny(v, reflect.ValueOf(eIn.value))
+ eOut.value = v.Interface()
}
if eIn.enc != nil {
eOut.enc = make([]byte, len(eIn.enc))
diff --git a/proto/clone_test.go b/proto/clone_test.go
index 5e82491..c9c4a2f 100644
--- a/proto/clone_test.go
+++ b/proto/clone_test.go
@@ -32,6 +32,7 @@
package proto_test
import (
+ "log"
"testing"
"goprotobuf.googlecode.com/hg/proto"
@@ -56,6 +57,15 @@
RepBytes: [][]byte{[]byte("sham"), []byte("wow")},
}
+func init() {
+ ext := &pb.Ext{
+ Data: proto.String("extension"),
+ }
+ if err := proto.SetExtension(cloneTestMessage, pb.E_Ext_More, ext); err != nil {
+ log.Fatalf("SetExtension: %v", err)
+ }
+}
+
func TestClone(t *testing.T) {
m := proto.Clone(cloneTestMessage).(*pb.MyMessage)
if !proto.Equal(m, cloneTestMessage) {