summaryrefslogtreecommitdiff
path: root/src/pkg/gob/encoder.go
diff options
context:
space:
mode:
authorRob Pike <r@golang.org>2010-06-28 14:09:47 -0700
committerRob Pike <r@golang.org>2010-06-28 14:09:47 -0700
commit38ce83e85d620f191bd6f5f7de1fe0e22ed538cf (patch)
treeb0ff633bd6547899a6df0747d8beacdf735e43b6 /src/pkg/gob/encoder.go
parent0f603c351f4cfffac3fb0b637be5664ab130083a (diff)
downloadgolang-38ce83e85d620f191bd6f5f7de1fe0e22ed538cf.tar.gz
gob: allow transmission of things other than structs at the top level.
also fix a bug handling nil maps: before, would needlessly send empty map R=rsc CC=golang-dev http://codereview.appspot.com/1739043
Diffstat (limited to 'src/pkg/gob/encoder.go')
-rw-r--r--src/pkg/gob/encoder.go22
1 files changed, 15 insertions, 7 deletions
diff --git a/src/pkg/gob/encoder.go b/src/pkg/gob/encoder.go
index e24c18d20..28cf6f6e0 100644
--- a/src/pkg/gob/encoder.go
+++ b/src/pkg/gob/encoder.go
@@ -68,7 +68,7 @@ func (enc *Encoder) send() {
}
}
-func (enc *Encoder) sendType(origt reflect.Type) {
+func (enc *Encoder) sendType(origt reflect.Type) (sent bool) {
// Drill down to the base type.
rt, _ := indirect(origt)
@@ -147,11 +147,6 @@ func (enc *Encoder) Encode(e interface{}) os.Error {
enc.state.err = nil
rt, _ := indirect(reflect.Typeof(e))
- // Must be a struct
- if _, ok := rt.(*reflect.StructType); !ok {
- enc.badType(rt)
- return enc.state.err
- }
// Sanity check only: encoder should never come in with data present.
if enc.state.b.Len() > 0 || enc.countState.b.Len() > 0 {
@@ -163,10 +158,23 @@ func (enc *Encoder) Encode(e interface{}) os.Error {
// First, have we already sent this type?
if _, alreadySent := enc.sent[rt]; !alreadySent {
// No, so send it.
- enc.sendType(rt)
+ sent := enc.sendType(rt)
if enc.state.err != nil {
return enc.state.err
}
+ // If the type info has still not been transmitted, it means we have
+ // a singleton basic type (int, []byte etc.) at top level. We don't
+ // need to send the type info but we do need to update enc.sent.
+ if !sent {
+ typeLock.Lock()
+ info, err := getTypeInfo(rt)
+ typeLock.Unlock()
+ if err != nil {
+ enc.setError(err)
+ return err
+ }
+ enc.sent[rt] = info.id
+ }
}
// Identify the type of this top-level value.