...

Source file src/encoding/gob/decode.go

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

View as plain text