Source File
decode.go
Belonging Package
encoding/gob
package gob
import (
)
var (
errBadUint = errors.New("gob: encoded unsigned integer out of range")
errBadType = errors.New("gob: unknown type id or corrupted data")
errRange = errors.New("gob: bad data: field numbers out of bounds")
)
type decHelper func(state *decoderState, v reflect.Value, length int, ovfl error) bool
type decoderState struct {
func ( *decBuffer) ( int) {
.Reset()
if cap(.data) < {
.data = make([]byte, )
} else {
.data = .data[0:]
}
}
func ( *decBuffer) () (byte, error) {
if .offset >= len(.data) {
return 0, io.EOF
}
:= .data[.offset]
.offset++
return , nil
}
func ( *decBuffer) () int {
return len(.data) - .offset
}
func ( *decBuffer) () []byte {
return .data[.offset:]
}
func ( *decBuffer) () {
.data = .data[0:0]
.offset = 0
}
for , := range [0:] {
= <<8 | uint64()
}
++ // +1 for length byte
return
}
func ( *decoderState) () int64 {
:= .decodeUint()
if &1 != 0 {
return ^int64( >> 1)
}
return int64( >> 1)
}
func ( *decoderState) () (int, bool) {
:= int(.decodeUint())
if < 0 || .b.Len() < || tooBig <= {
return 0, false
}
return , true
}
type decOp func(i *decInstr, state *decoderState, v reflect.Value)
func ( *decInstr, *decoderState, reflect.Value) {
.decodeUint()
}
func ( *decInstr, *decoderState, reflect.Value) {
.decodeUint()
.decodeUint()
}
func ( *decInstr, *decoderState, reflect.Value) {
.SetBool(.decodeUint() != 0)
}
func ( *decInstr, *decoderState, reflect.Value) {
:= .decodeUint()
if math.MaxUint8 < {
error_(.ovfl)
}
.SetUint()
}
func ( *decInstr, *decoderState, reflect.Value) {
:= .decodeUint()
if math.MaxUint16 < {
error_(.ovfl)
}
.SetUint()
}
func ( *decInstr, *decoderState, reflect.Value) {
:= .decodeUint()
if math.MaxUint32 < {
error_(.ovfl)
}
.SetUint()
}
func ( *decInstr, *decoderState, reflect.Value) {
:= .decodeUint()
.SetUint()
}
func ( uint64) float64 {
:= bits.ReverseBytes64()
return math.Float64frombits()
}
func ( uint64, error) float64 {
:= float64FromBits()
:=
if < 0 {
= -
if math.MaxFloat32 < && <= math.MaxFloat64 {
error_()
}
return
}
func ( *decInstr, *decoderState, reflect.Value) {
.SetFloat(float32FromBits(.decodeUint(), .ovfl))
}
func ( *decInstr, *decoderState, reflect.Value) {
.SetFloat(float64FromBits(.decodeUint()))
}
func ( *decInstr, *decoderState, reflect.Value) {
:= float32FromBits(.decodeUint(), .ovfl)
:= float32FromBits(.decodeUint(), .ovfl)
.SetComplex(complex(, ))
}
func ( *decInstr, *decoderState, reflect.Value) {
:= float64FromBits(.decodeUint())
:= float64FromBits(.decodeUint())
.SetComplex(complex(, ))
}
func ( *Decoder) ( *decEngine, reflect.Value) {
:= .newDecoderState(&.buf)
defer .freeDecoderState()
.fieldnum = singletonField
if .decodeUint() != 0 {
errorf("decode: corrupted data: non-zero delta for singleton")
}
:= &.instr[singletonField]
.op(, , )
}
func ( *Decoder) ( *decEngine, reflect.Value) {
:= .newDecoderState(&.buf)
defer .freeDecoderState()
.fieldnum = -1
for .b.Len() > 0 {
:= int(.decodeUint())
if < 0 {
errorf("decode: corrupted data: negative delta")
}
if == 0 { // struct terminator is zero delta fieldnum
break
}
:= .fieldnum +
if >= len(.instr) {
error_(errRange)
break
}
:= &.instr[]
var reflect.Value
func ( *Decoder) ( *decEngine) {
:= .newDecoderState(&.buf)
defer .freeDecoderState()
.fieldnum = -1
for .b.Len() > 0 {
:= int(.decodeUint())
if < 0 {
errorf("ignore decode: corrupted data: negative delta")
}
if == 0 { // struct terminator is zero delta fieldnum
break
}
:= .fieldnum +
if >= len(.instr) {
error_(errRange)
}
:= &.instr[]
.op(, , noValue)
.fieldnum =
}
}
func ( *Decoder) ( *decEngine) {
:= .newDecoderState(&.buf)
defer .freeDecoderState()
.fieldnum = singletonField
:= int(.decodeUint())
if != 0 {
errorf("decode: corrupted data: non-zero delta for singleton")
}
:= &.instr[singletonField]
.op(, , noValue)
}
func ( *Decoder) ( *decoderState, reflect.Value, decOp, int, error, decHelper) {
if != nil && (, , , ) {
return
}
:= &decInstr{, 0, nil, }
:= .Type().Elem().Kind() == reflect.Ptr
for := 0; < ; ++ {
if .b.Len() == 0 {
errorf("decoding array or slice: length exceeds input size (%d elements)", )
}
:= .Index()
if {
= decAlloc()
}
(, , )
}
}
func ( *Decoder) ( *decoderState, reflect.Value, decOp, int, error, decHelper) {
if := .decodeUint(); != uint64() {
errorf("length mismatch in decodeArray")
}
.decodeArrayHelper(, , , , , )
}
func ( *Decoder) ( reflect.Type, *decoderState, reflect.Value, , decOp, error) {
:= int(.decodeUint())
if .IsNil() {
.Set(reflect.MakeMapWithSize(, ))
}
:= .Key().Kind() == reflect.Ptr
:= .Elem().Kind() == reflect.Ptr
:= &decInstr{, 0, nil, }
:= &decInstr{, 0, nil, }
:= reflect.New(.Key())
:= reflect.Zero(.Key())
:= reflect.New(.Elem())
:= reflect.Zero(.Elem())
for := 0; < ; ++ {
:= decodeIntoValue(, , , .Elem(), )
:= decodeIntoValue(, , , .Elem(), )
.SetMapIndex(, )
.Elem().Set()
.Elem().Set()
}
}
func ( *Decoder) ( *decoderState, decOp, int) {
if := .decodeUint(); != uint64() {
errorf("length mismatch in ignoreArray")
}
.ignoreArrayHelper(, , )
}
func ( *Decoder) ( *decoderState, decOp) {
.ignoreArrayHelper(, , int(.decodeUint()))
}
:= .decodeTypeSequence(true)
if < 0 {
error_(.err)
:= allocValue()
.decodeValue(, )
if .err != nil {
error_(.err)
if !.AssignableTo() {
errorf("%s is not assignable to type %s", , )
.Set()
}
switch .externalDec {
case xGob:
= .Interface().(GobDecoder).GobDecode()
case xBinary:
= .Interface().(encoding.BinaryUnmarshaler).UnmarshalBinary()
case xText:
= .Interface().(encoding.TextUnmarshaler).UnmarshalText()
}
if != nil {
error_()
}
}
var decOpTable = [...]decOp{
reflect.Bool: decBool,
reflect.Int8: decInt8,
reflect.Int16: decInt16,
reflect.Int32: decInt32,
reflect.Int64: decInt64,
reflect.Uint8: decUint8,
reflect.Uint16: decUint16,
reflect.Uint32: decUint32,
reflect.Uint64: decUint64,
reflect.Float32: decFloat32,
reflect.Float64: decFloat64,
reflect.Complex64: decComplex64,
reflect.Complex128: decComplex128,
reflect.String: decString,
}
var decIgnoreOpMap = map[typeId]decOp{
tBool: ignoreUint,
tInt: ignoreUint,
tUint: ignoreUint,
tFloat: ignoreUint,
tBytes: ignoreUint8Array,
tString: ignoreUint8Array,
tComplex: ignoreTwoUints,
}
if .externalDec != 0 {
return .gobDecodeOpFor()
}
if := []; != nil {
return
}
:= .base
var decOp
:= .Kind()
if int() < len(decOpTable) {
= decOpTable[]
}
if == nil {
switch := ; .Kind() {
case reflect.Array:
= "element of " +
:= .wireType[].ArrayT.Elem
:= .(, .Elem(), , )
:= overflow()
:= decArrayHelper[.Elem().Kind()]
= func( *decInstr, *decoderState, reflect.Value) {
.dec.decodeArray(, , *, .Len(), , )
}
case reflect.Map:
:= .wireType[].MapT.Key
:= .wireType[].MapT.Elem
:= .(, .Key(), "key of "+, )
:= .(, .Elem(), "element of "+, )
:= overflow()
= func( *decInstr, *decoderState, reflect.Value) {
.dec.decodeMap(, , , *, *, )
}
case reflect.Slice:
= "element of " +
if .Elem().Kind() == reflect.Uint8 {
= decUint8Slice
break
}
var typeId
if , := builtinIdToType[]; {
= .(*sliceType).Elem
} else {
= .wireType[].SliceT.Elem
}
:= .(, .Elem(), , )
:= overflow()
:= decSliceHelper[.Elem().Kind()]
= func( *decInstr, *decoderState, reflect.Value) {
.dec.decodeSlice(, , *, , )
}
:= userType()
, := .getDecEnginePtr(, )
if != nil {
error_()
}
.decodeStruct(*, )
}
case reflect.Interface:
= func( *decInstr, *decoderState, reflect.Value) {
.dec.decodeInterface(, , )
}
}
}
if == nil {
errorf("decode can't handle type %s", )
}
return &
}
if := []; != nil {
return
}
, := decIgnoreOpMap[]
if ! {
[] = &
= func( *decInstr, *decoderState, reflect.Value) {
.dec.ignoreInterface()
}
return &
:= .wireType[]
switch {
case == nil:
errorf("bad data: undefined type %s", .string())
case .ArrayT != nil:
:= .ArrayT.Elem
:= .(, )
= func( *decInstr, *decoderState, reflect.Value) {
.dec.ignoreArray(, *, .ArrayT.Len)
}
case .MapT != nil:
:= .wireType[].MapT.Key
:= .wireType[].MapT.Elem
:= .(, )
:= .(, )
= func( *decInstr, *decoderState, reflect.Value) {
.dec.ignoreMap(, *, *)
}
case .SliceT != nil:
:= .SliceT.Elem
:= .(, )
= func( *decInstr, *decoderState, reflect.Value) {
.dec.ignoreSlice(, *)
}
, := .getIgnoreEnginePtr()
if != nil {
error_()
}
.dec.ignoreStruct(*)
}
case .GobEncoderT != nil, .BinaryMarshalerT != nil, .TextMarshalerT != nil:
= func( *decInstr, *decoderState, reflect.Value) {
.dec.ignoreGobDecoder()
}
}
}
if == nil {
errorf("bad data: ignore can't handle type %s", .string())
}
return &
}
if (.externalDec == xGob) != ( && .GobEncoderT != nil) ||
(.externalDec == xBinary) != ( && .BinaryMarshalerT != nil) ||
(.externalDec == xText) != ( && .TextMarshalerT != nil) {
return false
}
if .externalDec != 0 { // This test trumps all others.
return true
}
switch := .base; .Kind() {
return false
case reflect.Bool:
return == tBool
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
return == tInt
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
return == tUint
case reflect.Float32, reflect.Float64:
return == tFloat
case reflect.Complex64, reflect.Complex128:
return == tComplex
case reflect.String:
return == tString
case reflect.Interface:
return == tInterface
case reflect.Array:
if ! || .ArrayT == nil {
return false
}
:= .ArrayT
return .Len() == .Len && .(.Elem(), .Elem, )
case reflect.Map:
if ! || .MapT == nil {
return false
}
:= .MapT
return .(.Key(), .Key, ) && .(.Elem(), .Elem, )
if .base.Kind() == reflect.Interface && != tInterface {
return nil, errors.New("gob: local interface type " + + " can only be decoded from remote interface type; received concrete type " + )
}
return nil, errors.New("gob: decoding into local type " + + ", received remote type " + )
}
:= .decOpFor(, , , make(map[reflect.Type]*decOp))
:= errors.New(`value for "` + + `" out of range`)
.instr[singletonField] = decInstr{*, singletonField, nil, }
.numInstr = 1
return
}
func ( *Decoder) ( typeId, *userTypeInfo) ( *decEngine, error) {
defer catchError(&)
:= .base
:=
if .Kind() != reflect.Struct || .externalDec != 0 {
return .compileSingle(, )
}
if ! || !isExported(.Name) {
:= .decIgnoreOpFor(.Id, make(map[typeId]*decOp))
.instr[] = decInstr{*, , nil, }
continue
}
if !.compatibleType(.Type, .Id, make(map[reflect.Type]typeId)) {
errorf("wrong type (%s) for received field %s.%s", .Type, .Name, .Name)
}
:= .decOpFor(.Id, .Type, .Name, )
.instr[] = decInstr{*, , .Index, }
.numInstr++
}
return
}
func ( *Decoder) ( typeId, *userTypeInfo) ( **decEngine, error) {
:= .user
, := .decoderCache[]
if ! {
= make(map[typeId]**decEngine)
.decoderCache[] =
}
= new(*decEngine)
[] =
*, = .compileDec(, )
if != nil {
delete(, )
}
}
return
}
type emptyStruct struct{}
var emptyStructType = reflect.TypeOf(emptyStruct{})
= new(*decEngine)
.ignorerCache[] =
:= .wireType[]
if != nil && .StructT != nil {
*, = .compileDec(, userType(emptyStructType))
} else {
* = .compileIgnoreSingle()
}
if != nil {
delete(.ignorerCache, )
}
}
return
}
if !.IsValid() {
.decodeIgnoredValue()
return
:= userType(.Type())
:= .base
var **decEngine
, .err = .getDecEnginePtr(, )
if .err != nil {
return
}
= decAlloc()
:= *
if := ; .Kind() == reflect.Struct && .externalDec == 0 {
:= .wireType[]
if .numInstr == 0 && .NumField() > 0 &&
!= nil && len(.StructT.Field) > 0 {
:= .Name()
errorf("type mismatch: no fields matched compiling decoder for %s", )
}
.decodeStruct(, )
} else {
.decodeSingle(, )
}
}
func ( *Decoder) ( typeId) {
var **decEngine
, .err = .getIgnoreEnginePtr()
if .err != nil {
return
}
:= .wireType[]
if != nil && .StructT != nil {
.ignoreStruct(*)
} else {
.ignoreSingle(*)
}
}
func () {
var , decOp
switch reflect.TypeOf(int(0)).Bits() {
case 32:
= decInt32
= decUint32
case 64:
= decInt64
= decUint64
default:
panic("gob: unknown size of int/uint")
}
decOpTable[reflect.Int] =
decOpTable[reflect.Uint] =
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |