summaryrefslogtreecommitdiff
path: root/src/pkg/gob/decoder.go
diff options
context:
space:
mode:
authorRob Pike <r@golang.org>2009-07-16 17:55:16 -0700
committerRob Pike <r@golang.org>2009-07-16 17:55:16 -0700
commit4ce5d4547f0763577cde3a21b31c9a88377b4094 (patch)
treea5f6570044c45fa578f323463eec64db0684d490 /src/pkg/gob/decoder.go
parent0355b4a281c8d3236b6c4c16bbe9bc5117397f10 (diff)
downloadgolang-4ce5d4547f0763577cde3a21b31c9a88377b4094.tar.gz
- allow wire type and receive type to differ.
- still TODO: ignoring struct fields. R=rsc DELTA=309 (240 added, 2 deleted, 67 changed) OCL=31750 CL=31750
Diffstat (limited to 'src/pkg/gob/decoder.go')
-rw-r--r--src/pkg/gob/decoder.go8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/pkg/gob/decoder.go b/src/pkg/gob/decoder.go
index 9257f7c23..9c5a75554 100644
--- a/src/pkg/gob/decoder.go
+++ b/src/pkg/gob/decoder.go
@@ -42,7 +42,7 @@ func (dec *Decoder) recvType(id TypeId) {
// Type:
wire := new(wireType);
- decode(dec.state.b, wire);
+ decode(dec.state.b, tWireType, wire);
// Remember we've seen this type.
dec.seen[id] = wire;
}
@@ -86,7 +86,7 @@ func (dec *Decoder) Decode(e interface{}) os.Error {
return dec.state.err
}
- // Is it a type?
+ // Is it a new type?
if id < 0 { // 0 is the error state, handled above
// If the id is negative, we have a type.
dec.recvType(-id);
@@ -97,7 +97,9 @@ func (dec *Decoder) Decode(e interface{}) os.Error {
}
// No, it's a value.
+ typeLock.Lock();
info := getTypeInfo(rt);
+ typeLock.Unlock();
// Check type compatibility.
// TODO(r): need to make the decoder work correctly if the wire type is compatible
@@ -108,7 +110,7 @@ func (dec *Decoder) Decode(e interface{}) os.Error {
}
// Receive a value.
- decode(dec.state.b, e);
+ decode(dec.state.b, id, e);
return dec.state.err
}