github.com/lheiskan/zebrapack@v4.1.1-0.20181107023619-e955d028f9bf+incompatible/msgp/read.go (about)

     1  package msgp
     2  
     3  import (
     4  	"io"
     5  	"math"
     6  	"sync"
     7  	"time"
     8  
     9  	"github.com/philhofer/fwd"
    10  )
    11  
    12  // PreSave will be called before EncodeMsg/MarshalMsg
    13  // if you struct implements it.
    14  type PreSave interface {
    15  
    16  	// PreSaveHook is called before msgp.MarshalMsg
    17  	// and msgp.EncodeMsg. It allows you to prep
    18  	// the struct for serialization. See
    19  	// PostLoadHook for the complimentary hook
    20  	// called after deserialization.
    21  	PreSaveHook()
    22  }
    23  
    24  // PostLoad will be called after DecodeMsg/UnmarshalMsg,
    25  // if you struct implements it.
    26  type PostLoad interface {
    27  
    28  	// PostLoadHook is called after
    29  	// msgp.UnmarshalMsg and msgp.DecodeMsg.
    30  	// The opposite of PreSaveHook, it allows
    31  	// one to add a custom finishing step
    32  	// after basic deserialization has
    33  	// completed.
    34  	PostLoadHook()
    35  }
    36  
    37  type ConcreteFactory interface {
    38  	NewValueAsInterface(zid int64, typename string) interface{}
    39  }
    40  
    41  // where we keep old *Readers
    42  var readerPool = sync.Pool{New: func() interface{} { return &Reader{} }}
    43  
    44  // Type is a MessagePack wire type,
    45  // including this package's built-in
    46  // extension types.
    47  type Type byte
    48  
    49  // MessagePack Types
    50  //
    51  // The zero value of Type
    52  // is InvalidType.
    53  const (
    54  	InvalidType Type = iota
    55  
    56  	// MessagePack built-in types
    57  
    58  	StrType
    59  	BinType
    60  	MapType
    61  	ArrayType
    62  	Float64Type
    63  	Float32Type
    64  	BoolType
    65  	IntType
    66  	UintType
    67  	NilType
    68  	ExtensionType
    69  
    70  	// pseudo-types provided
    71  	// by extensions
    72  
    73  	Complex64Type
    74  	Complex128Type
    75  	TimeType
    76  
    77  	_maxtype
    78  )
    79  
    80  // String implements fmt.Stringer
    81  func (t Type) String() string {
    82  	switch t {
    83  	case StrType:
    84  		return "str"
    85  	case BinType:
    86  		return "bin"
    87  	case MapType:
    88  		return "map"
    89  	case ArrayType:
    90  		return "array"
    91  	case Float64Type:
    92  		return "float64"
    93  	case Float32Type:
    94  		return "float32"
    95  	case BoolType:
    96  		return "bool"
    97  	case UintType:
    98  		return "uint"
    99  	case IntType:
   100  		return "int"
   101  	case ExtensionType:
   102  		return "ext"
   103  	case NilType:
   104  		return "nil"
   105  	default:
   106  		return "<invalid>"
   107  	}
   108  }
   109  
   110  func freeR(m *Reader) {
   111  	readerPool.Put(m)
   112  }
   113  
   114  // Unmarshaler is the interface fulfilled
   115  // by objects that know how to unmarshal
   116  // themselves from MessagePack.
   117  // UnmarshalMsg unmarshals the object
   118  // from binary, returing any leftover
   119  // bytes and any errors encountered.
   120  type Unmarshaler interface {
   121  	UnmarshalMsg([]byte) ([]byte, error)
   122  }
   123  
   124  // Decodable is the interface fulfilled
   125  // by objects that know how to read
   126  // themselves from a *Reader.
   127  type Decodable interface {
   128  	DecodeMsg(*Reader) error
   129  }
   130  
   131  // Decode decodes 'd' from 'r'.
   132  func Decode(r io.Reader, d Decodable) error {
   133  	rd := NewReader(r)
   134  	err := d.DecodeMsg(rd)
   135  	freeR(rd)
   136  	return err
   137  }
   138  
   139  // NewReader returns a *Reader that
   140  // reads from the provided reader. The
   141  // reader will be buffered.
   142  func NewReader(r io.Reader) *Reader {
   143  	p := readerPool.Get().(*Reader)
   144  	if p.R == nil {
   145  		p.R = fwd.NewReader(r)
   146  	} else {
   147  		p.R.Reset(r)
   148  	}
   149  	return p
   150  }
   151  
   152  // NewReaderSize returns a *Reader with a buffer of the given size.
   153  // (This is vastly preferable to passing the decoder a reader that is already buffered.)
   154  func NewReaderSize(r io.Reader, sz int) *Reader {
   155  	return &Reader{R: fwd.NewReaderSize(r, sz)}
   156  }
   157  
   158  // Reader wraps an io.Reader and provides
   159  // methods to read MessagePack-encoded values
   160  // from it. Readers are buffered.
   161  type Reader struct {
   162  	// R is the buffered reader
   163  	// that the Reader uses
   164  	// to decode MessagePack.
   165  	// The Reader itself
   166  	// is stateless; all the
   167  	// buffering is done
   168  	// within R.
   169  	R       *fwd.Reader
   170  	scratch []byte
   171  
   172  	NilTracker
   173  }
   174  
   175  // NilTracker maintains a stack to assit
   176  // DecodeMsg methods when deserializing
   177  // from nil  fields.
   178  type NilTracker struct {
   179  	// simulate getting nils on the wire
   180  	AlwaysNil     bool
   181  	LifoAlwaysNil []bool
   182  }
   183  
   184  // AlwaysNilString returns a string representation
   185  // of the internal state of the stack for
   186  // debugging purposes.
   187  func (r *NilTracker) AlwaysNilString() string {
   188  	s := "bottom: "
   189  	for _, v := range r.LifoAlwaysNil {
   190  		if v {
   191  			s += "T"
   192  		} else {
   193  			s += "f"
   194  		}
   195  	}
   196  	return s
   197  }
   198  
   199  // PushAlwaysNil will set r.AlwaysNil to true
   200  // and store the previous value of r.AlwaysNil
   201  // on the internal stack.
   202  func (r *NilTracker) PushAlwaysNil() {
   203  	// save current state
   204  	r.LifoAlwaysNil = append(r.LifoAlwaysNil, r.AlwaysNil)
   205  	// set reader r to always return nils
   206  	r.AlwaysNil = true
   207  }
   208  
   209  // PopAlwaysNil pops the last entry off the
   210  // internal stack and uses it to set
   211  // r.AlwaysNil.
   212  func (r *NilTracker) PopAlwaysNil() {
   213  	n := len(r.LifoAlwaysNil)
   214  	//fmt.Printf("\n Reader.PopAlwaysNil() called! qlen = %d, '%s'\n",
   215  	//	n, r.AlwaysNilString())
   216  	if n == 0 {
   217  		panic("PopAlwaysNil called on empty lifo")
   218  		return
   219  	}
   220  	a := r.LifoAlwaysNil[n-1]
   221  	r.LifoAlwaysNil = r.LifoAlwaysNil[:n-1]
   222  	r.AlwaysNil = a
   223  }
   224  
   225  // Read implements `io.Reader`
   226  func (m *Reader) Read(p []byte) (int, error) {
   227  	if m.AlwaysNil {
   228  		return 0, nil
   229  	}
   230  	return m.R.Read(p)
   231  }
   232  
   233  // ReadFull implements `io.ReadFull`
   234  func (m *Reader) ReadFull(p []byte) (int, error) {
   235  	if m.AlwaysNil {
   236  		return 0, nil
   237  	}
   238  
   239  	return m.R.ReadFull(p)
   240  }
   241  
   242  // Reset resets the underlying reader.
   243  func (m *Reader) Reset(r io.Reader) { m.R.Reset(r) }
   244  
   245  // Buffered returns the number of bytes currently in the read buffer.
   246  func (m *Reader) Buffered() int { return m.R.Buffered() }
   247  
   248  // BufferSize returns the capacity of the read buffer.
   249  func (m *Reader) BufferSize() int { return m.R.BufferSize() }
   250  
   251  // NextStructName inspects the next time, assuming it is a
   252  // struct (map) for its (-1: name) key-value pair, and returns the name
   253  // or empty string if not found. Also empty string if not
   254  // a map type.
   255  func (m *Reader) NextStructName() string {
   256  	ty, err := m.NextType()
   257  	if err != nil {
   258  		return ""
   259  	}
   260  	if ty != MapType {
   261  		return ""
   262  	}
   263  
   264  	// map header can be of varying size
   265  	hdsz := 1
   266  	var p []byte
   267  	var lead byte
   268  	p, err = m.R.Peek(2)
   269  	if err != nil {
   270  		return ""
   271  	}
   272  	lead = p[0]
   273  	if isfixmap(lead) {
   274  		hdsz = 1
   275  	} else {
   276  		switch lead {
   277  		case mmap16:
   278  			hdsz = 3
   279  		case mmap32:
   280  			hdsz = 5
   281  		default:
   282  			//err = badPrefix(MapType, lead)
   283  			return ""
   284  		}
   285  	}
   286  
   287  	// now we've got the map header out of the
   288  	// way in hdsz bytes
   289  	p, err = m.R.Peek(hdsz + 3)
   290  	if err != nil {
   291  		return ""
   292  	}
   293  	keystart := p[hdsz:]
   294  	if keystart[0] != 0xff {
   295  		return "" // not the -1 key with value the struct name
   296  	}
   297  
   298  	valstart := hdsz + 1
   299  	valTypeBytes := 1
   300  	skip := valstart + valTypeBytes
   301  	lead = p[valstart]
   302  	var read int
   303  	if isfixstr(lead) {
   304  		// lead is a fixstr, good
   305  		read = int(rfixstr(lead))
   306  	} else {
   307  		switch lead {
   308  		case mstr8, mbin8:
   309  			valTypeBytes = 2
   310  			skip = valstart + valTypeBytes
   311  			p, err = m.R.Peek(skip)
   312  			if err != nil {
   313  				return ""
   314  			}
   315  			read = int(p[valstart+1])
   316  		case mstr16, mbin16:
   317  			valTypeBytes = 3
   318  			skip = valstart + valTypeBytes
   319  			p, err = m.R.Peek(skip)
   320  			if err != nil {
   321  				return ""
   322  			}
   323  			read = int(big.Uint16(p[valstart+1:]))
   324  		case mstr32, mbin32:
   325  			valTypeBytes = 5
   326  			skip = valstart + valTypeBytes
   327  			p, err = m.R.Peek(skip)
   328  			if err != nil {
   329  				return ""
   330  			}
   331  			read = int(big.Uint32(p[valstart+1:]))
   332  		default:
   333  			return "" // not a string
   334  		}
   335  	}
   336  	// read string strictly through peaking!
   337  	if read == 0 {
   338  		return ""
   339  	}
   340  	p, err = m.R.Peek(skip + read)
   341  	if err != nil {
   342  		return ""
   343  	}
   344  	//_, _ = m.R.Skip(skip + read)
   345  	return string(p[skip:])
   346  }
   347  
   348  // NextType returns the next object type to be decoded.
   349  func (m *Reader) NextType() (Type, error) {
   350  	if m.AlwaysNil {
   351  		return NilType, nil
   352  	}
   353  
   354  	p, err := m.R.Peek(1)
   355  	if err != nil {
   356  		return InvalidType, err
   357  	}
   358  	t := getType(p[0])
   359  	if t == InvalidType {
   360  		return t, InvalidPrefixError(p[0])
   361  	}
   362  	if t == ExtensionType {
   363  		v, err := m.peekExtensionType()
   364  		if err != nil {
   365  			return InvalidType, err
   366  		}
   367  		switch v {
   368  		case Complex64Extension:
   369  			return Complex64Type, nil
   370  		case Complex128Extension:
   371  			return Complex128Type, nil
   372  		case TimeExtension:
   373  			return TimeType, nil
   374  		}
   375  	}
   376  	return t, nil
   377  }
   378  
   379  // IsNil returns whether or not
   380  // the next byte is a null messagepack byte
   381  func (m *Reader) IsNil() bool {
   382  	if m.AlwaysNil {
   383  		return true
   384  	}
   385  	p, err := m.R.Peek(1)
   386  	return err == nil && p[0] == mnil
   387  }
   388  
   389  func (m *Reader) peekNil() bool {
   390  	p, err := m.R.Peek(1)
   391  	return err == nil && p[0] == mnil
   392  }
   393  
   394  // returns (obj size, obj elements, error)
   395  // only maps and arrays have non-zero obj elements
   396  //
   397  // use uintptr b/c it's guaranteed to be large enough
   398  // to hold whatever we can fit in memory.
   399  func getNextSize(r *fwd.Reader) (uintptr, uintptr, error) {
   400  	b, err := r.Peek(1)
   401  	if err != nil {
   402  		return 0, 0, err
   403  	}
   404  	lead := b[0]
   405  	spec := &sizes[lead]
   406  	size, mode := spec.size, spec.extra
   407  	if size == 0 {
   408  		return 0, 0, InvalidPrefixError(lead)
   409  	}
   410  	if mode >= 0 {
   411  		return uintptr(size), uintptr(mode), nil
   412  	}
   413  	b, err = r.Peek(int(size))
   414  	if err != nil {
   415  		return 0, 0, err
   416  	}
   417  	switch mode {
   418  	case extra8:
   419  		return uintptr(size) + uintptr(b[1]), 0, nil
   420  	case extra16:
   421  		return uintptr(size) + uintptr(big.Uint16(b[1:])), 0, nil
   422  	case extra32:
   423  		return uintptr(size) + uintptr(big.Uint32(b[1:])), 0, nil
   424  	case map16v:
   425  		return uintptr(size), 2 * uintptr(big.Uint16(b[1:])), nil
   426  	case map32v:
   427  		return uintptr(size), 2 * uintptr(big.Uint32(b[1:])), nil
   428  	case array16v:
   429  		return uintptr(size), uintptr(big.Uint16(b[1:])), nil
   430  	case array32v:
   431  		return uintptr(size), uintptr(big.Uint32(b[1:])), nil
   432  	default:
   433  		return 0, 0, fatal
   434  	}
   435  }
   436  
   437  // Skip skips over the next object, regardless of
   438  // its type. If it is an array or map, the whole array
   439  // or map will be skipped.
   440  func (m *Reader) Skip() error {
   441  	var (
   442  		v   uintptr // bytes
   443  		o   uintptr // objects
   444  		err error
   445  		p   []byte
   446  	)
   447  
   448  	// we can use the faster
   449  	// method if we have enough
   450  	// buffered data
   451  	if m.R.Buffered() >= 5 {
   452  		p, err = m.R.Peek(5)
   453  		if err != nil {
   454  			return err
   455  		}
   456  		v, o, err = getSize(p)
   457  		if err != nil {
   458  			return err
   459  		}
   460  	} else {
   461  		v, o, err = getNextSize(m.R)
   462  		if err != nil {
   463  			return err
   464  		}
   465  	}
   466  
   467  	// 'v' is always non-zero
   468  	// if err == nil
   469  	_, err = m.R.Skip(int(v))
   470  	if err != nil {
   471  		return err
   472  	}
   473  
   474  	// for maps and slices, skip elements
   475  	for x := uintptr(0); x < o; x++ {
   476  		err = m.Skip()
   477  		if err != nil {
   478  			return err
   479  		}
   480  	}
   481  	return nil
   482  }
   483  
   484  // ReadMapHeader reads the next object
   485  // as a map header and returns the size
   486  // of the map and the number of bytes written.
   487  // It will return a TypeError{} if the next
   488  // object is not a map.
   489  func (m *Reader) ReadMapHeader() (sz uint32, err error) {
   490  	if m.checkAndConsumeNil() {
   491  		return 0, nil
   492  	}
   493  	var p []byte
   494  	var lead byte
   495  	p, err = m.R.Peek(1)
   496  	if err != nil {
   497  		return
   498  	}
   499  	lead = p[0]
   500  	if isfixmap(lead) {
   501  		sz = uint32(rfixmap(lead))
   502  		_, err = m.R.Skip(1)
   503  		return
   504  	}
   505  	switch lead {
   506  	case mmap16:
   507  		p, err = m.R.Next(3)
   508  		if err != nil {
   509  			return
   510  		}
   511  		sz = uint32(big.Uint16(p[1:]))
   512  		return
   513  	case mmap32:
   514  		p, err = m.R.Next(5)
   515  		if err != nil {
   516  			return
   517  		}
   518  		sz = big.Uint32(p[1:])
   519  		return
   520  	default:
   521  		err = badPrefix(MapType, lead)
   522  		return
   523  	}
   524  }
   525  
   526  // ReadMapKey reads either a 'str' or 'bin' field from
   527  // the reader and returns the value as a []byte. It uses
   528  // scratch for storage if it is large enough.
   529  func (m *Reader) ReadMapKey(scratch []byte) ([]byte, error) {
   530  	if m.checkAndConsumeNil() {
   531  		return nil, nil
   532  	}
   533  
   534  	out, err := m.ReadStringAsBytes(scratch)
   535  	if err != nil {
   536  		if tperr, ok := err.(TypeError); ok && tperr.Encoded == BinType {
   537  			return m.ReadBytes(scratch)
   538  		}
   539  		return nil, err
   540  	}
   541  	return out, nil
   542  }
   543  
   544  // MapKeyPtr returns a []byte pointing to the contents
   545  // of a valid map key. The key cannot be empty, and it
   546  // must be shorter than the total buffer size of the
   547  // *Reader. Additionally, the returned slice is only
   548  // valid until the next *Reader method call. Users
   549  // should exercise extreme care when using this
   550  // method; writing into the returned slice may
   551  // corrupt future reads.
   552  func (m *Reader) ReadMapKeyPtr() ([]byte, error) {
   553  	if m.checkAndConsumeNil() {
   554  		return nil, nil
   555  	}
   556  
   557  	p, err := m.R.Peek(1)
   558  	if err != nil {
   559  		return nil, err
   560  	}
   561  	lead := p[0]
   562  	var read int
   563  	if isfixstr(lead) {
   564  		read = int(rfixstr(lead))
   565  		m.R.Skip(1)
   566  		goto fill
   567  	}
   568  	switch lead {
   569  	case mstr8, mbin8:
   570  		p, err = m.R.Next(2)
   571  		if err != nil {
   572  			return nil, err
   573  		}
   574  		read = int(p[1])
   575  	case mstr16, mbin16:
   576  		p, err = m.R.Next(3)
   577  		if err != nil {
   578  			return nil, err
   579  		}
   580  		read = int(big.Uint16(p[1:]))
   581  	case mstr32, mbin32:
   582  		p, err = m.R.Next(5)
   583  		if err != nil {
   584  			return nil, err
   585  		}
   586  		read = int(big.Uint32(p[1:]))
   587  	default:
   588  		return nil, badPrefix(StrType, lead)
   589  	}
   590  fill:
   591  	if read == 0 {
   592  		return nil, ErrShortBytes
   593  	}
   594  	return m.R.Next(read)
   595  }
   596  
   597  // ReadArrayHeader reads the next object as an
   598  // array header and returns the size of the array
   599  // and the number of bytes read.
   600  func (m *Reader) ReadArrayHeader() (sz uint32, err error) {
   601  	if m.checkAndConsumeNil() {
   602  		return 0, nil
   603  	}
   604  
   605  	var lead byte
   606  	var p []byte
   607  	p, err = m.R.Peek(1)
   608  	if err != nil {
   609  		return
   610  	}
   611  	lead = p[0]
   612  	if isfixarray(lead) {
   613  		sz = uint32(rfixarray(lead))
   614  		_, err = m.R.Skip(1)
   615  		return
   616  	}
   617  	switch lead {
   618  	case marray16:
   619  		p, err = m.R.Next(3)
   620  		if err != nil {
   621  			return
   622  		}
   623  		sz = uint32(big.Uint16(p[1:]))
   624  		return
   625  
   626  	case marray32:
   627  		p, err = m.R.Next(5)
   628  		if err != nil {
   629  			return
   630  		}
   631  		sz = big.Uint32(p[1:])
   632  		return
   633  
   634  	default:
   635  		err = badPrefix(ArrayType, lead)
   636  		return
   637  	}
   638  }
   639  
   640  // ReadNil reads a 'nil' MessagePack byte from the reader
   641  func (m *Reader) ReadNil() error {
   642  	if m.AlwaysNil {
   643  		return nil
   644  	}
   645  	p, err := m.R.Peek(1)
   646  	if err != nil {
   647  		return err
   648  	}
   649  	if p[0] != mnil {
   650  		return badPrefix(NilType, p[0])
   651  	}
   652  	_, err = m.R.Skip(1)
   653  	return err
   654  }
   655  
   656  // checkAndConsumeNil returns true, nil if the
   657  // m.AlwaysNil flag is true.
   658  //
   659  // Otherwise, checkAndConsumeNil returns true if the next byte
   660  // was nil and we consumed it. We only consume
   661  // the next byte if it was a nil. We return
   662  // false if the next byte was not a nil. The
   663  // error return value provides diagnostics.
   664  func (m *Reader) checkAndConsumeNil() bool {
   665  	if m.AlwaysNil {
   666  		return true
   667  	}
   668  	p, err := m.R.Peek(1)
   669  	if err != nil {
   670  		return false
   671  	}
   672  	if p[0] != mnil {
   673  		return false //, badPrefix(NilType, p[0])
   674  	}
   675  	_, _ = m.R.Skip(1)
   676  	return true
   677  }
   678  
   679  // ReadFloat64 reads a float64 from the reader.
   680  // (If the value on the wire is encoded as a float32,
   681  // it will be up-cast to a float64.)
   682  func (m *Reader) ReadFloat64() (f float64, err error) {
   683  	if m.checkAndConsumeNil() {
   684  		return 0, nil
   685  	}
   686  	var p []byte
   687  	p, err = m.R.Peek(9)
   688  	if err != nil {
   689  		// we'll allow a coversion from float32 to float64,
   690  		// since we don't lose any precision
   691  		if err == io.EOF && len(p) > 0 && p[0] == mfloat32 {
   692  			ef, err := m.ReadFloat32()
   693  			return float64(ef), err
   694  		}
   695  		return
   696  	}
   697  	if p[0] != mfloat64 {
   698  		// see above
   699  		if p[0] == mfloat32 {
   700  			ef, err := m.ReadFloat32()
   701  			return float64(ef), err
   702  		}
   703  		err = badPrefix(Float64Type, p[0])
   704  		return
   705  	}
   706  	f = math.Float64frombits(getMuint64(p))
   707  	_, err = m.R.Skip(9)
   708  	return
   709  }
   710  
   711  // ReadFloat32 reads a float32 from the reader
   712  func (m *Reader) ReadFloat32() (f float32, err error) {
   713  	if m.checkAndConsumeNil() {
   714  		return 0, nil
   715  	}
   716  
   717  	var p []byte
   718  	p, err = m.R.Peek(5)
   719  	if err != nil {
   720  		return
   721  	}
   722  	if p[0] != mfloat32 {
   723  		err = badPrefix(Float32Type, p[0])
   724  		return
   725  	}
   726  	f = math.Float32frombits(getMuint32(p))
   727  	_, err = m.R.Skip(5)
   728  	return
   729  }
   730  
   731  // ReadBool reads a bool from the reader
   732  func (m *Reader) ReadBool() (b bool, err error) {
   733  	if m.checkAndConsumeNil() {
   734  		return false, nil
   735  	}
   736  	var p []byte
   737  	p, err = m.R.Peek(1)
   738  	if err != nil {
   739  		return
   740  	}
   741  	switch p[0] {
   742  	case mtrue:
   743  		b = true
   744  	case mfalse:
   745  	default:
   746  		err = badPrefix(BoolType, p[0])
   747  		return
   748  	}
   749  	_, err = m.R.Skip(1)
   750  	return
   751  }
   752  
   753  // ReadInt64 reads an int64 from the reader
   754  func (m *Reader) ReadInt64() (i int64, err error) {
   755  	if m.checkAndConsumeNil() {
   756  		return 0, nil
   757  	}
   758  	var p []byte
   759  	var lead byte
   760  	p, err = m.R.Peek(1)
   761  	if err != nil {
   762  		return
   763  	}
   764  	lead = p[0]
   765  
   766  	if isfixint(lead) {
   767  		i = int64(rfixint(lead))
   768  		_, err = m.R.Skip(1)
   769  		return
   770  	} else if isnfixint(lead) {
   771  		i = int64(rnfixint(lead))
   772  		_, err = m.R.Skip(1)
   773  		return
   774  	}
   775  
   776  	switch lead {
   777  	case mint8:
   778  		p, err = m.R.Next(2)
   779  		if err != nil {
   780  			return
   781  		}
   782  		i = int64(getMint8(p))
   783  		return
   784  
   785  	case mint16:
   786  		p, err = m.R.Next(3)
   787  		if err != nil {
   788  			return
   789  		}
   790  		i = int64(getMint16(p))
   791  		return
   792  
   793  	case mint32:
   794  		p, err = m.R.Next(5)
   795  		if err != nil {
   796  			return
   797  		}
   798  		i = int64(getMint32(p))
   799  		return
   800  
   801  	case mint64:
   802  		p, err = m.R.Next(9)
   803  		if err != nil {
   804  			return
   805  		}
   806  		i = getMint64(p)
   807  		return
   808  
   809  	default:
   810  		err = badPrefix(IntType, lead)
   811  		return
   812  	}
   813  }
   814  
   815  // ReadInt32 reads an int32 from the reader
   816  func (m *Reader) ReadInt32() (i int32, err error) {
   817  	if m.checkAndConsumeNil() {
   818  		return 0, nil
   819  	}
   820  	var in int64
   821  	in, err = m.ReadInt64()
   822  	if in > math.MaxInt32 || in < math.MinInt32 {
   823  		err = IntOverflow{Value: in, FailedBitsize: 32}
   824  		return
   825  	}
   826  	i = int32(in)
   827  	return
   828  }
   829  
   830  // ReadInt16 reads an int16 from the reader
   831  func (m *Reader) ReadInt16() (i int16, err error) {
   832  	if m.checkAndConsumeNil() {
   833  		return 0, nil
   834  	}
   835  	var in int64
   836  	in, err = m.ReadInt64()
   837  	if in > math.MaxInt16 || in < math.MinInt16 {
   838  		err = IntOverflow{Value: in, FailedBitsize: 16}
   839  		return
   840  	}
   841  	i = int16(in)
   842  	return
   843  }
   844  
   845  // ReadInt8 reads an int8 from the reader
   846  func (m *Reader) ReadInt8() (i int8, err error) {
   847  	if m.checkAndConsumeNil() {
   848  		return 0, nil
   849  	}
   850  	var in int64
   851  	in, err = m.ReadInt64()
   852  	if in > math.MaxInt8 || in < math.MinInt8 {
   853  		err = IntOverflow{Value: in, FailedBitsize: 8}
   854  		return
   855  	}
   856  	i = int8(in)
   857  	return
   858  }
   859  
   860  // ReadInt reads an int from the reader
   861  func (m *Reader) ReadInt() (i int, err error) {
   862  	if m.checkAndConsumeNil() {
   863  		return 0, nil
   864  	}
   865  	if smallint {
   866  		var in int32
   867  		in, err = m.ReadInt32()
   868  		i = int(in)
   869  		return
   870  	}
   871  	var in int64
   872  	in, err = m.ReadInt64()
   873  	i = int(in)
   874  	return
   875  }
   876  
   877  // ReadUint64 reads a uint64 from the reader
   878  func (m *Reader) ReadUint64() (u uint64, err error) {
   879  	if m.checkAndConsumeNil() {
   880  		return 0, nil
   881  	}
   882  	var p []byte
   883  	var lead byte
   884  	p, err = m.R.Peek(1)
   885  	if err != nil {
   886  		return
   887  	}
   888  	lead = p[0]
   889  	if isfixint(lead) {
   890  		u = uint64(rfixint(lead))
   891  		_, err = m.R.Skip(1)
   892  		return
   893  	}
   894  	switch lead {
   895  	case muint8:
   896  		p, err = m.R.Next(2)
   897  		if err != nil {
   898  			return
   899  		}
   900  		u = uint64(getMuint8(p))
   901  		return
   902  
   903  	case muint16:
   904  		p, err = m.R.Next(3)
   905  		if err != nil {
   906  			return
   907  		}
   908  		u = uint64(getMuint16(p))
   909  		return
   910  
   911  	case muint32:
   912  		p, err = m.R.Next(5)
   913  		if err != nil {
   914  			return
   915  		}
   916  		u = uint64(getMuint32(p))
   917  		return
   918  
   919  	case muint64:
   920  		p, err = m.R.Next(9)
   921  		if err != nil {
   922  			return
   923  		}
   924  		u = getMuint64(p)
   925  		return
   926  
   927  	default:
   928  		err = badPrefix(UintType, lead)
   929  		return
   930  
   931  	}
   932  }
   933  
   934  // ReadUint32 reads a uint32 from the reader
   935  func (m *Reader) ReadUint32() (u uint32, err error) {
   936  	if m.checkAndConsumeNil() {
   937  		return 0, nil
   938  	}
   939  	var in uint64
   940  	in, err = m.ReadUint64()
   941  	if in > math.MaxUint32 {
   942  		err = UintOverflow{Value: in, FailedBitsize: 32}
   943  		return
   944  	}
   945  	u = uint32(in)
   946  	return
   947  }
   948  
   949  // ReadUint16 reads a uint16 from the reader
   950  func (m *Reader) ReadUint16() (u uint16, err error) {
   951  	if m.checkAndConsumeNil() {
   952  		return 0, nil
   953  	}
   954  	var in uint64
   955  	in, err = m.ReadUint64()
   956  	if in > math.MaxUint16 {
   957  		err = UintOverflow{Value: in, FailedBitsize: 16}
   958  		return
   959  	}
   960  	u = uint16(in)
   961  	return
   962  }
   963  
   964  // ReadUint8 reads a uint8 from the reader
   965  func (m *Reader) ReadUint8() (u uint8, err error) {
   966  	if m.checkAndConsumeNil() {
   967  		return 0, nil
   968  	}
   969  	var in uint64
   970  	in, err = m.ReadUint64()
   971  	if in > math.MaxUint8 {
   972  		err = UintOverflow{Value: in, FailedBitsize: 8}
   973  		return
   974  	}
   975  	u = uint8(in)
   976  	return
   977  }
   978  
   979  // ReadUint reads a uint from the reader
   980  func (m *Reader) ReadUint() (u uint, err error) {
   981  	if m.checkAndConsumeNil() {
   982  		return 0, nil
   983  	}
   984  	if smallint {
   985  		var un uint32
   986  		un, err = m.ReadUint32()
   987  		u = uint(un)
   988  		return
   989  	}
   990  	var un uint64
   991  	un, err = m.ReadUint64()
   992  	u = uint(un)
   993  	return
   994  }
   995  
   996  // ReadByte is analogous to ReadUint8.
   997  //
   998  // NOTE: this is *not* an implementation
   999  // of io.ByteReader.
  1000  func (m *Reader) ReadByte() (b byte, err error) {
  1001  	if m.checkAndConsumeNil() {
  1002  		return 0, nil
  1003  	}
  1004  	var in uint64
  1005  	in, err = m.ReadUint64()
  1006  	if in > math.MaxUint8 {
  1007  		err = UintOverflow{Value: in, FailedBitsize: 8}
  1008  		return
  1009  	}
  1010  	b = byte(in)
  1011  	return
  1012  }
  1013  
  1014  // ReadBytes reads a MessagePack 'bin' object
  1015  // from the reader and returns its value. It may
  1016  // use 'scratch' for storage if it is non-nil.
  1017  func (m *Reader) ReadBytes(scratch []byte) (b []byte, err error) {
  1018  	if m.checkAndConsumeNil() {
  1019  		return nil, nil
  1020  	}
  1021  	var p []byte
  1022  	var lead byte
  1023  	p, err = m.R.Peek(2)
  1024  	if err != nil {
  1025  		return
  1026  	}
  1027  	lead = p[0]
  1028  	var read int64
  1029  	switch lead {
  1030  	case mbin8:
  1031  		read = int64(p[1])
  1032  		m.R.Skip(2)
  1033  	case mbin16:
  1034  		p, err = m.R.Next(3)
  1035  		if err != nil {
  1036  			return
  1037  		}
  1038  		read = int64(big.Uint16(p[1:]))
  1039  	case mbin32:
  1040  		p, err = m.R.Next(5)
  1041  		if err != nil {
  1042  			return
  1043  		}
  1044  		read = int64(big.Uint32(p[1:]))
  1045  	default:
  1046  		err = badPrefix(BinType, lead)
  1047  		return
  1048  	}
  1049  	if int64(cap(scratch)) < read {
  1050  		b = make([]byte, read)
  1051  	} else {
  1052  		b = scratch[0:read]
  1053  	}
  1054  	_, err = m.R.ReadFull(b)
  1055  	return
  1056  }
  1057  
  1058  // ReadBytesHeader reads the size header
  1059  // of a MessagePack 'bin' object. The user
  1060  // is responsible for dealing with the next
  1061  // 'sz' bytes from the reader in an application-specific
  1062  // way.
  1063  func (m *Reader) ReadBytesHeader() (sz uint32, err error) {
  1064  	if m.checkAndConsumeNil() {
  1065  		return 0, nil
  1066  	}
  1067  
  1068  	var p []byte
  1069  	p, err = m.R.Peek(1)
  1070  	if err != nil {
  1071  		return
  1072  	}
  1073  	switch p[0] {
  1074  	case mbin8:
  1075  		p, err = m.R.Next(2)
  1076  		if err != nil {
  1077  			return
  1078  		}
  1079  		sz = uint32(p[1])
  1080  		return
  1081  	case mbin16:
  1082  		p, err = m.R.Next(3)
  1083  		if err != nil {
  1084  			return
  1085  		}
  1086  		sz = uint32(big.Uint16(p[1:]))
  1087  		return
  1088  	case mbin32:
  1089  		p, err = m.R.Next(5)
  1090  		if err != nil {
  1091  			return
  1092  		}
  1093  		sz = uint32(big.Uint32(p[1:]))
  1094  		return
  1095  	default:
  1096  		err = badPrefix(BinType, p[0])
  1097  		return
  1098  	}
  1099  }
  1100  
  1101  // ReadExactBytes reads a MessagePack 'bin'-encoded
  1102  // object off of the wire into the provided slice. An
  1103  // ArrayError will be returned if the object is not
  1104  // exactly the length of the input slice.
  1105  func (m *Reader) ReadExactBytes(into []byte) error {
  1106  	if m.checkAndConsumeNil() {
  1107  		for i := range into {
  1108  			into[i] = 0
  1109  		}
  1110  		return nil
  1111  	}
  1112  
  1113  	p, err := m.R.Peek(2)
  1114  	if err != nil {
  1115  		return err
  1116  	}
  1117  	lead := p[0]
  1118  	var read int64 // bytes to read
  1119  	var skip int   // prefix size to skip
  1120  	switch lead {
  1121  	case mbin8:
  1122  		read = int64(p[1])
  1123  		skip = 2
  1124  	case mbin16:
  1125  		p, err = m.R.Peek(3)
  1126  		if err != nil {
  1127  			return err
  1128  		}
  1129  		read = int64(big.Uint16(p[1:]))
  1130  		skip = 3
  1131  	case mbin32:
  1132  		p, err = m.R.Peek(5)
  1133  		if err != nil {
  1134  			return err
  1135  		}
  1136  		read = int64(big.Uint32(p[1:]))
  1137  		skip = 5
  1138  	default:
  1139  		return badPrefix(BinType, lead)
  1140  	}
  1141  	if read != int64(len(into)) {
  1142  		return ArrayError{Wanted: uint32(len(into)), Got: uint32(read)}
  1143  	}
  1144  	m.R.Skip(skip)
  1145  	_, err = m.R.ReadFull(into)
  1146  	return err
  1147  }
  1148  
  1149  // ReadStringAsBytes reads a MessagePack 'str' (utf-8) string
  1150  // and returns its value as bytes. It may use 'scratch' for storage
  1151  // if it is non-nil.
  1152  func (m *Reader) ReadStringAsBytes(scratch []byte) (b []byte, err error) {
  1153  	if m.checkAndConsumeNil() {
  1154  		return nil, nil
  1155  	}
  1156  
  1157  	var p []byte
  1158  	var lead byte
  1159  	p, err = m.R.Peek(1)
  1160  	if err != nil {
  1161  		return
  1162  	}
  1163  	lead = p[0]
  1164  	var read int64
  1165  
  1166  	if isfixstr(lead) {
  1167  		read = int64(rfixstr(lead))
  1168  		m.R.Skip(1)
  1169  		goto fill
  1170  	}
  1171  
  1172  	switch lead {
  1173  	case mstr8:
  1174  		p, err = m.R.Next(2)
  1175  		if err != nil {
  1176  			return
  1177  		}
  1178  		read = int64(uint8(p[1]))
  1179  	case mstr16:
  1180  		p, err = m.R.Next(3)
  1181  		if err != nil {
  1182  			return
  1183  		}
  1184  		read = int64(big.Uint16(p[1:]))
  1185  	case mstr32:
  1186  		p, err = m.R.Next(5)
  1187  		if err != nil {
  1188  			return
  1189  		}
  1190  		read = int64(big.Uint32(p[1:]))
  1191  	default:
  1192  		err = badPrefix(StrType, lead)
  1193  		return
  1194  	}
  1195  fill:
  1196  	if int64(cap(scratch)) < read {
  1197  		b = make([]byte, read)
  1198  	} else {
  1199  		b = scratch[0:read]
  1200  	}
  1201  	_, err = m.R.ReadFull(b)
  1202  	return
  1203  }
  1204  
  1205  // ReadStringHeader reads a string header
  1206  // off of the wire. The user is then responsible
  1207  // for dealing with the next 'sz' bytes from
  1208  // the reader in an application-specific manner.
  1209  func (m *Reader) ReadStringHeader() (sz uint32, err error) {
  1210  	if m.checkAndConsumeNil() {
  1211  		return 0, nil
  1212  	}
  1213  
  1214  	var p []byte
  1215  	p, err = m.R.Peek(1)
  1216  	if err != nil {
  1217  		return
  1218  	}
  1219  	lead := p[0]
  1220  	if isfixstr(lead) {
  1221  		sz = uint32(rfixstr(lead))
  1222  		m.R.Skip(1)
  1223  		return
  1224  	}
  1225  	switch lead {
  1226  	case mstr8:
  1227  		p, err = m.R.Next(2)
  1228  		if err != nil {
  1229  			return
  1230  		}
  1231  		sz = uint32(p[1])
  1232  		return
  1233  	case mstr16:
  1234  		p, err = m.R.Next(3)
  1235  		if err != nil {
  1236  			return
  1237  		}
  1238  		sz = uint32(big.Uint16(p[1:]))
  1239  		return
  1240  	case mstr32:
  1241  		p, err = m.R.Next(5)
  1242  		if err != nil {
  1243  			return
  1244  		}
  1245  		sz = big.Uint32(p[1:])
  1246  		return
  1247  	default:
  1248  		err = badPrefix(StrType, lead)
  1249  		return
  1250  	}
  1251  }
  1252  
  1253  // ReadString reads a utf-8 string from the reader
  1254  func (m *Reader) ReadString() (s string, err error) {
  1255  	if m.checkAndConsumeNil() {
  1256  		return "", nil
  1257  	}
  1258  
  1259  	var p []byte
  1260  	var lead byte
  1261  	var read int64
  1262  	p, err = m.R.Peek(1)
  1263  	if err != nil {
  1264  		return
  1265  	}
  1266  	lead = p[0]
  1267  
  1268  	if isfixstr(lead) {
  1269  		read = int64(rfixstr(lead))
  1270  		m.R.Skip(1)
  1271  		goto fill
  1272  	}
  1273  
  1274  	switch lead {
  1275  	case mstr8:
  1276  		p, err = m.R.Next(2)
  1277  		if err != nil {
  1278  			return
  1279  		}
  1280  		read = int64(uint8(p[1]))
  1281  	case mstr16:
  1282  		p, err = m.R.Next(3)
  1283  		if err != nil {
  1284  			return
  1285  		}
  1286  		read = int64(big.Uint16(p[1:]))
  1287  	case mstr32:
  1288  		p, err = m.R.Next(5)
  1289  		if err != nil {
  1290  			return
  1291  		}
  1292  		read = int64(big.Uint32(p[1:]))
  1293  	default:
  1294  		err = badPrefix(StrType, lead)
  1295  		return
  1296  	}
  1297  fill:
  1298  	if read == 0 {
  1299  		s, err = "", nil
  1300  		return
  1301  	}
  1302  	// reading into the memory
  1303  	// that will become the string
  1304  	// itself has vastly superior
  1305  	// worst-case performance, because
  1306  	// the reader buffer doesn't have
  1307  	// to be large enough to hold the string.
  1308  	// the idea here is to make it more
  1309  	// difficult for someone malicious
  1310  	// to cause the system to run out of
  1311  	// memory by sending very large strings.
  1312  	//
  1313  	// NOTE: this works because the argument
  1314  	// passed to (*fwd.Reader).ReadFull escapes
  1315  	// to the heap; its argument may, in turn,
  1316  	// be passed to the underlying reader, and
  1317  	// thus escape analysis *must* conclude that
  1318  	// 'out' escapes.
  1319  	out := make([]byte, read)
  1320  	_, err = m.R.ReadFull(out)
  1321  	if err != nil {
  1322  		return
  1323  	}
  1324  	s = UnsafeString(out)
  1325  	return
  1326  }
  1327  
  1328  // ReadComplex64 reads a complex64 from the reader
  1329  func (m *Reader) ReadComplex64() (f complex64, err error) {
  1330  	if m.checkAndConsumeNil() {
  1331  		return 0, nil
  1332  	}
  1333  	var p []byte
  1334  	p, err = m.R.Peek(10)
  1335  	if err != nil {
  1336  		return
  1337  	}
  1338  	if p[0] != mfixext8 {
  1339  		err = badPrefix(Complex64Type, p[0])
  1340  		return
  1341  	}
  1342  	if int8(p[1]) != Complex64Extension {
  1343  		err = errExt(int8(p[1]), Complex64Extension)
  1344  		return
  1345  	}
  1346  	f = complex(math.Float32frombits(big.Uint32(p[2:])),
  1347  		math.Float32frombits(big.Uint32(p[6:])))
  1348  	_, err = m.R.Skip(10)
  1349  	return
  1350  }
  1351  
  1352  // ReadComplex128 reads a complex128 from the reader
  1353  func (m *Reader) ReadComplex128() (f complex128, err error) {
  1354  	if m.checkAndConsumeNil() {
  1355  		return 0, nil
  1356  	}
  1357  
  1358  	var p []byte
  1359  	p, err = m.R.Peek(18)
  1360  	if err != nil {
  1361  		return
  1362  	}
  1363  	if p[0] != mfixext16 {
  1364  		err = badPrefix(Complex128Type, p[0])
  1365  		return
  1366  	}
  1367  	if int8(p[1]) != Complex128Extension {
  1368  		err = errExt(int8(p[1]), Complex128Extension)
  1369  		return
  1370  	}
  1371  	f = complex(math.Float64frombits(big.Uint64(p[2:])),
  1372  		math.Float64frombits(big.Uint64(p[10:])))
  1373  	_, err = m.R.Skip(18)
  1374  	return
  1375  }
  1376  
  1377  // ReadMapStrIntf reads a MessagePack map into a map[string]interface{}.
  1378  // (You must pass a non-nil map into the function.)
  1379  func (m *Reader) ReadMapStrIntf(mp map[string]interface{}) (err error) {
  1380  	if m.checkAndConsumeNil() {
  1381  		return nil
  1382  	}
  1383  
  1384  	var sz uint32
  1385  	sz, err = m.ReadMapHeader()
  1386  	if err != nil {
  1387  		return
  1388  	}
  1389  	for key := range mp {
  1390  		delete(mp, key)
  1391  	}
  1392  	for i := uint32(0); i < sz; i++ {
  1393  		var key string
  1394  		var val interface{}
  1395  		key, err = m.ReadString()
  1396  		if err != nil {
  1397  			return
  1398  		}
  1399  		val, err = m.ReadIntf()
  1400  		if err != nil {
  1401  			return
  1402  		}
  1403  		mp[key] = val
  1404  	}
  1405  	return
  1406  }
  1407  
  1408  // ReadTime reads a time.Time object from the reader.
  1409  // The returned time's location will be set to time.Local.
  1410  func (m *Reader) ReadTime() (t time.Time, err error) {
  1411  	if m.checkAndConsumeNil() {
  1412  		return time.Time{}, nil
  1413  	}
  1414  	var p []byte
  1415  	p, err = m.R.Peek(15)
  1416  	if err != nil {
  1417  		return
  1418  	}
  1419  	if p[0] != mext8 || p[1] != 12 {
  1420  		err = badPrefix(TimeType, p[0])
  1421  		return
  1422  	}
  1423  	if int8(p[2]) != TimeExtension {
  1424  		err = errExt(int8(p[2]), TimeExtension)
  1425  		return
  1426  	}
  1427  	sec, nsec := getUnix(p[3:])
  1428  	t = time.Unix(sec, int64(nsec)).Local()
  1429  	_, err = m.R.Skip(15)
  1430  	return
  1431  }
  1432  
  1433  // ReadIntf reads out the next object as a raw interface{}.
  1434  // Arrays are decoded as []interface{}, and maps are decoded
  1435  // as map[string]interface{}. Integers are decoded as int64
  1436  // and unsigned integers are decoded as uint64.
  1437  func (m *Reader) ReadIntf() (i interface{}, err error) {
  1438  	if m.checkAndConsumeNil() {
  1439  		return
  1440  	}
  1441  	var t Type
  1442  	t, err = m.NextType()
  1443  	if err != nil {
  1444  		return
  1445  	}
  1446  	switch t {
  1447  	case BoolType:
  1448  		i, err = m.ReadBool()
  1449  		return
  1450  
  1451  	case IntType:
  1452  		i, err = m.ReadInt64()
  1453  		return
  1454  
  1455  	case UintType:
  1456  		i, err = m.ReadUint64()
  1457  		return
  1458  
  1459  	case BinType:
  1460  		i, err = m.ReadBytes(nil)
  1461  		return
  1462  
  1463  	case StrType:
  1464  		i, err = m.ReadString()
  1465  		return
  1466  
  1467  	case Complex64Type:
  1468  		i, err = m.ReadComplex64()
  1469  		return
  1470  
  1471  	case Complex128Type:
  1472  		i, err = m.ReadComplex128()
  1473  		return
  1474  
  1475  	case TimeType:
  1476  		i, err = m.ReadTime()
  1477  		return
  1478  
  1479  	case ExtensionType:
  1480  		var t int8
  1481  		t, err = m.peekExtensionType()
  1482  		if err != nil {
  1483  			return
  1484  		}
  1485  		f, ok := extensionReg[t]
  1486  		if ok {
  1487  			e := f()
  1488  			err = m.ReadExtension(e)
  1489  			i = e
  1490  			return
  1491  		}
  1492  		var e RawExtension
  1493  		e.Type = t
  1494  		err = m.ReadExtension(&e)
  1495  		i = &e
  1496  		return
  1497  
  1498  	case MapType:
  1499  		mp := make(map[string]interface{})
  1500  		err = m.ReadMapStrIntf(mp)
  1501  		i = mp
  1502  		return
  1503  
  1504  	case NilType:
  1505  		err = m.ReadNil()
  1506  		i = nil
  1507  		return
  1508  
  1509  	case Float32Type:
  1510  		i, err = m.ReadFloat32()
  1511  		return
  1512  
  1513  	case Float64Type:
  1514  		i, err = m.ReadFloat64()
  1515  		return
  1516  
  1517  	case ArrayType:
  1518  		var sz uint32
  1519  		sz, err = m.ReadArrayHeader()
  1520  
  1521  		if err != nil {
  1522  			return
  1523  		}
  1524  		out := make([]interface{}, int(sz))
  1525  		for j := range out {
  1526  			out[j], err = m.ReadIntf()
  1527  			if err != nil {
  1528  				return
  1529  			}
  1530  		}
  1531  		i = out
  1532  		return
  1533  
  1534  	default:
  1535  		return nil, fatal // unreachable
  1536  	}
  1537  }