]> Cypherpunks repositories - gostls13.git/commitdiff
gob: Register should use the original type, not the indirected one.
authorRob Pike <r@golang.org>
Tue, 14 Dec 2010 23:04:52 +0000 (15:04 -0800)
committerRob Pike <r@golang.org>
Tue, 14 Dec 2010 23:04:52 +0000 (15:04 -0800)
Fixes a bug reported on golang-nuts.

R=rsc, adg
CC=golang-dev
https://golang.org/cl/3641042

src/pkg/gob/encoder_test.go
src/pkg/gob/type.go

index 91d85bb7ad65b56368669acadb69034a154872b8..e5fc80837eefc8a34783b41c5acf6666d6edfc26 100644 (file)
@@ -354,3 +354,32 @@ func TestStructNonStruct(t *testing.T) {
                t.Error("for non-struct/struct expected type error; got", err)
        }
 }
+
+type interfaceIndirectTestI interface {
+       F() bool
+}
+
+type interfaceIndirectTestT struct{}
+
+func (this *interfaceIndirectTestT) F() bool {
+       return true
+}
+
+// A version of a bug reported on golang-nuts.  Also tests top-level
+// slice of interfaces.  The issue was registering *T caused T to be
+// stored as the concrete type.
+func TestInterfaceIndirect(t *testing.T) {
+       Register(&interfaceIndirectTestT{})
+       b := new(bytes.Buffer)
+       w := []interfaceIndirectTestI{&interfaceIndirectTestT{}}
+       err := NewEncoder(b).Encode(w)
+       if err != nil {
+               t.Fatal("encode error:", err)
+       }
+
+       var r []interfaceIndirectTestI
+       err = NewDecoder(b).Decode(&r)
+       if err != nil {
+               t.Fatal("decode error:", err)
+       }
+}
index d68c8773cfdd86ecb969f6964fd636b3cc24f4b0..1c2b2027ef1367617e676290e4365869c171b001 100644 (file)
@@ -470,7 +470,9 @@ func RegisterName(name string, value interface{}) {
        if n, ok := concreteTypeToName[rt]; ok && n != name {
                panic("gob: registering duplicate names for " + rt.String())
        }
-       nameToConcreteType[name] = rt
+       // Store the name and type provided by the user....
+       nameToConcreteType[name] = reflect.Typeof(value)
+       // but the flattened type in the type table, since that's what decode needs.
        concreteTypeToName[rt] = name
 }