gob: generate a better error message in one confusing place
(with maybe more to come) by printing a human-readable
representation of a remote type.
R=rsc
CC=golang-dev
https://golang.org/cl/3802045
diff --git a/src/pkg/gob/decode.go b/src/pkg/gob/decode.go
index 5a19b78..5791f62 100644
--- a/src/pkg/gob/decode.go
+++ b/src/pkg/gob/decode.go
@@ -861,12 +861,22 @@
return true
}
+// typeString returns a human-readable description of the type identified by remoteId.
+func (dec *Decoder) typeString(remoteId typeId) string {
+ if t := idToType[remoteId]; t != nil {
+ // globally known type.
+ return t.string()
+ }
+ return dec.wireType[remoteId].string()
+}
+
+
func (dec *Decoder) compileSingle(remoteId typeId, rt reflect.Type) (engine *decEngine, err os.Error) {
engine = new(decEngine)
engine.instr = make([]decInstr, 1) // one item
name := rt.String() // best we can do
if !dec.compatibleType(rt, remoteId) {
- return nil, os.ErrorString("gob: wrong type received for local value " + name)
+ return nil, os.ErrorString("gob: wrong type received for local value " + name + ": " + dec.typeString(remoteId))
}
op, indir := dec.decOpFor(remoteId, rt, name)
ovfl := os.ErrorString(`value for "` + name + `" out of range`)
diff --git a/src/pkg/gob/type.go b/src/pkg/gob/type.go
index 1c2b202..2ca96ce 100644
--- a/src/pkg/gob/type.go
+++ b/src/pkg/gob/type.go
@@ -392,11 +392,22 @@
mapT *mapType
}
-func (w *wireType) name() string {
- if w.structT != nil {
- return w.structT.name
+func (w *wireType) string() string {
+ const unknown = "unknown type"
+ if w == nil {
+ return unknown
}
- return "unknown"
+ switch {
+ case w.arrayT != nil:
+ return w.arrayT.name
+ case w.sliceT != nil:
+ return w.sliceT.name
+ case w.structT != nil:
+ return w.structT.name
+ case w.mapT != nil:
+ return w.mapT.name
+ }
+ return unknown
}
type typeInfo struct {