]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/gob: revert 6348067, which broke compatibility
authorRob Pike <r@golang.org>
Mon, 23 Jul 2012 20:34:46 +0000 (13:34 -0700)
committerRob Pike <r@golang.org>
Mon, 23 Jul 2012 20:34:46 +0000 (13:34 -0700)
Add commentary to explain better what's going on, but the
code change is a simple one-line reversal to the previous
form.

R=rsc
CC=golang-dev
https://golang.org/cl/6428072

src/pkg/encoding/gob/type.go

index 908cc9ce1c42d7b98c4a1e75e3ff8a18ef327dd9..a8ee2fa4a5a474697b036c5cf52def4e3d019363 100644 (file)
@@ -749,13 +749,29 @@ func Register(value interface{}) {
        rt := reflect.TypeOf(value)
        name := rt.String()
 
-       // But for named types (or pointers to them), qualify with import path.
+       // But for named types (or pointers to them), qualify with import path (but see inner comment).
        // Dereference one pointer looking for a named type.
        star := ""
        if rt.Name() == "" {
                if pt := rt; pt.Kind() == reflect.Ptr {
                        star = "*"
-                       rt = pt.Elem()
+                       // NOTE: The following line should be rt = pt.Elem() to implement
+                       // what the comment above claims, but fixing it would break compatibility
+                       // with existing gobs.
+                       //
+                       // Given package p imported as "full/p" with these definitions:
+                       //     package p
+                       //     type T1 struct { ... }
+                       // this table shows the intended and actual strings used by gob to
+                       // name the types:
+                       //
+                       // Type      Correct string     Actual string
+                       //
+                       // T1        full/p.T1          full/p.T1
+                       // *T1       *full/p.T1         *p.T1
+                       //
+                       // The missing full path cannot be fixed without breaking existing gob decoders.
+                       rt = pt
                }
        }
        if rt.Name() != "" {