decode.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682
  1. // Copyright (c) 2012, 2013 Ugorji Nwoke. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license found in the LICENSE file.
  3. package codec
  4. import (
  5. "io"
  6. "reflect"
  7. )
  8. // Some tagging information for error messages.
  9. var (
  10. msgTagDec = "codec.decoder"
  11. msgBadDesc = "Unrecognized descriptor byte"
  12. )
  13. // when decoding without schema, the nakedContext tells us what
  14. // we decoded into, or if decoding has been handled.
  15. type decodeNakedContext uint8
  16. const (
  17. dncHandled decodeNakedContext = iota
  18. dncNil
  19. dncExt
  20. dncContainer
  21. )
  22. // decodeEncodedType is the current type in the encoded stream
  23. type decodeEncodedType uint8
  24. const (
  25. detUnset decodeEncodedType = iota
  26. detNil
  27. detInt
  28. detUint
  29. detFloat
  30. detBool
  31. detString
  32. detBytes
  33. detMap
  34. detArray
  35. detTimestamp
  36. detExt
  37. )
  38. // decReader abstracts the reading source, allowing implementations that can
  39. // read from an io.Reader or directly off a byte slice with zero-copying.
  40. type decReader interface {
  41. readn(n int) []byte
  42. readb([]byte)
  43. readn1() uint8
  44. readUint16() uint16
  45. readUint32() uint32
  46. readUint64() uint64
  47. }
  48. type decDriver interface {
  49. initReadNext()
  50. tryDecodeAsNil() bool
  51. currentEncodedType() decodeEncodedType
  52. decodeBuiltinType(rt uintptr, rv reflect.Value) bool
  53. //decodeNaked should completely handle extensions, builtins, primitives, etc.
  54. //Numbers are decoded as int64, uint64, float64 only (no smaller sized number types).
  55. decodeNaked() (rv reflect.Value, ctx decodeNakedContext)
  56. decodeInt(bitsize uint8) (i int64)
  57. decodeUint(bitsize uint8) (ui uint64)
  58. decodeFloat(chkOverflow32 bool) (f float64)
  59. decodeBool() (b bool)
  60. // decodeString can also decode symbols
  61. decodeString() (s string)
  62. decodeBytes(bs []byte) (bsOut []byte, changed bool)
  63. decodeExt(tag byte) []byte
  64. readMapLen() int
  65. readArrayLen() int
  66. }
  67. // A Decoder reads and decodes an object from an input stream in the codec format.
  68. type Decoder struct {
  69. r decReader
  70. d decDriver
  71. h decodeHandleI
  72. }
  73. // ioDecReader is a decReader that reads off an io.Reader
  74. type ioDecReader struct {
  75. r io.Reader
  76. br io.ByteReader
  77. x [8]byte //temp byte array re-used internally for efficiency
  78. }
  79. // bytesDecReader is a decReader that reads off a byte slice with zero copying
  80. type bytesDecReader struct {
  81. b []byte // data
  82. c int // cursor
  83. a int // available
  84. }
  85. type decExtTagFn struct {
  86. fn func(reflect.Value, []byte) error
  87. tag byte
  88. }
  89. type decExtTypeTagFn struct {
  90. rtid uintptr
  91. rt reflect.Type
  92. decExtTagFn
  93. }
  94. type decodeHandleI interface {
  95. getDecodeExt(rt uintptr) (tag byte, fn func(reflect.Value, []byte) error)
  96. errorIfNoField() bool
  97. }
  98. type decHandle struct {
  99. // put word-aligned fields first (before bools, etc)
  100. exts []decExtTypeTagFn
  101. extFuncs map[uintptr]decExtTagFn
  102. }
  103. type DecodeOptions struct {
  104. // An instance of MapType is used during schema-less decoding of a map in the stream.
  105. // If nil, we use map[interface{}]interface{}
  106. MapType reflect.Type
  107. // An instance of SliceType is used during schema-less decoding of an array in the stream.
  108. // If nil, we use []interface{}
  109. SliceType reflect.Type
  110. // ErrorIfNoField controls whether an error is returned when decoding a map
  111. // from a codec stream into a struct, and no matching struct field is found.
  112. ErrorIfNoField bool
  113. }
  114. func (o *DecodeOptions) errorIfNoField() bool {
  115. return o.ErrorIfNoField
  116. }
  117. // addDecodeExt registers a function to handle decoding into a given type when an
  118. // extension type and specific tag byte is detected in the codec stream.
  119. // To remove an extension, pass fn=nil.
  120. func (o *decHandle) addDecodeExt(rtid uintptr, rt reflect.Type, tag byte, fn func(reflect.Value, []byte) error) {
  121. if o.exts == nil {
  122. o.exts = make([]decExtTypeTagFn, 0, 2)
  123. o.extFuncs = make(map[uintptr]decExtTagFn, 2)
  124. } else {
  125. if _, ok := o.extFuncs[rtid]; ok {
  126. delete(o.extFuncs, rtid)
  127. for i := 0; i < len(o.exts); i++ {
  128. if o.exts[i].rtid == rtid {
  129. o.exts = append(o.exts[:i], o.exts[i+1:]...)
  130. break
  131. }
  132. }
  133. }
  134. }
  135. if fn != nil {
  136. o.extFuncs[rtid] = decExtTagFn{fn, tag}
  137. o.exts = append(o.exts, decExtTypeTagFn{rtid, rt, decExtTagFn{fn, tag}})
  138. }
  139. }
  140. func (o *decHandle) getDecodeExtForTag(tag byte) (rv reflect.Value, fn func(reflect.Value, []byte) error) {
  141. for i, l := 0, len(o.exts); i < l; i++ {
  142. if o.exts[i].tag == tag {
  143. if o.exts[i].rt.Kind() == reflect.Ptr {
  144. rv = reflect.New(o.exts[i].rt.Elem())
  145. } else {
  146. rv = reflect.New(o.exts[i].rt).Elem()
  147. }
  148. fn = o.exts[i].fn
  149. return
  150. }
  151. }
  152. return
  153. }
  154. func (o *decHandle) getDecodeExt(rt uintptr) (tag byte, fn func(reflect.Value, []byte) error) {
  155. if l := len(o.exts); l == 0 {
  156. return
  157. } else if l < mapAccessThreshold {
  158. for i := 0; i < l; i++ {
  159. if o.exts[i].rtid == rt {
  160. x := o.exts[i].decExtTagFn
  161. return x.tag, x.fn
  162. }
  163. }
  164. } else {
  165. x := o.extFuncs[rt]
  166. return x.tag, x.fn
  167. }
  168. return
  169. }
  170. // NewDecoder returns a Decoder for decoding a stream of bytes from an io.Reader.
  171. //
  172. // For efficiency, Users are encouraged to pass in a memory buffered writer
  173. // (eg bufio.Reader, bytes.Buffer).
  174. func NewDecoder(r io.Reader, h Handle) *Decoder {
  175. z := ioDecReader{
  176. r: r,
  177. }
  178. z.br, _ = r.(io.ByteReader)
  179. return &Decoder{r: &z, d: h.newDecDriver(&z), h: h}
  180. }
  181. // NewDecoderBytes returns a Decoder which efficiently decodes directly
  182. // from a byte slice with zero copying.
  183. func NewDecoderBytes(in []byte, h Handle) *Decoder {
  184. z := bytesDecReader{
  185. b: in,
  186. a: len(in),
  187. }
  188. return &Decoder{r: &z, d: h.newDecDriver(&z), h: h}
  189. }
  190. // Decode decodes the stream from reader and stores the result in the
  191. // value pointed to by v. v cannot be a nil pointer. v can also be
  192. // a reflect.Value of a pointer.
  193. //
  194. // Note that a pointer to a nil interface is not a nil pointer.
  195. // If you do not know what type of stream it is, pass in a pointer to a nil interface.
  196. // We will decode and store a value in that nil interface.
  197. //
  198. // Sample usages:
  199. // // Decoding into a non-nil typed value
  200. // var f float32
  201. // err = codec.NewDecoder(r, handle).Decode(&f)
  202. //
  203. // // Decoding into nil interface
  204. // var v interface{}
  205. // dec := codec.NewDecoder(r, handle)
  206. // err = dec.Decode(&v)
  207. //
  208. // When decoding into a nil interface{}, we will decode into an appropriate value based
  209. // on the contents of the stream. Numbers are decoded as float64, int64 or uint64. Other values
  210. // are decoded appropriately (e.g. bool), and configurations exist on the Handle to override
  211. // defaults (e.g. for MapType, SliceType and how to decode raw bytes).
  212. //
  213. // There are some special rules when decoding into containers (slice/array/map/struct).
  214. // Decode will typically use the stream contents to UPDATE the container.
  215. // - This means that for a struct or map, we just update matching fields or keys.
  216. // - For a slice/array, we just update the first n elements, where n is length of the stream.
  217. // - However, if decoding into a nil map/slice and the length of the stream is 0,
  218. // we reset the destination map/slice to be a zero-length non-nil map/slice.
  219. // - Also, if the encoded value is Nil in the stream, then we try to set
  220. // the container to its "zero" value (e.g. nil for slice/map).
  221. // - Note that a struct can be decoded from an array in the stream,
  222. // by updating fields as they occur in the struct.
  223. func (d *Decoder) Decode(v interface{}) (err error) {
  224. defer panicToErr(&err)
  225. d.decode(v)
  226. return
  227. }
  228. func (d *Decoder) decode(iv interface{}) {
  229. d.d.initReadNext()
  230. // Fast path included for various pointer types which cannot be registered as extensions
  231. switch v := iv.(type) {
  232. case nil:
  233. decErr("Cannot decode into nil.")
  234. case reflect.Value:
  235. d.chkPtrValue(v)
  236. d.decodeValue(v)
  237. case *string:
  238. *v = d.d.decodeString()
  239. case *bool:
  240. *v = d.d.decodeBool()
  241. case *int:
  242. *v = int(d.d.decodeInt(intBitsize))
  243. case *int8:
  244. *v = int8(d.d.decodeInt(8))
  245. case *int16:
  246. *v = int16(d.d.decodeInt(16))
  247. case *int32:
  248. *v = int32(d.d.decodeInt(32))
  249. case *int64:
  250. *v = int64(d.d.decodeInt(64))
  251. case *uint:
  252. *v = uint(d.d.decodeUint(uintBitsize))
  253. case *uint8:
  254. *v = uint8(d.d.decodeUint(8))
  255. case *uint16:
  256. *v = uint16(d.d.decodeUint(16))
  257. case *uint32:
  258. *v = uint32(d.d.decodeUint(32))
  259. case *uint64:
  260. *v = uint64(d.d.decodeUint(64))
  261. case *float32:
  262. *v = float32(d.d.decodeFloat(true))
  263. case *float64:
  264. *v = d.d.decodeFloat(false)
  265. case *interface{}:
  266. d.decodeValue(reflect.ValueOf(iv).Elem())
  267. default:
  268. rv := reflect.ValueOf(iv)
  269. d.chkPtrValue(rv)
  270. d.decodeValue(rv)
  271. }
  272. }
  273. func (d *Decoder) decodeValue(rv reflect.Value) {
  274. // Note: if stream is set to nil, we set the corresponding value to its "zero" value
  275. // var ctr int (define this above the function if trying to do this run)
  276. // ctr++
  277. // log(".. [%v] enter decode: rv: %v <==> %T <==> %v", ctr, rv, rv.Interface(), rv.Interface())
  278. // defer func(ctr2 int) {
  279. // log(".... [%v] exit decode: rv: %v <==> %T <==> %v", ctr2, rv, rv.Interface(), rv.Interface())
  280. // }(ctr)
  281. dd := d.d //so we don't dereference constantly
  282. dd.initReadNext()
  283. rvOrig := rv
  284. wasNilIntf := rv.Kind() == reflect.Interface && rv.IsNil()
  285. rt := rv.Type()
  286. var ndesc decodeNakedContext
  287. //if nil interface, use some hieristics to set the nil interface to an
  288. //appropriate value based on the first byte read (byte descriptor bd)
  289. if wasNilIntf {
  290. if dd.tryDecodeAsNil() {
  291. return
  292. }
  293. //Prevent from decoding into e.g. error, io.Reader, etc if it's nil and non-nil value in stream.
  294. //We can only decode into interface{} (0 methods). Else reflect.Set fails later.
  295. if num := rt.NumMethod(); num > 0 {
  296. decErr("decodeValue: Cannot decode non-nil codec value into nil %v (%v methods)", rt, num)
  297. } else {
  298. rv, ndesc = dd.decodeNaked()
  299. if ndesc == dncHandled {
  300. rvOrig.Set(rv)
  301. return
  302. }
  303. rt = rv.Type()
  304. }
  305. } else if dd.tryDecodeAsNil() {
  306. // Note: if stream is set to nil, we set the dereferenced value to its "zero" value (if settable).
  307. for rv.Kind() == reflect.Ptr {
  308. rv = rv.Elem()
  309. }
  310. if rv.CanSet() {
  311. rv.Set(reflect.Zero(rv.Type()))
  312. }
  313. return
  314. }
  315. rtid := reflect.ValueOf(rt).Pointer()
  316. // An extension can be registered for any type, regardless of the Kind
  317. // (e.g. type BitSet int64, type MyStruct { / * unexported fields * / }, type X []int, etc.
  318. //
  319. // We can't check if it's an extension byte here first, because the user may have
  320. // registered a pointer or non-pointer type, meaning we may have to recurse first
  321. // before matching a mapped type, even though the extension byte is already detected.
  322. //
  323. // If we are checking for builtin or ext type here, it means we didn't go through decodeNaked,
  324. // Because decodeNaked would have handled it. It also means wasNilIntf = false.
  325. if dd.decodeBuiltinType(rtid, rv) {
  326. return
  327. }
  328. if bfnTag, bfnFn := d.h.getDecodeExt(rtid); bfnFn != nil {
  329. xbs := dd.decodeExt(bfnTag)
  330. if fnerr := bfnFn(rv, xbs); fnerr != nil {
  331. panic(fnerr)
  332. }
  333. return
  334. }
  335. // TODO: Decode if type is an encoding.BinaryUnmarshaler: UnmarshalBinary(data []byte) error
  336. // There is a cost, as we need to change the rv to an interface{} first.
  337. // NOTE: if decoding into a nil interface{}, we return a non-nil
  338. // value except even if the container registers a length of 0.
  339. //
  340. // NOTE: Do not make blocks for struct, slice, map, etc individual methods.
  341. // It ends up being more expensive, because they recursively calls decodeValue
  342. //
  343. // (Mar 7, 2013. DON'T REARRANGE ... code clarity)
  344. // tried arranging in sequence of most probable ones.
  345. // string, bool, integer, float, struct, ptr, slice, array, map, interface, uint.
  346. switch rk := rv.Kind(); rk {
  347. case reflect.String:
  348. rv.SetString(dd.decodeString())
  349. case reflect.Bool:
  350. rv.SetBool(dd.decodeBool())
  351. case reflect.Int:
  352. rv.SetInt(dd.decodeInt(intBitsize))
  353. case reflect.Int64:
  354. rv.SetInt(dd.decodeInt(64))
  355. case reflect.Int32:
  356. rv.SetInt(dd.decodeInt(32))
  357. case reflect.Int8:
  358. rv.SetInt(dd.decodeInt(8))
  359. case reflect.Int16:
  360. rv.SetInt(dd.decodeInt(16))
  361. case reflect.Float32:
  362. rv.SetFloat(dd.decodeFloat(true))
  363. case reflect.Float64:
  364. rv.SetFloat(dd.decodeFloat(false))
  365. case reflect.Uint8:
  366. rv.SetUint(dd.decodeUint(8))
  367. case reflect.Uint64:
  368. rv.SetUint(dd.decodeUint(64))
  369. case reflect.Uint:
  370. rv.SetUint(dd.decodeUint(uintBitsize))
  371. case reflect.Uint32:
  372. rv.SetUint(dd.decodeUint(32))
  373. case reflect.Uint16:
  374. rv.SetUint(dd.decodeUint(16))
  375. case reflect.Ptr:
  376. if rv.IsNil() {
  377. if wasNilIntf {
  378. rv = reflect.New(rt.Elem())
  379. } else {
  380. rv.Set(reflect.New(rt.Elem()))
  381. }
  382. }
  383. d.decodeValue(rv.Elem())
  384. case reflect.Interface:
  385. d.decodeValue(rv.Elem())
  386. case reflect.Struct:
  387. if currEncodedType := dd.currentEncodedType(); currEncodedType == detMap {
  388. containerLen := dd.readMapLen()
  389. if containerLen == 0 {
  390. break
  391. }
  392. sfi := getStructFieldInfos(rtid, rt)
  393. sissis := sfi.sis
  394. for j := 0; j < containerLen; j++ {
  395. // var rvkencname string
  396. // ddecode(&rvkencname)
  397. dd.initReadNext()
  398. rvkencname := dd.decodeString()
  399. // rvksi := sfi.getForEncName(rvkencname)
  400. if k := sfi.indexForEncName(rvkencname); k > -1 {
  401. sfik := sissis[k]
  402. if sfik.i != -1 {
  403. d.decodeValue(rv.Field(int(sfik.i)))
  404. } else {
  405. d.decodeValue(rv.FieldByIndex(sfik.is))
  406. }
  407. // d.decodeValue(sfi.field(k, rv))
  408. } else {
  409. if d.h.errorIfNoField() {
  410. decErr("No matching struct field found when decoding stream map with key: %v", rvkencname)
  411. } else {
  412. var nilintf0 interface{}
  413. d.decodeValue(reflect.ValueOf(&nilintf0).Elem())
  414. }
  415. }
  416. }
  417. } else if currEncodedType == detArray {
  418. containerLen := dd.readArrayLen()
  419. if containerLen == 0 {
  420. break
  421. }
  422. sfi := getStructFieldInfos(rtid, rt)
  423. for j, si := range sfi.sisp {
  424. if j == containerLen {
  425. break
  426. }
  427. if si.i != -1 {
  428. d.decodeValue(rv.Field(int(si.i)))
  429. } else {
  430. d.decodeValue(rv.FieldByIndex(si.is))
  431. }
  432. }
  433. if containerLen > len(sfi.sisp) {
  434. // read remaining values and throw away
  435. for j := len(sfi.sisp); j < containerLen; j++ {
  436. var nilintf0 interface{}
  437. d.decodeValue(reflect.ValueOf(&nilintf0).Elem())
  438. }
  439. }
  440. } else {
  441. decErr("Only encoded map or array can be decoded into a struct")
  442. }
  443. case reflect.Slice:
  444. // Be more careful calling Set() here, because a reflect.Value from an array
  445. // may have come in here (which may not be settable).
  446. // In places where the slice got from an array could be, we should guard with CanSet() calls.
  447. if rt == byteSliceTyp { // rawbytes
  448. if bs2, changed2 := dd.decodeBytes(rv.Bytes()); changed2 {
  449. rv.SetBytes(bs2)
  450. }
  451. if wasNilIntf && rv.IsNil() {
  452. rv.SetBytes([]byte{})
  453. }
  454. break
  455. }
  456. containerLen := dd.readArrayLen()
  457. if wasNilIntf {
  458. rv = reflect.MakeSlice(rt, containerLen, containerLen)
  459. }
  460. if containerLen == 0 {
  461. if rv.IsNil() {
  462. rv.Set(reflect.MakeSlice(rt, containerLen, containerLen))
  463. }
  464. break
  465. }
  466. if rv.IsNil() {
  467. // wasNilIntf only applies if rv is nil (since that's what we did earlier)
  468. rv.Set(reflect.MakeSlice(rt, containerLen, containerLen))
  469. } else {
  470. // if we need to reset rv but it cannot be set, we should err out.
  471. // for example, if slice is got from unaddressable array, CanSet = false
  472. if rvcap, rvlen := rv.Len(), rv.Cap(); containerLen > rvcap {
  473. if rv.CanSet() {
  474. rvn := reflect.MakeSlice(rt, containerLen, containerLen)
  475. if rvlen > 0 {
  476. reflect.Copy(rvn, rv)
  477. }
  478. rv.Set(rvn)
  479. } else {
  480. decErr("Cannot reset slice with less cap: %v that stream contents: %v", rvcap, containerLen)
  481. }
  482. } else if containerLen > rvlen {
  483. rv.SetLen(containerLen)
  484. }
  485. }
  486. for j := 0; j < containerLen; j++ {
  487. d.decodeValue(rv.Index(j))
  488. }
  489. case reflect.Array:
  490. d.decodeValue(rv.Slice(0, rv.Len()))
  491. case reflect.Map:
  492. containerLen := dd.readMapLen()
  493. if rv.IsNil() {
  494. rv.Set(reflect.MakeMap(rt))
  495. }
  496. if containerLen == 0 {
  497. break
  498. }
  499. ktype, vtype := rt.Key(), rt.Elem()
  500. for j := 0; j < containerLen; j++ {
  501. rvk := reflect.New(ktype).Elem()
  502. d.decodeValue(rvk)
  503. if ktype == intfTyp {
  504. rvk = rvk.Elem()
  505. if rvk.Type() == byteSliceTyp {
  506. rvk = reflect.ValueOf(string(rvk.Bytes()))
  507. }
  508. }
  509. rvv := rv.MapIndex(rvk)
  510. if !rvv.IsValid() {
  511. rvv = reflect.New(vtype).Elem()
  512. }
  513. d.decodeValue(rvv)
  514. rv.SetMapIndex(rvk, rvv)
  515. }
  516. default:
  517. decErr("Unhandled value for kind: %v: %s", rk, msgBadDesc)
  518. }
  519. if wasNilIntf {
  520. rvOrig.Set(rv)
  521. }
  522. return
  523. }
  524. func (d *Decoder) chkPtrValue(rv reflect.Value) {
  525. // We cannot marshal into a non-pointer or a nil pointer
  526. // (at least pass a nil interface so we can marshal into it)
  527. if rv.Kind() != reflect.Ptr || rv.IsNil() {
  528. var rvi interface{} = rv
  529. if rv.IsValid() && rv.CanInterface() {
  530. rvi = rv.Interface()
  531. }
  532. decErr("Decode: Expecting valid pointer to decode into. Got: %v, %T, %v",
  533. rv.Kind(), rvi, rvi)
  534. }
  535. }
  536. // ------------------------------------
  537. func (z *ioDecReader) readn(n int) (bs []byte) {
  538. bs = make([]byte, n)
  539. if _, err := io.ReadAtLeast(z.r, bs, n); err != nil {
  540. panic(err)
  541. }
  542. return
  543. }
  544. func (z *ioDecReader) readb(bs []byte) {
  545. if _, err := io.ReadAtLeast(z.r, bs, len(bs)); err != nil {
  546. panic(err)
  547. }
  548. }
  549. func (z *ioDecReader) readn1() uint8 {
  550. if z.br != nil {
  551. b, err := z.br.ReadByte()
  552. if err != nil {
  553. panic(err)
  554. }
  555. return b
  556. }
  557. z.readb(z.x[:1])
  558. return z.x[0]
  559. }
  560. func (z *ioDecReader) readUint16() uint16 {
  561. z.readb(z.x[:2])
  562. return bigen.Uint16(z.x[:2])
  563. }
  564. func (z *ioDecReader) readUint32() uint32 {
  565. z.readb(z.x[:4])
  566. return bigen.Uint32(z.x[:4])
  567. }
  568. func (z *ioDecReader) readUint64() uint64 {
  569. z.readb(z.x[:8])
  570. return bigen.Uint64(z.x[:8])
  571. }
  572. // ------------------------------------
  573. func (z *bytesDecReader) consume(n int) (oldcursor int) {
  574. if z.a == 0 {
  575. panic(io.EOF)
  576. }
  577. if n > z.a {
  578. doPanic(msgTagDec, "Trying to read %v bytes. Only %v available", n, z.a)
  579. }
  580. // z.checkAvailable(n)
  581. oldcursor = z.c
  582. z.c = oldcursor + n
  583. z.a = z.a - n
  584. return
  585. }
  586. func (z *bytesDecReader) readn(n int) (bs []byte) {
  587. c0 := z.consume(n)
  588. bs = z.b[c0:z.c]
  589. return
  590. }
  591. func (z *bytesDecReader) readb(bs []byte) {
  592. copy(bs, z.readn(len(bs)))
  593. }
  594. func (z *bytesDecReader) readn1() uint8 {
  595. c0 := z.consume(1)
  596. return z.b[c0]
  597. }
  598. // Use binaryEncoding helper for 4 and 8 bits, but inline it for 2 bits
  599. // creating temp slice variable and copying it to helper function is expensive
  600. // for just 2 bits.
  601. func (z *bytesDecReader) readUint16() uint16 {
  602. c0 := z.consume(2)
  603. return uint16(z.b[c0+1]) | uint16(z.b[c0])<<8
  604. }
  605. func (z *bytesDecReader) readUint32() uint32 {
  606. c0 := z.consume(4)
  607. return bigen.Uint32(z.b[c0:z.c])
  608. }
  609. func (z *bytesDecReader) readUint64() uint64 {
  610. c0 := z.consume(8)
  611. return bigen.Uint64(z.b[c0:z.c])
  612. }
  613. // ----------------------------------------
  614. func decErr(format string, params ...interface{}) {
  615. doPanic(msgTagDec, format, params...)
  616. }