Commit d84317ba authored by Rob Pike's avatar Rob Pike

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
parent e9c4f099
......@@ -861,12 +861,22 @@ func (dec *Decoder) compatibleType(fr reflect.Type, fw typeId) bool {
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`)
......
......@@ -392,11 +392,22 @@ type wireType struct {
mapT *mapType
}
func (w *wireType) name() string {
if w.structT != nil {
func (w *wireType) string() string {
const unknown = "unknown type"
if w == nil {
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"
return unknown
}
type typeInfo struct {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment