func decodeStruct(engine *decEngine, rtyp *reflect.StructType, b *bytes.Buffer, p uintptr, indir int) os.Error { if indir > 0 { up := unsafe.Pointer(p) if indir > 1 { up = decIndirect(up, indir) } if *(*unsafe.Pointer)(up) == nil { // Allocate object by making a slice of bytes and recording the // address of the beginning of the array. TODO(rsc). b := make([]byte, rtyp.Size()) *(*unsafe.Pointer)(up) = unsafe.Pointer(&b[0]) } p = *(*uintptr)(up) } state := newDecodeState(b) state.fieldnum = -1 basep := p for state.err == nil { delta := int(decodeUint(state)) if delta < 0 { state.err = os.ErrorString("gob decode: corrupted data: negative delta") break } if state.err != nil || delta == 0 { // struct terminator is zero delta fieldnum break } fieldnum := state.fieldnum + delta if fieldnum >= len(engine.instr) { state.err = errRange break } instr := &engine.instr[fieldnum] p := unsafe.Pointer(basep + instr.offset) if instr.indir > 1 { p = decIndirect(p, instr.indir) } instr.op(instr, state, p) state.fieldnum = fieldnum } return state.err }