decode.go 17 KB

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