]> Cypherpunks repositories - gostls13.git/commitdiff
gob: report an error when encoding a non-empty struct with
authorRob Pike <r@golang.org>
Sat, 22 Jan 2011 08:10:11 +0000 (00:10 -0800)
committerRob Pike <r@golang.org>
Sat, 22 Jan 2011 08:10:11 +0000 (00:10 -0800)
no public fields.
Fix a couple of tests caught out by this change.

R=rsc
CC=golang-dev
https://golang.org/cl/4044043

src/pkg/gob/codec_test.go
src/pkg/gob/encode.go
src/pkg/gob/encoder_test.go

index 4b8bd347e8d23c1cd481f0effd22772c588c7c70..eb1ff5c616d01174c77c379d7efeec2d461824ad 100644 (file)
@@ -1088,11 +1088,11 @@ func (v Vector) Square() int {
 }
 
 type Point struct {
-       a, b int
+       X, Y int
 }
 
 func (p Point) Square() int {
-       return p.a*p.a + p.b*p.b
+       return p.X*p.X + p.Y*p.Y
 }
 
 // A struct with interfaces in it.
index d286a7e00b879b9666881cf0cab0f54e9cb9424d..832bc340fd48474732fe18256757b2672a4c3e1c 100644 (file)
@@ -264,9 +264,6 @@ func encComplex128(i *encInstr, state *encoderState, p unsafe.Pointer) {
        }
 }
 
-func encNoOp(i *encInstr, state *encoderState, p unsafe.Pointer) {
-}
-
 // Byte arrays are encoded as an unsigned count followed by the raw bytes.
 func encUint8Array(i *encInstr, state *encoderState, p unsafe.Pointer) {
        b := *(*[]byte)(p)
@@ -516,16 +513,18 @@ func (enc *Encoder) compileEnc(rt reflect.Type) *encEngine {
        srt, isStruct := rt.(*reflect.StructType)
        engine := new(encEngine)
        if isStruct {
-               engine.instr = make([]encInstr, srt.NumField()+1) // +1 for terminator
-               for fieldnum := 0; fieldnum < srt.NumField(); fieldnum++ {
-                       f := srt.Field(fieldnum)
-                       op, indir := enc.encOpFor(f.Type)
+               for fieldNum := 0; fieldNum < srt.NumField(); fieldNum++ {
+                       f := srt.Field(fieldNum)
                        if !isExported(f.Name) {
-                               op = encNoOp
+                               continue
                        }
-                       engine.instr[fieldnum] = encInstr{op, fieldnum, indir, uintptr(f.Offset)}
+                       op, indir := enc.encOpFor(f.Type)
+                       engine.instr = append(engine.instr, encInstr{op, fieldNum, indir, uintptr(f.Offset)})
+               }
+               if srt.NumField() > 0 && len(engine.instr) == 0 {
+                       errorf("type %s has no exported fields", rt)
                }
-               engine.instr[srt.NumField()] = encInstr{encStructTerminator, 0, 0, 0}
+               engine.instr = append(engine.instr, encInstr{encStructTerminator, 0, 0, 0})
        } else {
                engine.instr = make([]encInstr, 1)
                op, indir := enc.encOpFor(rt)
index c2309352a09d0f7a43f84a24878143e102e8eeac..402fd2a13db094aa0e4798a67cc89f446f38aaea 100644 (file)
@@ -220,7 +220,7 @@ func TestSlice(t *testing.T) {
 func TestValueError(t *testing.T) {
        // Encode a *T, decode a T
        type Type4 struct {
-               a int
+               A int
        }
        t4p := &Type4{3}
        var t4 Type4 // note: not a pointer.