github.com/freddyisaac/sicortex-golang@v0.0.0-20231019035217-e03519e66f60/src/encoding/gob/decode.go (about)

     1  // Copyright 2009 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  //go:generate go run decgen.go -output dec_helpers.go
     6  
     7  package gob
     8  
     9  import (
    10  	"encoding"
    11  	"errors"
    12  	"io"
    13  	"math"
    14  	"reflect"
    15  )
    16  
    17  var (
    18  	errBadUint = errors.New("gob: encoded unsigned integer out of range")
    19  	errBadType = errors.New("gob: unknown type id or corrupted data")
    20  	errRange   = errors.New("gob: bad data: field numbers out of bounds")
    21  )
    22  
    23  type decHelper func(state *decoderState, v reflect.Value, length int, ovfl error) bool
    24  
    25  // decoderState is the execution state of an instance of the decoder. A new state
    26  // is created for nested objects.
    27  type decoderState struct {
    28  	dec *Decoder
    29  	// The buffer is stored with an extra indirection because it may be replaced
    30  	// if we load a type during decode (when reading an interface value).
    31  	b        *decBuffer
    32  	fieldnum int           // the last field number read.
    33  	next     *decoderState // for free list
    34  }
    35  
    36  // decBuffer is an extremely simple, fast implementation of a read-only byte buffer.
    37  // It is initialized by calling Size and then copying the data into the slice returned by Bytes().
    38  type decBuffer struct {
    39  	data   []byte
    40  	offset int // Read offset.
    41  }
    42  
    43  func (d *decBuffer) Read(p []byte) (int, error) {
    44  	n := copy(p, d.data[d.offset:])
    45  	if n == 0 && len(p) != 0 {
    46  		return 0, io.EOF
    47  	}
    48  	d.offset += n
    49  	return n, nil
    50  }
    51  
    52  func (d *decBuffer) Drop(n int) {
    53  	if n > d.Len() {
    54  		panic("drop")
    55  	}
    56  	d.offset += n
    57  }
    58  
    59  // Size grows the buffer to exactly n bytes, so d.Bytes() will
    60  // return a slice of length n. Existing data is first discarded.
    61  func (d *decBuffer) Size(n int) {
    62  	d.Reset()
    63  	if cap(d.data) < n {
    64  		d.data = make([]byte, n)
    65  	} else {
    66  		d.data = d.data[0:n]
    67  	}
    68  }
    69  
    70  func (d *decBuffer) ReadByte() (byte, error) {
    71  	if d.offset >= len(d.data) {
    72  		return 0, io.EOF
    73  	}
    74  	c := d.data[d.offset]
    75  	d.offset++
    76  	return c, nil
    77  }
    78  
    79  func (d *decBuffer) Len() int {
    80  	return len(d.data) - d.offset
    81  }
    82  
    83  func (d *decBuffer) Bytes() []byte {
    84  	return d.data[d.offset:]
    85  }
    86  
    87  func (d *decBuffer) Reset() {
    88  	d.data = d.data[0:0]
    89  	d.offset = 0
    90  }
    91  
    92  // We pass the bytes.Buffer separately for easier testing of the infrastructure
    93  // without requiring a full Decoder.
    94  func (dec *Decoder) newDecoderState(buf *decBuffer) *decoderState {
    95  	d := dec.freeList
    96  	if d == nil {
    97  		d = new(decoderState)
    98  		d.dec = dec
    99  	} else {
   100  		dec.freeList = d.next
   101  	}
   102  	d.b = buf
   103  	return d
   104  }
   105  
   106  func (dec *Decoder) freeDecoderState(d *decoderState) {
   107  	d.next = dec.freeList
   108  	dec.freeList = d
   109  }
   110  
   111  func overflow(name string) error {
   112  	return errors.New(`value for "` + name + `" out of range`)
   113  }
   114  
   115  // decodeUintReader reads an encoded unsigned integer from an io.Reader.
   116  // Used only by the Decoder to read the message length.
   117  func decodeUintReader(r io.Reader, buf []byte) (x uint64, width int, err error) {
   118  	width = 1
   119  	n, err := io.ReadFull(r, buf[0:width])
   120  	if n == 0 {
   121  		return
   122  	}
   123  	b := buf[0]
   124  	if b <= 0x7f {
   125  		return uint64(b), width, nil
   126  	}
   127  	n = -int(int8(b))
   128  	if n > uint64Size {
   129  		err = errBadUint
   130  		return
   131  	}
   132  	width, err = io.ReadFull(r, buf[0:n])
   133  	if err != nil {
   134  		if err == io.EOF {
   135  			err = io.ErrUnexpectedEOF
   136  		}
   137  		return
   138  	}
   139  	// Could check that the high byte is zero but it's not worth it.
   140  	for _, b := range buf[0:width] {
   141  		x = x<<8 | uint64(b)
   142  	}
   143  	width++ // +1 for length byte
   144  	return
   145  }
   146  
   147  // decodeUint reads an encoded unsigned integer from state.r.
   148  // Does not check for overflow.
   149  func (state *decoderState) decodeUint() (x uint64) {
   150  	b, err := state.b.ReadByte()
   151  	if err != nil {
   152  		error_(err)
   153  	}
   154  	if b <= 0x7f {
   155  		return uint64(b)
   156  	}
   157  	n := -int(int8(b))
   158  	if n > uint64Size {
   159  		error_(errBadUint)
   160  	}
   161  	buf := state.b.Bytes()
   162  	if len(buf) < n {
   163  		errorf("invalid uint data length %d: exceeds input size %d", n, len(buf))
   164  	}
   165  	// Don't need to check error; it's safe to loop regardless.
   166  	// Could check that the high byte is zero but it's not worth it.
   167  	for _, b := range buf[0:n] {
   168  		x = x<<8 | uint64(b)
   169  	}
   170  	state.b.Drop(n)
   171  	return x
   172  }
   173  
   174  // decodeInt reads an encoded signed integer from state.r.
   175  // Does not check for overflow.
   176  func (state *decoderState) decodeInt() int64 {
   177  	x := state.decodeUint()
   178  	if x&1 != 0 {
   179  		return ^int64(x >> 1)
   180  	}
   181  	return int64(x >> 1)
   182  }
   183  
   184  // getLength decodes the next uint and makes sure it is a possible
   185  // size for a data item that follows, which means it must fit in a
   186  // non-negative int and fit in the buffer.
   187  func (state *decoderState) getLength() (int, bool) {
   188  	n := int(state.decodeUint())
   189  	if n < 0 || state.b.Len() < n || tooBig <= n {
   190  		return 0, false
   191  	}
   192  	return n, true
   193  }
   194  
   195  // decOp is the signature of a decoding operator for a given type.
   196  type decOp func(i *decInstr, state *decoderState, v reflect.Value)
   197  
   198  // The 'instructions' of the decoding machine
   199  type decInstr struct {
   200  	op    decOp
   201  	field int   // field number of the wire type
   202  	index []int // field access indices for destination type
   203  	ovfl  error // error message for overflow/underflow (for arrays, of the elements)
   204  }
   205  
   206  // ignoreUint discards a uint value with no destination.
   207  func ignoreUint(i *decInstr, state *decoderState, v reflect.Value) {
   208  	state.decodeUint()
   209  }
   210  
   211  // ignoreTwoUints discards a uint value with no destination. It's used to skip
   212  // complex values.
   213  func ignoreTwoUints(i *decInstr, state *decoderState, v reflect.Value) {
   214  	state.decodeUint()
   215  	state.decodeUint()
   216  }
   217  
   218  // Since the encoder writes no zeros, if we arrive at a decoder we have
   219  // a value to extract and store. The field number has already been read
   220  // (it's how we knew to call this decoder).
   221  // Each decoder is responsible for handling any indirections associated
   222  // with the data structure. If any pointer so reached is nil, allocation must
   223  // be done.
   224  
   225  // decAlloc takes a value and returns a settable value that can
   226  // be assigned to. If the value is a pointer, decAlloc guarantees it points to storage.
   227  // The callers to the individual decoders are expected to have used decAlloc.
   228  // The individual decoders don't need to it.
   229  func decAlloc(v reflect.Value) reflect.Value {
   230  	for v.Kind() == reflect.Ptr {
   231  		if v.IsNil() {
   232  			v.Set(reflect.New(v.Type().Elem()))
   233  		}
   234  		v = v.Elem()
   235  	}
   236  	return v
   237  }
   238  
   239  // decBool decodes a uint and stores it as a boolean in value.
   240  func decBool(i *decInstr, state *decoderState, value reflect.Value) {
   241  	value.SetBool(state.decodeUint() != 0)
   242  }
   243  
   244  // decInt8 decodes an integer and stores it as an int8 in value.
   245  func decInt8(i *decInstr, state *decoderState, value reflect.Value) {
   246  	v := state.decodeInt()
   247  	if v < math.MinInt8 || math.MaxInt8 < v {
   248  		error_(i.ovfl)
   249  	}
   250  	value.SetInt(v)
   251  }
   252  
   253  // decUint8 decodes an unsigned integer and stores it as a uint8 in value.
   254  func decUint8(i *decInstr, state *decoderState, value reflect.Value) {
   255  	v := state.decodeUint()
   256  	if math.MaxUint8 < v {
   257  		error_(i.ovfl)
   258  	}
   259  	value.SetUint(v)
   260  }
   261  
   262  // decInt16 decodes an integer and stores it as an int16 in value.
   263  func decInt16(i *decInstr, state *decoderState, value reflect.Value) {
   264  	v := state.decodeInt()
   265  	if v < math.MinInt16 || math.MaxInt16 < v {
   266  		error_(i.ovfl)
   267  	}
   268  	value.SetInt(v)
   269  }
   270  
   271  // decUint16 decodes an unsigned integer and stores it as a uint16 in value.
   272  func decUint16(i *decInstr, state *decoderState, value reflect.Value) {
   273  	v := state.decodeUint()
   274  	if math.MaxUint16 < v {
   275  		error_(i.ovfl)
   276  	}
   277  	value.SetUint(v)
   278  }
   279  
   280  // decInt32 decodes an integer and stores it as an int32 in value.
   281  func decInt32(i *decInstr, state *decoderState, value reflect.Value) {
   282  	v := state.decodeInt()
   283  	if v < math.MinInt32 || math.MaxInt32 < v {
   284  		error_(i.ovfl)
   285  	}
   286  	value.SetInt(v)
   287  }
   288  
   289  // decUint32 decodes an unsigned integer and stores it as a uint32 in value.
   290  func decUint32(i *decInstr, state *decoderState, value reflect.Value) {
   291  	v := state.decodeUint()
   292  	if math.MaxUint32 < v {
   293  		error_(i.ovfl)
   294  	}
   295  	value.SetUint(v)
   296  }
   297  
   298  // decInt64 decodes an integer and stores it as an int64 in value.
   299  func decInt64(i *decInstr, state *decoderState, value reflect.Value) {
   300  	v := state.decodeInt()
   301  	value.SetInt(v)
   302  }
   303  
   304  // decUint64 decodes an unsigned integer and stores it as a uint64 in value.
   305  func decUint64(i *decInstr, state *decoderState, value reflect.Value) {
   306  	v := state.decodeUint()
   307  	value.SetUint(v)
   308  }
   309  
   310  // Floating-point numbers are transmitted as uint64s holding the bits
   311  // of the underlying representation. They are sent byte-reversed, with
   312  // the exponent end coming out first, so integer floating point numbers
   313  // (for example) transmit more compactly. This routine does the
   314  // unswizzling.
   315  func float64FromBits(u uint64) float64 {
   316  	var v uint64
   317  	for i := 0; i < 8; i++ {
   318  		v <<= 8
   319  		v |= u & 0xFF
   320  		u >>= 8
   321  	}
   322  	return math.Float64frombits(v)
   323  }
   324  
   325  // float32FromBits decodes an unsigned integer, treats it as a 32-bit floating-point
   326  // number, and returns it. It's a helper function for float32 and complex64.
   327  // It returns a float64 because that's what reflection needs, but its return
   328  // value is known to be accurately representable in a float32.
   329  func float32FromBits(u uint64, ovfl error) float64 {
   330  	v := float64FromBits(u)
   331  	av := v
   332  	if av < 0 {
   333  		av = -av
   334  	}
   335  	// +Inf is OK in both 32- and 64-bit floats. Underflow is always OK.
   336  	if math.MaxFloat32 < av && av <= math.MaxFloat64 {
   337  		error_(ovfl)
   338  	}
   339  	return v
   340  }
   341  
   342  // decFloat32 decodes an unsigned integer, treats it as a 32-bit floating-point
   343  // number, and stores it in value.
   344  func decFloat32(i *decInstr, state *decoderState, value reflect.Value) {
   345  	value.SetFloat(float32FromBits(state.decodeUint(), i.ovfl))
   346  }
   347  
   348  // decFloat64 decodes an unsigned integer, treats it as a 64-bit floating-point
   349  // number, and stores it in value.
   350  func decFloat64(i *decInstr, state *decoderState, value reflect.Value) {
   351  	value.SetFloat(float64FromBits(state.decodeUint()))
   352  }
   353  
   354  // decComplex64 decodes a pair of unsigned integers, treats them as a
   355  // pair of floating point numbers, and stores them as a complex64 in value.
   356  // The real part comes first.
   357  func decComplex64(i *decInstr, state *decoderState, value reflect.Value) {
   358  	real := float32FromBits(state.decodeUint(), i.ovfl)
   359  	imag := float32FromBits(state.decodeUint(), i.ovfl)
   360  	value.SetComplex(complex(real, imag))
   361  }
   362  
   363  // decComplex128 decodes a pair of unsigned integers, treats them as a
   364  // pair of floating point numbers, and stores them as a complex128 in value.
   365  // The real part comes first.
   366  func decComplex128(i *decInstr, state *decoderState, value reflect.Value) {
   367  	real := float64FromBits(state.decodeUint())
   368  	imag := float64FromBits(state.decodeUint())
   369  	value.SetComplex(complex(real, imag))
   370  }
   371  
   372  // decUint8Slice decodes a byte slice and stores in value a slice header
   373  // describing the data.
   374  // uint8 slices are encoded as an unsigned count followed by the raw bytes.
   375  func decUint8Slice(i *decInstr, state *decoderState, value reflect.Value) {
   376  	n, ok := state.getLength()
   377  	if !ok {
   378  		errorf("bad %s slice length: %d", value.Type(), n)
   379  	}
   380  	if value.Cap() < n {
   381  		value.Set(reflect.MakeSlice(value.Type(), n, n))
   382  	} else {
   383  		value.Set(value.Slice(0, n))
   384  	}
   385  	if _, err := state.b.Read(value.Bytes()); err != nil {
   386  		errorf("error decoding []byte: %s", err)
   387  	}
   388  }
   389  
   390  // decString decodes byte array and stores in value a string header
   391  // describing the data.
   392  // Strings are encoded as an unsigned count followed by the raw bytes.
   393  func decString(i *decInstr, state *decoderState, value reflect.Value) {
   394  	n, ok := state.getLength()
   395  	if !ok {
   396  		errorf("bad %s slice length: %d", value.Type(), n)
   397  	}
   398  	// Read the data.
   399  	data := state.b.Bytes()
   400  	if len(data) < n {
   401  		errorf("invalid string length %d: exceeds input size %d", n, len(data))
   402  	}
   403  	s := string(data[:n])
   404  	state.b.Drop(n)
   405  	value.SetString(s)
   406  }
   407  
   408  // ignoreUint8Array skips over the data for a byte slice value with no destination.
   409  func ignoreUint8Array(i *decInstr, state *decoderState, value reflect.Value) {
   410  	n, ok := state.getLength()
   411  	if !ok {
   412  		errorf("slice length too large")
   413  	}
   414  	bn := state.b.Len()
   415  	if bn < n {
   416  		errorf("invalid slice length %d: exceeds input size %d", n, bn)
   417  	}
   418  	state.b.Drop(n)
   419  }
   420  
   421  // Execution engine
   422  
   423  // The encoder engine is an array of instructions indexed by field number of the incoming
   424  // decoder. It is executed with random access according to field number.
   425  type decEngine struct {
   426  	instr    []decInstr
   427  	numInstr int // the number of active instructions
   428  }
   429  
   430  // decodeSingle decodes a top-level value that is not a struct and stores it in value.
   431  // Such values are preceded by a zero, making them have the memory layout of a
   432  // struct field (although with an illegal field number).
   433  func (dec *Decoder) decodeSingle(engine *decEngine, ut *userTypeInfo, value reflect.Value) {
   434  	state := dec.newDecoderState(&dec.buf)
   435  	defer dec.freeDecoderState(state)
   436  	state.fieldnum = singletonField
   437  	if state.decodeUint() != 0 {
   438  		errorf("decode: corrupted data: non-zero delta for singleton")
   439  	}
   440  	instr := &engine.instr[singletonField]
   441  	instr.op(instr, state, value)
   442  }
   443  
   444  // decodeStruct decodes a top-level struct and stores it in value.
   445  // Indir is for the value, not the type. At the time of the call it may
   446  // differ from ut.indir, which was computed when the engine was built.
   447  // This state cannot arise for decodeSingle, which is called directly
   448  // from the user's value, not from the innards of an engine.
   449  func (dec *Decoder) decodeStruct(engine *decEngine, ut *userTypeInfo, value reflect.Value) {
   450  	state := dec.newDecoderState(&dec.buf)
   451  	defer dec.freeDecoderState(state)
   452  	state.fieldnum = -1
   453  	for state.b.Len() > 0 {
   454  		delta := int(state.decodeUint())
   455  		if delta < 0 {
   456  			errorf("decode: corrupted data: negative delta")
   457  		}
   458  		if delta == 0 { // struct terminator is zero delta fieldnum
   459  			break
   460  		}
   461  		fieldnum := state.fieldnum + delta
   462  		if fieldnum >= len(engine.instr) {
   463  			error_(errRange)
   464  			break
   465  		}
   466  		instr := &engine.instr[fieldnum]
   467  		var field reflect.Value
   468  		if instr.index != nil {
   469  			// Otherwise the field is unknown to us and instr.op is an ignore op.
   470  			field = value.FieldByIndex(instr.index)
   471  			if field.Kind() == reflect.Ptr {
   472  				field = decAlloc(field)
   473  			}
   474  		}
   475  		instr.op(instr, state, field)
   476  		state.fieldnum = fieldnum
   477  	}
   478  }
   479  
   480  var noValue reflect.Value
   481  
   482  // ignoreStruct discards the data for a struct with no destination.
   483  func (dec *Decoder) ignoreStruct(engine *decEngine) {
   484  	state := dec.newDecoderState(&dec.buf)
   485  	defer dec.freeDecoderState(state)
   486  	state.fieldnum = -1
   487  	for state.b.Len() > 0 {
   488  		delta := int(state.decodeUint())
   489  		if delta < 0 {
   490  			errorf("ignore decode: corrupted data: negative delta")
   491  		}
   492  		if delta == 0 { // struct terminator is zero delta fieldnum
   493  			break
   494  		}
   495  		fieldnum := state.fieldnum + delta
   496  		if fieldnum >= len(engine.instr) {
   497  			error_(errRange)
   498  		}
   499  		instr := &engine.instr[fieldnum]
   500  		instr.op(instr, state, noValue)
   501  		state.fieldnum = fieldnum
   502  	}
   503  }
   504  
   505  // ignoreSingle discards the data for a top-level non-struct value with no
   506  // destination. It's used when calling Decode with a nil value.
   507  func (dec *Decoder) ignoreSingle(engine *decEngine) {
   508  	state := dec.newDecoderState(&dec.buf)
   509  	defer dec.freeDecoderState(state)
   510  	state.fieldnum = singletonField
   511  	delta := int(state.decodeUint())
   512  	if delta != 0 {
   513  		errorf("decode: corrupted data: non-zero delta for singleton")
   514  	}
   515  	instr := &engine.instr[singletonField]
   516  	instr.op(instr, state, noValue)
   517  }
   518  
   519  // decodeArrayHelper does the work for decoding arrays and slices.
   520  func (dec *Decoder) decodeArrayHelper(state *decoderState, value reflect.Value, elemOp decOp, length int, ovfl error, helper decHelper) {
   521  	if helper != nil && helper(state, value, length, ovfl) {
   522  		return
   523  	}
   524  	instr := &decInstr{elemOp, 0, nil, ovfl}
   525  	isPtr := value.Type().Elem().Kind() == reflect.Ptr
   526  	for i := 0; i < length; i++ {
   527  		if state.b.Len() == 0 {
   528  			errorf("decoding array or slice: length exceeds input size (%d elements)", length)
   529  		}
   530  		v := value.Index(i)
   531  		if isPtr {
   532  			v = decAlloc(v)
   533  		}
   534  		elemOp(instr, state, v)
   535  	}
   536  }
   537  
   538  // decodeArray decodes an array and stores it in value.
   539  // The length is an unsigned integer preceding the elements. Even though the length is redundant
   540  // (it's part of the type), it's a useful check and is included in the encoding.
   541  func (dec *Decoder) decodeArray(atyp reflect.Type, state *decoderState, value reflect.Value, elemOp decOp, length int, ovfl error, helper decHelper) {
   542  	if n := state.decodeUint(); n != uint64(length) {
   543  		errorf("length mismatch in decodeArray")
   544  	}
   545  	dec.decodeArrayHelper(state, value, elemOp, length, ovfl, helper)
   546  }
   547  
   548  // decodeIntoValue is a helper for map decoding.
   549  func decodeIntoValue(state *decoderState, op decOp, isPtr bool, value reflect.Value, ovfl error) reflect.Value {
   550  	instr := &decInstr{op, 0, nil, ovfl}
   551  	v := value
   552  	if isPtr {
   553  		v = decAlloc(value)
   554  	}
   555  	op(instr, state, v)
   556  	return value
   557  }
   558  
   559  // decodeMap decodes a map and stores it in value.
   560  // Maps are encoded as a length followed by key:value pairs.
   561  // Because the internals of maps are not visible to us, we must
   562  // use reflection rather than pointer magic.
   563  func (dec *Decoder) decodeMap(mtyp reflect.Type, state *decoderState, value reflect.Value, keyOp, elemOp decOp, ovfl error) {
   564  	if value.IsNil() {
   565  		// Allocate map.
   566  		value.Set(reflect.MakeMap(mtyp))
   567  	}
   568  	n := int(state.decodeUint())
   569  	keyIsPtr := mtyp.Key().Kind() == reflect.Ptr
   570  	elemIsPtr := mtyp.Elem().Kind() == reflect.Ptr
   571  	for i := 0; i < n; i++ {
   572  		key := decodeIntoValue(state, keyOp, keyIsPtr, allocValue(mtyp.Key()), ovfl)
   573  		elem := decodeIntoValue(state, elemOp, elemIsPtr, allocValue(mtyp.Elem()), ovfl)
   574  		value.SetMapIndex(key, elem)
   575  	}
   576  }
   577  
   578  // ignoreArrayHelper does the work for discarding arrays and slices.
   579  func (dec *Decoder) ignoreArrayHelper(state *decoderState, elemOp decOp, length int) {
   580  	instr := &decInstr{elemOp, 0, nil, errors.New("no error")}
   581  	for i := 0; i < length; i++ {
   582  		if state.b.Len() == 0 {
   583  			errorf("decoding array or slice: length exceeds input size (%d elements)", length)
   584  		}
   585  		elemOp(instr, state, noValue)
   586  	}
   587  }
   588  
   589  // ignoreArray discards the data for an array value with no destination.
   590  func (dec *Decoder) ignoreArray(state *decoderState, elemOp decOp, length int) {
   591  	if n := state.decodeUint(); n != uint64(length) {
   592  		errorf("length mismatch in ignoreArray")
   593  	}
   594  	dec.ignoreArrayHelper(state, elemOp, length)
   595  }
   596  
   597  // ignoreMap discards the data for a map value with no destination.
   598  func (dec *Decoder) ignoreMap(state *decoderState, keyOp, elemOp decOp) {
   599  	n := int(state.decodeUint())
   600  	keyInstr := &decInstr{keyOp, 0, nil, errors.New("no error")}
   601  	elemInstr := &decInstr{elemOp, 0, nil, errors.New("no error")}
   602  	for i := 0; i < n; i++ {
   603  		keyOp(keyInstr, state, noValue)
   604  		elemOp(elemInstr, state, noValue)
   605  	}
   606  }
   607  
   608  // decodeSlice decodes a slice and stores it in value.
   609  // Slices are encoded as an unsigned length followed by the elements.
   610  func (dec *Decoder) decodeSlice(state *decoderState, value reflect.Value, elemOp decOp, ovfl error, helper decHelper) {
   611  	u := state.decodeUint()
   612  	typ := value.Type()
   613  	size := uint64(typ.Elem().Size())
   614  	nBytes := u * size
   615  	n := int(u)
   616  	// Take care with overflow in this calculation.
   617  	if n < 0 || uint64(n) != u || nBytes > tooBig || (size > 0 && nBytes/size != u) {
   618  		// We don't check n against buffer length here because if it's a slice
   619  		// of interfaces, there will be buffer reloads.
   620  		errorf("%s slice too big: %d elements of %d bytes", typ.Elem(), u, size)
   621  	}
   622  	if value.Cap() < n {
   623  		value.Set(reflect.MakeSlice(typ, n, n))
   624  	} else {
   625  		value.Set(value.Slice(0, n))
   626  	}
   627  	dec.decodeArrayHelper(state, value, elemOp, n, ovfl, helper)
   628  }
   629  
   630  // ignoreSlice skips over the data for a slice value with no destination.
   631  func (dec *Decoder) ignoreSlice(state *decoderState, elemOp decOp) {
   632  	dec.ignoreArrayHelper(state, elemOp, int(state.decodeUint()))
   633  }
   634  
   635  // decodeInterface decodes an interface value and stores it in value.
   636  // Interfaces are encoded as the name of a concrete type followed by a value.
   637  // If the name is empty, the value is nil and no value is sent.
   638  func (dec *Decoder) decodeInterface(ityp reflect.Type, state *decoderState, value reflect.Value) {
   639  	// Read the name of the concrete type.
   640  	nr := state.decodeUint()
   641  	if nr > 1<<31 { // zero is permissible for anonymous types
   642  		errorf("invalid type name length %d", nr)
   643  	}
   644  	if nr > uint64(state.b.Len()) {
   645  		errorf("invalid type name length %d: exceeds input size", nr)
   646  	}
   647  	n := int(nr)
   648  	name := state.b.Bytes()[:n]
   649  	state.b.Drop(n)
   650  	// Allocate the destination interface value.
   651  	if len(name) == 0 {
   652  		// Copy the nil interface value to the target.
   653  		value.Set(reflect.Zero(value.Type()))
   654  		return
   655  	}
   656  	if len(name) > 1024 {
   657  		errorf("name too long (%d bytes): %.20q...", len(name), name)
   658  	}
   659  	// The concrete type must be registered.
   660  	registerLock.RLock()
   661  	typ, ok := nameToConcreteType[string(name)]
   662  	registerLock.RUnlock()
   663  	if !ok {
   664  		errorf("name not registered for interface: %q", name)
   665  	}
   666  	// Read the type id of the concrete value.
   667  	concreteId := dec.decodeTypeSequence(true)
   668  	if concreteId < 0 {
   669  		error_(dec.err)
   670  	}
   671  	// Byte count of value is next; we don't care what it is (it's there
   672  	// in case we want to ignore the value by skipping it completely).
   673  	state.decodeUint()
   674  	// Read the concrete value.
   675  	v := allocValue(typ)
   676  	dec.decodeValue(concreteId, v)
   677  	if dec.err != nil {
   678  		error_(dec.err)
   679  	}
   680  	// Assign the concrete value to the interface.
   681  	// Tread carefully; it might not satisfy the interface.
   682  	if !typ.AssignableTo(ityp) {
   683  		errorf("%s is not assignable to type %s", typ, ityp)
   684  	}
   685  	// Copy the interface value to the target.
   686  	value.Set(v)
   687  }
   688  
   689  // ignoreInterface discards the data for an interface value with no destination.
   690  func (dec *Decoder) ignoreInterface(state *decoderState) {
   691  	// Read the name of the concrete type.
   692  	n, ok := state.getLength()
   693  	if !ok {
   694  		errorf("bad interface encoding: name too large for buffer")
   695  	}
   696  	bn := state.b.Len()
   697  	if bn < n {
   698  		errorf("invalid interface value length %d: exceeds input size %d", n, bn)
   699  	}
   700  	state.b.Drop(n)
   701  	id := dec.decodeTypeSequence(true)
   702  	if id < 0 {
   703  		error_(dec.err)
   704  	}
   705  	// At this point, the decoder buffer contains a delimited value. Just toss it.
   706  	n, ok = state.getLength()
   707  	if !ok {
   708  		errorf("bad interface encoding: data length too large for buffer")
   709  	}
   710  	state.b.Drop(n)
   711  }
   712  
   713  // decodeGobDecoder decodes something implementing the GobDecoder interface.
   714  // The data is encoded as a byte slice.
   715  func (dec *Decoder) decodeGobDecoder(ut *userTypeInfo, state *decoderState, value reflect.Value) {
   716  	// Read the bytes for the value.
   717  	n, ok := state.getLength()
   718  	if !ok {
   719  		errorf("GobDecoder: length too large for buffer")
   720  	}
   721  	b := state.b.Bytes()
   722  	if len(b) < n {
   723  		errorf("GobDecoder: invalid data length %d: exceeds input size %d", n, len(b))
   724  	}
   725  	b = b[:n]
   726  	state.b.Drop(n)
   727  	var err error
   728  	// We know it's one of these.
   729  	switch ut.externalDec {
   730  	case xGob:
   731  		err = value.Interface().(GobDecoder).GobDecode(b)
   732  	case xBinary:
   733  		err = value.Interface().(encoding.BinaryUnmarshaler).UnmarshalBinary(b)
   734  	case xText:
   735  		err = value.Interface().(encoding.TextUnmarshaler).UnmarshalText(b)
   736  	}
   737  	if err != nil {
   738  		error_(err)
   739  	}
   740  }
   741  
   742  // ignoreGobDecoder discards the data for a GobDecoder value with no destination.
   743  func (dec *Decoder) ignoreGobDecoder(state *decoderState) {
   744  	// Read the bytes for the value.
   745  	n, ok := state.getLength()
   746  	if !ok {
   747  		errorf("GobDecoder: length too large for buffer")
   748  	}
   749  	bn := state.b.Len()
   750  	if bn < n {
   751  		errorf("GobDecoder: invalid data length %d: exceeds input size %d", n, bn)
   752  	}
   753  	state.b.Drop(n)
   754  }
   755  
   756  // Index by Go types.
   757  var decOpTable = [...]decOp{
   758  	reflect.Bool:       decBool,
   759  	reflect.Int8:       decInt8,
   760  	reflect.Int16:      decInt16,
   761  	reflect.Int32:      decInt32,
   762  	reflect.Int64:      decInt64,
   763  	reflect.Uint8:      decUint8,
   764  	reflect.Uint16:     decUint16,
   765  	reflect.Uint32:     decUint32,
   766  	reflect.Uint64:     decUint64,
   767  	reflect.Float32:    decFloat32,
   768  	reflect.Float64:    decFloat64,
   769  	reflect.Complex64:  decComplex64,
   770  	reflect.Complex128: decComplex128,
   771  	reflect.String:     decString,
   772  }
   773  
   774  // Indexed by gob types.  tComplex will be added during type.init().
   775  var decIgnoreOpMap = map[typeId]decOp{
   776  	tBool:    ignoreUint,
   777  	tInt:     ignoreUint,
   778  	tUint:    ignoreUint,
   779  	tFloat:   ignoreUint,
   780  	tBytes:   ignoreUint8Array,
   781  	tString:  ignoreUint8Array,
   782  	tComplex: ignoreTwoUints,
   783  }
   784  
   785  // decOpFor returns the decoding op for the base type under rt and
   786  // the indirection count to reach it.
   787  func (dec *Decoder) decOpFor(wireId typeId, rt reflect.Type, name string, inProgress map[reflect.Type]*decOp) *decOp {
   788  	ut := userType(rt)
   789  	// If the type implements GobEncoder, we handle it without further processing.
   790  	if ut.externalDec != 0 {
   791  		return dec.gobDecodeOpFor(ut)
   792  	}
   793  
   794  	// If this type is already in progress, it's a recursive type (e.g. map[string]*T).
   795  	// Return the pointer to the op we're already building.
   796  	if opPtr := inProgress[rt]; opPtr != nil {
   797  		return opPtr
   798  	}
   799  	typ := ut.base
   800  	var op decOp
   801  	k := typ.Kind()
   802  	if int(k) < len(decOpTable) {
   803  		op = decOpTable[k]
   804  	}
   805  	if op == nil {
   806  		inProgress[rt] = &op
   807  		// Special cases
   808  		switch t := typ; t.Kind() {
   809  		case reflect.Array:
   810  			name = "element of " + name
   811  			elemId := dec.wireType[wireId].ArrayT.Elem
   812  			elemOp := dec.decOpFor(elemId, t.Elem(), name, inProgress)
   813  			ovfl := overflow(name)
   814  			helper := decArrayHelper[t.Elem().Kind()]
   815  			op = func(i *decInstr, state *decoderState, value reflect.Value) {
   816  				state.dec.decodeArray(t, state, value, *elemOp, t.Len(), ovfl, helper)
   817  			}
   818  
   819  		case reflect.Map:
   820  			keyId := dec.wireType[wireId].MapT.Key
   821  			elemId := dec.wireType[wireId].MapT.Elem
   822  			keyOp := dec.decOpFor(keyId, t.Key(), "key of "+name, inProgress)
   823  			elemOp := dec.decOpFor(elemId, t.Elem(), "element of "+name, inProgress)
   824  			ovfl := overflow(name)
   825  			op = func(i *decInstr, state *decoderState, value reflect.Value) {
   826  				state.dec.decodeMap(t, state, value, *keyOp, *elemOp, ovfl)
   827  			}
   828  
   829  		case reflect.Slice:
   830  			name = "element of " + name
   831  			if t.Elem().Kind() == reflect.Uint8 {
   832  				op = decUint8Slice
   833  				break
   834  			}
   835  			var elemId typeId
   836  			if tt, ok := builtinIdToType[wireId]; ok {
   837  				elemId = tt.(*sliceType).Elem
   838  			} else {
   839  				elemId = dec.wireType[wireId].SliceT.Elem
   840  			}
   841  			elemOp := dec.decOpFor(elemId, t.Elem(), name, inProgress)
   842  			ovfl := overflow(name)
   843  			helper := decSliceHelper[t.Elem().Kind()]
   844  			op = func(i *decInstr, state *decoderState, value reflect.Value) {
   845  				state.dec.decodeSlice(state, value, *elemOp, ovfl, helper)
   846  			}
   847  
   848  		case reflect.Struct:
   849  			// Generate a closure that calls out to the engine for the nested type.
   850  			ut := userType(typ)
   851  			enginePtr, err := dec.getDecEnginePtr(wireId, ut)
   852  			if err != nil {
   853  				error_(err)
   854  			}
   855  			op = func(i *decInstr, state *decoderState, value reflect.Value) {
   856  				// indirect through enginePtr to delay evaluation for recursive structs.
   857  				dec.decodeStruct(*enginePtr, ut, value)
   858  			}
   859  		case reflect.Interface:
   860  			op = func(i *decInstr, state *decoderState, value reflect.Value) {
   861  				state.dec.decodeInterface(t, state, value)
   862  			}
   863  		}
   864  	}
   865  	if op == nil {
   866  		errorf("decode can't handle type %s", rt)
   867  	}
   868  	return &op
   869  }
   870  
   871  // decIgnoreOpFor returns the decoding op for a field that has no destination.
   872  func (dec *Decoder) decIgnoreOpFor(wireId typeId, inProgress map[typeId]*decOp) *decOp {
   873  	// If this type is already in progress, it's a recursive type (e.g. map[string]*T).
   874  	// Return the pointer to the op we're already building.
   875  	if opPtr := inProgress[wireId]; opPtr != nil {
   876  		return opPtr
   877  	}
   878  	op, ok := decIgnoreOpMap[wireId]
   879  	if !ok {
   880  		inProgress[wireId] = &op
   881  		if wireId == tInterface {
   882  			// Special case because it's a method: the ignored item might
   883  			// define types and we need to record their state in the decoder.
   884  			op = func(i *decInstr, state *decoderState, value reflect.Value) {
   885  				state.dec.ignoreInterface(state)
   886  			}
   887  			return &op
   888  		}
   889  		// Special cases
   890  		wire := dec.wireType[wireId]
   891  		switch {
   892  		case wire == nil:
   893  			errorf("bad data: undefined type %s", wireId.string())
   894  		case wire.ArrayT != nil:
   895  			elemId := wire.ArrayT.Elem
   896  			elemOp := dec.decIgnoreOpFor(elemId, inProgress)
   897  			op = func(i *decInstr, state *decoderState, value reflect.Value) {
   898  				state.dec.ignoreArray(state, *elemOp, wire.ArrayT.Len)
   899  			}
   900  
   901  		case wire.MapT != nil:
   902  			keyId := dec.wireType[wireId].MapT.Key
   903  			elemId := dec.wireType[wireId].MapT.Elem
   904  			keyOp := dec.decIgnoreOpFor(keyId, inProgress)
   905  			elemOp := dec.decIgnoreOpFor(elemId, inProgress)
   906  			op = func(i *decInstr, state *decoderState, value reflect.Value) {
   907  				state.dec.ignoreMap(state, *keyOp, *elemOp)
   908  			}
   909  
   910  		case wire.SliceT != nil:
   911  			elemId := wire.SliceT.Elem
   912  			elemOp := dec.decIgnoreOpFor(elemId, inProgress)
   913  			op = func(i *decInstr, state *decoderState, value reflect.Value) {
   914  				state.dec.ignoreSlice(state, *elemOp)
   915  			}
   916  
   917  		case wire.StructT != nil:
   918  			// Generate a closure that calls out to the engine for the nested type.
   919  			enginePtr, err := dec.getIgnoreEnginePtr(wireId)
   920  			if err != nil {
   921  				error_(err)
   922  			}
   923  			op = func(i *decInstr, state *decoderState, value reflect.Value) {
   924  				// indirect through enginePtr to delay evaluation for recursive structs
   925  				state.dec.ignoreStruct(*enginePtr)
   926  			}
   927  
   928  		case wire.GobEncoderT != nil, wire.BinaryMarshalerT != nil, wire.TextMarshalerT != nil:
   929  			op = func(i *decInstr, state *decoderState, value reflect.Value) {
   930  				state.dec.ignoreGobDecoder(state)
   931  			}
   932  		}
   933  	}
   934  	if op == nil {
   935  		errorf("bad data: ignore can't handle type %s", wireId.string())
   936  	}
   937  	return &op
   938  }
   939  
   940  // gobDecodeOpFor returns the op for a type that is known to implement
   941  // GobDecoder.
   942  func (dec *Decoder) gobDecodeOpFor(ut *userTypeInfo) *decOp {
   943  	rcvrType := ut.user
   944  	if ut.decIndir == -1 {
   945  		rcvrType = reflect.PtrTo(rcvrType)
   946  	} else if ut.decIndir > 0 {
   947  		for i := int8(0); i < ut.decIndir; i++ {
   948  			rcvrType = rcvrType.Elem()
   949  		}
   950  	}
   951  	var op decOp
   952  	op = func(i *decInstr, state *decoderState, value reflect.Value) {
   953  		// We now have the base type. We need its address if the receiver is a pointer.
   954  		if value.Kind() != reflect.Ptr && rcvrType.Kind() == reflect.Ptr {
   955  			value = value.Addr()
   956  		}
   957  		state.dec.decodeGobDecoder(ut, state, value)
   958  	}
   959  	return &op
   960  }
   961  
   962  // compatibleType asks: Are these two gob Types compatible?
   963  // Answers the question for basic types, arrays, maps and slices, plus
   964  // GobEncoder/Decoder pairs.
   965  // Structs are considered ok; fields will be checked later.
   966  func (dec *Decoder) compatibleType(fr reflect.Type, fw typeId, inProgress map[reflect.Type]typeId) bool {
   967  	if rhs, ok := inProgress[fr]; ok {
   968  		return rhs == fw
   969  	}
   970  	inProgress[fr] = fw
   971  	ut := userType(fr)
   972  	wire, ok := dec.wireType[fw]
   973  	// If wire was encoded with an encoding method, fr must have that method.
   974  	// And if not, it must not.
   975  	// At most one of the booleans in ut is set.
   976  	// We could possibly relax this constraint in the future in order to
   977  	// choose the decoding method using the data in the wireType.
   978  	// The parentheses look odd but are correct.
   979  	if (ut.externalDec == xGob) != (ok && wire.GobEncoderT != nil) ||
   980  		(ut.externalDec == xBinary) != (ok && wire.BinaryMarshalerT != nil) ||
   981  		(ut.externalDec == xText) != (ok && wire.TextMarshalerT != nil) {
   982  		return false
   983  	}
   984  	if ut.externalDec != 0 { // This test trumps all others.
   985  		return true
   986  	}
   987  	switch t := ut.base; t.Kind() {
   988  	default:
   989  		// chan, etc: cannot handle.
   990  		return false
   991  	case reflect.Bool:
   992  		return fw == tBool
   993  	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
   994  		return fw == tInt
   995  	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
   996  		return fw == tUint
   997  	case reflect.Float32, reflect.Float64:
   998  		return fw == tFloat
   999  	case reflect.Complex64, reflect.Complex128:
  1000  		return fw == tComplex
  1001  	case reflect.String:
  1002  		return fw == tString
  1003  	case reflect.Interface:
  1004  		return fw == tInterface
  1005  	case reflect.Array:
  1006  		if !ok || wire.ArrayT == nil {
  1007  			return false
  1008  		}
  1009  		array := wire.ArrayT
  1010  		return t.Len() == array.Len && dec.compatibleType(t.Elem(), array.Elem, inProgress)
  1011  	case reflect.Map:
  1012  		if !ok || wire.MapT == nil {
  1013  			return false
  1014  		}
  1015  		MapType := wire.MapT
  1016  		return dec.compatibleType(t.Key(), MapType.Key, inProgress) && dec.compatibleType(t.Elem(), MapType.Elem, inProgress)
  1017  	case reflect.Slice:
  1018  		// Is it an array of bytes?
  1019  		if t.Elem().Kind() == reflect.Uint8 {
  1020  			return fw == tBytes
  1021  		}
  1022  		// Extract and compare element types.
  1023  		var sw *sliceType
  1024  		if tt, ok := builtinIdToType[fw]; ok {
  1025  			sw, _ = tt.(*sliceType)
  1026  		} else if wire != nil {
  1027  			sw = wire.SliceT
  1028  		}
  1029  		elem := userType(t.Elem()).base
  1030  		return sw != nil && dec.compatibleType(elem, sw.Elem, inProgress)
  1031  	case reflect.Struct:
  1032  		return true
  1033  	}
  1034  }
  1035  
  1036  // typeString returns a human-readable description of the type identified by remoteId.
  1037  func (dec *Decoder) typeString(remoteId typeId) string {
  1038  	if t := idToType[remoteId]; t != nil {
  1039  		// globally known type.
  1040  		return t.string()
  1041  	}
  1042  	return dec.wireType[remoteId].string()
  1043  }
  1044  
  1045  // compileSingle compiles the decoder engine for a non-struct top-level value, including
  1046  // GobDecoders.
  1047  func (dec *Decoder) compileSingle(remoteId typeId, ut *userTypeInfo) (engine *decEngine, err error) {
  1048  	rt := ut.user
  1049  	engine = new(decEngine)
  1050  	engine.instr = make([]decInstr, 1) // one item
  1051  	name := rt.String()                // best we can do
  1052  	if !dec.compatibleType(rt, remoteId, make(map[reflect.Type]typeId)) {
  1053  		remoteType := dec.typeString(remoteId)
  1054  		// Common confusing case: local interface type, remote concrete type.
  1055  		if ut.base.Kind() == reflect.Interface && remoteId != tInterface {
  1056  			return nil, errors.New("gob: local interface type " + name + " can only be decoded from remote interface type; received concrete type " + remoteType)
  1057  		}
  1058  		return nil, errors.New("gob: decoding into local type " + name + ", received remote type " + remoteType)
  1059  	}
  1060  	op := dec.decOpFor(remoteId, rt, name, make(map[reflect.Type]*decOp))
  1061  	ovfl := errors.New(`value for "` + name + `" out of range`)
  1062  	engine.instr[singletonField] = decInstr{*op, singletonField, nil, ovfl}
  1063  	engine.numInstr = 1
  1064  	return
  1065  }
  1066  
  1067  // compileIgnoreSingle compiles the decoder engine for a non-struct top-level value that will be discarded.
  1068  func (dec *Decoder) compileIgnoreSingle(remoteId typeId) (engine *decEngine, err error) {
  1069  	engine = new(decEngine)
  1070  	engine.instr = make([]decInstr, 1) // one item
  1071  	op := dec.decIgnoreOpFor(remoteId, make(map[typeId]*decOp))
  1072  	ovfl := overflow(dec.typeString(remoteId))
  1073  	engine.instr[0] = decInstr{*op, 0, nil, ovfl}
  1074  	engine.numInstr = 1
  1075  	return
  1076  }
  1077  
  1078  // compileDec compiles the decoder engine for a value. If the value is not a struct,
  1079  // it calls out to compileSingle.
  1080  func (dec *Decoder) compileDec(remoteId typeId, ut *userTypeInfo) (engine *decEngine, err error) {
  1081  	defer catchError(&err)
  1082  	rt := ut.base
  1083  	srt := rt
  1084  	if srt.Kind() != reflect.Struct || ut.externalDec != 0 {
  1085  		return dec.compileSingle(remoteId, ut)
  1086  	}
  1087  	var wireStruct *structType
  1088  	// Builtin types can come from global pool; the rest must be defined by the decoder.
  1089  	// Also we know we're decoding a struct now, so the client must have sent one.
  1090  	if t, ok := builtinIdToType[remoteId]; ok {
  1091  		wireStruct, _ = t.(*structType)
  1092  	} else {
  1093  		wire := dec.wireType[remoteId]
  1094  		if wire == nil {
  1095  			error_(errBadType)
  1096  		}
  1097  		wireStruct = wire.StructT
  1098  	}
  1099  	if wireStruct == nil {
  1100  		errorf("type mismatch in decoder: want struct type %s; got non-struct", rt)
  1101  	}
  1102  	engine = new(decEngine)
  1103  	engine.instr = make([]decInstr, len(wireStruct.Field))
  1104  	seen := make(map[reflect.Type]*decOp)
  1105  	// Loop over the fields of the wire type.
  1106  	for fieldnum := 0; fieldnum < len(wireStruct.Field); fieldnum++ {
  1107  		wireField := wireStruct.Field[fieldnum]
  1108  		if wireField.Name == "" {
  1109  			errorf("empty name for remote field of type %s", wireStruct.Name)
  1110  		}
  1111  		ovfl := overflow(wireField.Name)
  1112  		// Find the field of the local type with the same name.
  1113  		localField, present := srt.FieldByName(wireField.Name)
  1114  		// TODO(r): anonymous names
  1115  		if !present || !isExported(wireField.Name) {
  1116  			op := dec.decIgnoreOpFor(wireField.Id, make(map[typeId]*decOp))
  1117  			engine.instr[fieldnum] = decInstr{*op, fieldnum, nil, ovfl}
  1118  			continue
  1119  		}
  1120  		if !dec.compatibleType(localField.Type, wireField.Id, make(map[reflect.Type]typeId)) {
  1121  			errorf("wrong type (%s) for received field %s.%s", localField.Type, wireStruct.Name, wireField.Name)
  1122  		}
  1123  		op := dec.decOpFor(wireField.Id, localField.Type, localField.Name, seen)
  1124  		engine.instr[fieldnum] = decInstr{*op, fieldnum, localField.Index, ovfl}
  1125  		engine.numInstr++
  1126  	}
  1127  	return
  1128  }
  1129  
  1130  // getDecEnginePtr returns the engine for the specified type.
  1131  func (dec *Decoder) getDecEnginePtr(remoteId typeId, ut *userTypeInfo) (enginePtr **decEngine, err error) {
  1132  	rt := ut.user
  1133  	decoderMap, ok := dec.decoderCache[rt]
  1134  	if !ok {
  1135  		decoderMap = make(map[typeId]**decEngine)
  1136  		dec.decoderCache[rt] = decoderMap
  1137  	}
  1138  	if enginePtr, ok = decoderMap[remoteId]; !ok {
  1139  		// To handle recursive types, mark this engine as underway before compiling.
  1140  		enginePtr = new(*decEngine)
  1141  		decoderMap[remoteId] = enginePtr
  1142  		*enginePtr, err = dec.compileDec(remoteId, ut)
  1143  		if err != nil {
  1144  			delete(decoderMap, remoteId)
  1145  		}
  1146  	}
  1147  	return
  1148  }
  1149  
  1150  // emptyStruct is the type we compile into when ignoring a struct value.
  1151  type emptyStruct struct{}
  1152  
  1153  var emptyStructType = reflect.TypeOf(emptyStruct{})
  1154  
  1155  // getIgnoreEnginePtr returns the engine for the specified type when the value is to be discarded.
  1156  func (dec *Decoder) getIgnoreEnginePtr(wireId typeId) (enginePtr **decEngine, err error) {
  1157  	var ok bool
  1158  	if enginePtr, ok = dec.ignorerCache[wireId]; !ok {
  1159  		// To handle recursive types, mark this engine as underway before compiling.
  1160  		enginePtr = new(*decEngine)
  1161  		dec.ignorerCache[wireId] = enginePtr
  1162  		wire := dec.wireType[wireId]
  1163  		if wire != nil && wire.StructT != nil {
  1164  			*enginePtr, err = dec.compileDec(wireId, userType(emptyStructType))
  1165  		} else {
  1166  			*enginePtr, err = dec.compileIgnoreSingle(wireId)
  1167  		}
  1168  		if err != nil {
  1169  			delete(dec.ignorerCache, wireId)
  1170  		}
  1171  	}
  1172  	return
  1173  }
  1174  
  1175  // decodeValue decodes the data stream representing a value and stores it in value.
  1176  func (dec *Decoder) decodeValue(wireId typeId, value reflect.Value) {
  1177  	defer catchError(&dec.err)
  1178  	// If the value is nil, it means we should just ignore this item.
  1179  	if !value.IsValid() {
  1180  		dec.decodeIgnoredValue(wireId)
  1181  		return
  1182  	}
  1183  	// Dereference down to the underlying type.
  1184  	ut := userType(value.Type())
  1185  	base := ut.base
  1186  	var enginePtr **decEngine
  1187  	enginePtr, dec.err = dec.getDecEnginePtr(wireId, ut)
  1188  	if dec.err != nil {
  1189  		return
  1190  	}
  1191  	value = decAlloc(value)
  1192  	engine := *enginePtr
  1193  	if st := base; st.Kind() == reflect.Struct && ut.externalDec == 0 {
  1194  		wt := dec.wireType[wireId]
  1195  		if engine.numInstr == 0 && st.NumField() > 0 &&
  1196  			wt != nil && len(wt.StructT.Field) > 0 {
  1197  			name := base.Name()
  1198  			errorf("type mismatch: no fields matched compiling decoder for %s", name)
  1199  		}
  1200  		dec.decodeStruct(engine, ut, value)
  1201  	} else {
  1202  		dec.decodeSingle(engine, ut, value)
  1203  	}
  1204  }
  1205  
  1206  // decodeIgnoredValue decodes the data stream representing a value of the specified type and discards it.
  1207  func (dec *Decoder) decodeIgnoredValue(wireId typeId) {
  1208  	var enginePtr **decEngine
  1209  	enginePtr, dec.err = dec.getIgnoreEnginePtr(wireId)
  1210  	if dec.err != nil {
  1211  		return
  1212  	}
  1213  	wire := dec.wireType[wireId]
  1214  	if wire != nil && wire.StructT != nil {
  1215  		dec.ignoreStruct(*enginePtr)
  1216  	} else {
  1217  		dec.ignoreSingle(*enginePtr)
  1218  	}
  1219  }
  1220  
  1221  func init() {
  1222  	var iop, uop decOp
  1223  	switch reflect.TypeOf(int(0)).Bits() {
  1224  	case 32:
  1225  		iop = decInt32
  1226  		uop = decUint32
  1227  	case 64:
  1228  		iop = decInt64
  1229  		uop = decUint64
  1230  	default:
  1231  		panic("gob: unknown size of int/uint")
  1232  	}
  1233  	decOpTable[reflect.Int] = iop
  1234  	decOpTable[reflect.Uint] = uop
  1235  
  1236  	// Finally uintptr
  1237  	switch reflect.TypeOf(uintptr(0)).Bits() {
  1238  	case 32:
  1239  		uop = decUint32
  1240  	case 64:
  1241  		uop = decUint64
  1242  	default:
  1243  		panic("gob: unknown size of uintptr")
  1244  	}
  1245  	decOpTable[reflect.Uintptr] = uop
  1246  }
  1247  
  1248  // Gob depends on being able to take the address
  1249  // of zeroed Values it creates, so use this wrapper instead
  1250  // of the standard reflect.Zero.
  1251  // Each call allocates once.
  1252  func allocValue(t reflect.Type) reflect.Value {
  1253  	return reflect.New(t).Elem()
  1254  }