mirror of
https://github.com/golang/go
synced 2024-11-13 18:30:26 -07:00
gob: report an error when encoding a non-empty struct with
no public fields. Fix a couple of tests caught out by this change. R=rsc CC=golang-dev https://golang.org/cl/4044043
This commit is contained in:
parent
f0b8f84d37
commit
a0a4e85ad6
@ -1088,11 +1088,11 @@ func (v Vector) Square() int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Point struct {
|
type Point struct {
|
||||||
a, b int
|
X, Y int
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p Point) Square() 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.
|
// A struct with interfaces in it.
|
||||||
|
@ -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.
|
// Byte arrays are encoded as an unsigned count followed by the raw bytes.
|
||||||
func encUint8Array(i *encInstr, state *encoderState, p unsafe.Pointer) {
|
func encUint8Array(i *encInstr, state *encoderState, p unsafe.Pointer) {
|
||||||
b := *(*[]byte)(p)
|
b := *(*[]byte)(p)
|
||||||
@ -516,16 +513,18 @@ func (enc *Encoder) compileEnc(rt reflect.Type) *encEngine {
|
|||||||
srt, isStruct := rt.(*reflect.StructType)
|
srt, isStruct := rt.(*reflect.StructType)
|
||||||
engine := new(encEngine)
|
engine := new(encEngine)
|
||||||
if isStruct {
|
if isStruct {
|
||||||
engine.instr = make([]encInstr, srt.NumField()+1) // +1 for terminator
|
for fieldNum := 0; fieldNum < srt.NumField(); fieldNum++ {
|
||||||
for fieldnum := 0; fieldnum < srt.NumField(); fieldnum++ {
|
f := srt.Field(fieldNum)
|
||||||
f := srt.Field(fieldnum)
|
|
||||||
op, indir := enc.encOpFor(f.Type)
|
|
||||||
if !isExported(f.Name) {
|
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)})
|
||||||
}
|
}
|
||||||
engine.instr[srt.NumField()] = encInstr{encStructTerminator, 0, 0, 0}
|
if srt.NumField() > 0 && len(engine.instr) == 0 {
|
||||||
|
errorf("type %s has no exported fields", rt)
|
||||||
|
}
|
||||||
|
engine.instr = append(engine.instr, encInstr{encStructTerminator, 0, 0, 0})
|
||||||
} else {
|
} else {
|
||||||
engine.instr = make([]encInstr, 1)
|
engine.instr = make([]encInstr, 1)
|
||||||
op, indir := enc.encOpFor(rt)
|
op, indir := enc.encOpFor(rt)
|
||||||
|
@ -220,7 +220,7 @@ func TestSlice(t *testing.T) {
|
|||||||
func TestValueError(t *testing.T) {
|
func TestValueError(t *testing.T) {
|
||||||
// Encode a *T, decode a T
|
// Encode a *T, decode a T
|
||||||
type Type4 struct {
|
type Type4 struct {
|
||||||
a int
|
A int
|
||||||
}
|
}
|
||||||
t4p := &Type4{3}
|
t4p := &Type4{3}
|
||||||
var t4 Type4 // note: not a pointer.
|
var t4 Type4 // note: not a pointer.
|
||||||
|
Loading…
Reference in New Issue
Block a user