Commit 5a443381 authored by Rob Pike's avatar Rob Pike

trivial bug: []byte is special but [3]byte is not.

modify a test to verify the fix.

R=rsc
CC=golang-dev
https://golang.org/cl/183090
parent bcabc99a
...@@ -249,20 +249,22 @@ func (enc *Encoder) sendType(origt reflect.Type) { ...@@ -249,20 +249,22 @@ func (enc *Encoder) sendType(origt reflect.Type) {
// Drill down to the base type. // Drill down to the base type.
rt, _ := indirect(origt) rt, _ := indirect(origt)
// We only send structs - everything else is basic or an error
switch rt := rt.(type) { switch rt := rt.(type) {
default: default:
// Basic types do not need to be described. // Basic types do not need to be described.
return return
case reflect.ArrayOrSliceType: case *reflect.SliceType:
// If it's []uint8, don't send; it's considered basic. // If it's []uint8, don't send; it's considered basic.
if _, ok := rt.Elem().(*reflect.Uint8Type); ok { if _, ok := rt.Elem().(*reflect.Uint8Type); ok {
return return
} }
// Otherwise we do send. // Otherwise we do send.
break break
// Struct types are not sent, only their element types. case *reflect.ArrayType:
// arrays must be sent so we know their lengths and element types.
break
case *reflect.StructType: case *reflect.StructType:
// structs must be sent so we know their fields.
break break
case *reflect.ChanType, *reflect.FuncType, *reflect.MapType, *reflect.InterfaceType: case *reflect.ChanType, *reflect.FuncType, *reflect.MapType, *reflect.InterfaceType:
// Probably a bad field in a struct. // Probably a bad field in a struct.
...@@ -337,7 +339,6 @@ func (enc *Encoder) Encode(e interface{}) os.Error { ...@@ -337,7 +339,6 @@ func (enc *Encoder) Encode(e interface{}) os.Error {
// No, so send it. // No, so send it.
enc.sendType(rt) enc.sendType(rt)
if enc.state.err != nil { if enc.state.err != nil {
enc.countState.b.Reset()
return enc.state.err return enc.state.err
} }
} }
......
...@@ -240,11 +240,12 @@ func TestValueError(t *testing.T) { ...@@ -240,11 +240,12 @@ func TestValueError(t *testing.T) {
func TestArray(t *testing.T) { func TestArray(t *testing.T) {
type Type5 struct { type Type5 struct {
a [3]string a [3]string
b [3]byte
} }
type Type6 struct { type Type6 struct {
a [2]string // can't hold t5.a a [2]string // can't hold t5.a
} }
t5 := Type5{[3]string{"hello", ",", "world"}} t5 := Type5{[3]string{"hello", ",", "world"}, [3]byte{1, 2, 3}}
var t5p Type5 var t5p Type5
if err := encAndDec(t5, &t5p); err != nil { if err := encAndDec(t5, &t5p); err != nil {
t.Error(err) t.Error(err)
......
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