diff options
| author | Rob Pike <r@golang.org> | 2010-06-28 14:09:47 -0700 |
|---|---|---|
| committer | Rob Pike <r@golang.org> | 2010-06-28 14:09:47 -0700 |
| commit | 38ce83e85d620f191bd6f5f7de1fe0e22ed538cf (patch) | |
| tree | b0ff633bd6547899a6df0747d8beacdf735e43b6 /src/pkg/gob/encoder.go | |
| parent | 0f603c351f4cfffac3fb0b637be5664ab130083a (diff) | |
| download | golang-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.go | 22 |
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. |
