decode.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768
  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. isBuiltinType(rt uintptr) bool
  53. decodeBuiltinType(rt uintptr, rv reflect.Value)
  54. //decodeNaked should completely handle extensions, builtins, primitives, etc.
  55. //Numbers are decoded as int64, uint64, float64 only (no smaller sized number types).
  56. decodeNaked() (rv reflect.Value, ctx decodeNakedContext)
  57. decodeInt(bitsize uint8) (i int64)
  58. decodeUint(bitsize uint8) (ui uint64)
  59. decodeFloat(chkOverflow32 bool) (f float64)
  60. decodeBool() (b bool)
  61. // decodeString can also decode symbols
  62. decodeString() (s string)
  63. decodeBytes(bs []byte) (bsOut []byte, changed bool)
  64. decodeExt(verifyTag bool, tag byte) (xtag byte, xbs []byte)
  65. readMapLen() int
  66. readArrayLen() int
  67. }
  68. // decFnInfo has methods for registering handling decoding of a specific type
  69. // based on some characteristics (builtin, extension, reflect Kind, etc)
  70. type decFnInfo struct {
  71. sis *typeInfo
  72. d *Decoder
  73. dd decDriver
  74. rt reflect.Type
  75. rtid uintptr
  76. xfFn func(reflect.Value, []byte) error
  77. xfTag byte
  78. }
  79. type decFn struct {
  80. i *decFnInfo
  81. f func(*decFnInfo, reflect.Value)
  82. }
  83. // A Decoder reads and decodes an object from an input stream in the codec format.
  84. type Decoder struct {
  85. r decReader
  86. d decDriver
  87. h decodeHandleI
  88. f map[uintptr]decFn
  89. x []uintptr
  90. s []decFn
  91. }
  92. func (f *decFnInfo) builtin(rv reflect.Value) {
  93. for j, k := int8(0), f.sis.baseIndir; j < k; j++ {
  94. rv = rv.Elem()
  95. }
  96. f.dd.decodeBuiltinType(f.sis.baseId, rv)
  97. }
  98. func (f *decFnInfo) rawExt(rv reflect.Value) {
  99. xtag, xbs := f.dd.decodeExt(false, 0)
  100. for j, k := int8(0), f.sis.baseIndir; j < k; j++ {
  101. rv = rv.Elem()
  102. }
  103. rv.Field(0).SetUint(uint64(xtag))
  104. rv.Field(1).SetBytes(xbs)
  105. }
  106. func (f *decFnInfo) ext(rv reflect.Value) {
  107. _, xbs := f.dd.decodeExt(true, f.xfTag)
  108. for j, k := int8(0), f.sis.baseIndir; j < k; j++ {
  109. rv = rv.Elem()
  110. }
  111. if fnerr := f.xfFn(rv, xbs); fnerr != nil {
  112. panic(fnerr)
  113. }
  114. }
  115. func (f *decFnInfo) binaryMarshal(rv reflect.Value) {
  116. var bm binaryUnmarshaler
  117. if f.sis.unmIndir == -1 {
  118. bm = rv.Addr().Interface().(binaryUnmarshaler)
  119. } else if f.sis.unmIndir == 0 {
  120. bm = rv.Interface().(binaryUnmarshaler)
  121. } else {
  122. for j, k := int8(0), f.sis.unmIndir; j < k; j++ {
  123. rv = rv.Elem()
  124. }
  125. bm = rv.Interface().(binaryUnmarshaler)
  126. }
  127. xbs, _ := f.dd.decodeBytes(nil)
  128. if fnerr := bm.UnmarshalBinary(xbs); fnerr != nil {
  129. panic(fnerr)
  130. }
  131. }
  132. func (f *decFnInfo) kErr(rv reflect.Value) {
  133. decErr("Unhandled value for kind: %v: %s", rv.Kind(), msgBadDesc)
  134. }
  135. func (f *decFnInfo) kString(rv reflect.Value) {
  136. rv.SetString(f.dd.decodeString())
  137. }
  138. func (f *decFnInfo) kBool(rv reflect.Value) {
  139. rv.SetBool(f.dd.decodeBool())
  140. }
  141. func (f *decFnInfo) kInt(rv reflect.Value) {
  142. rv.SetInt(f.dd.decodeInt(intBitsize))
  143. }
  144. func (f *decFnInfo) kInt64(rv reflect.Value) {
  145. rv.SetInt(f.dd.decodeInt(64))
  146. }
  147. func (f *decFnInfo) kInt32(rv reflect.Value) {
  148. rv.SetInt(f.dd.decodeInt(32))
  149. }
  150. func (f *decFnInfo) kInt8(rv reflect.Value) {
  151. rv.SetInt(f.dd.decodeInt(8))
  152. }
  153. func (f *decFnInfo) kInt16(rv reflect.Value) {
  154. rv.SetInt(f.dd.decodeInt(16))
  155. }
  156. func (f *decFnInfo) kFloat32(rv reflect.Value) {
  157. rv.SetFloat(f.dd.decodeFloat(true))
  158. }
  159. func (f *decFnInfo) kFloat64(rv reflect.Value) {
  160. rv.SetFloat(f.dd.decodeFloat(false))
  161. }
  162. func (f *decFnInfo) kUint8(rv reflect.Value) {
  163. rv.SetUint(f.dd.decodeUint(8))
  164. }
  165. func (f *decFnInfo) kUint64(rv reflect.Value) {
  166. rv.SetUint(f.dd.decodeUint(64))
  167. }
  168. func (f *decFnInfo) kUint(rv reflect.Value) {
  169. rv.SetUint(f.dd.decodeUint(uintBitsize))
  170. }
  171. func (f *decFnInfo) kUint32(rv reflect.Value) {
  172. rv.SetUint(f.dd.decodeUint(32))
  173. }
  174. func (f *decFnInfo) kUint16(rv reflect.Value) {
  175. rv.SetUint(f.dd.decodeUint(16))
  176. }
  177. func (f *decFnInfo) kPtr(rv reflect.Value) {
  178. if rv.IsNil() {
  179. rv.Set(reflect.New(f.rt.Elem()))
  180. }
  181. f.d.decodeValue(rv.Elem())
  182. }
  183. func (f *decFnInfo) kInterface(rv reflect.Value) {
  184. f.d.decodeValue(rv.Elem())
  185. }
  186. func (f *decFnInfo) kStruct(rv reflect.Value) {
  187. if currEncodedType := f.dd.currentEncodedType(); currEncodedType == detMap {
  188. containerLen := f.dd.readMapLen()
  189. if containerLen == 0 {
  190. return
  191. }
  192. sissis := f.sis.sis
  193. for j := 0; j < containerLen; j++ {
  194. // var rvkencname string
  195. // ddecode(&rvkencname)
  196. f.dd.initReadNext()
  197. rvkencname := f.dd.decodeString()
  198. // rvksi := sis.getForEncName(rvkencname)
  199. if k := f.sis.indexForEncName(rvkencname); k > -1 {
  200. sfik := sissis[k]
  201. if sfik.i != -1 {
  202. f.d.decodeValue(rv.Field(int(sfik.i)))
  203. } else {
  204. f.d.decodeValue(rv.FieldByIndex(sfik.is))
  205. }
  206. // f.d.decodeValue(sis.field(k, rv))
  207. } else {
  208. if f.d.h.errorIfNoField() {
  209. decErr("No matching struct field found when decoding stream map with key: %v",
  210. rvkencname)
  211. } else {
  212. var nilintf0 interface{}
  213. f.d.decodeValue(reflect.ValueOf(&nilintf0).Elem())
  214. }
  215. }
  216. }
  217. } else if currEncodedType == detArray {
  218. containerLen := f.dd.readArrayLen()
  219. if containerLen == 0 {
  220. return
  221. }
  222. for j, si := range f.sis.sisp {
  223. if j == containerLen {
  224. break
  225. }
  226. if si.i != -1 {
  227. f.d.decodeValue(rv.Field(int(si.i)))
  228. } else {
  229. f.d.decodeValue(rv.FieldByIndex(si.is))
  230. }
  231. }
  232. if containerLen > len(f.sis.sisp) {
  233. // read remaining values and throw away
  234. for j := len(f.sis.sisp); j < containerLen; j++ {
  235. var nilintf0 interface{}
  236. f.d.decodeValue(reflect.ValueOf(&nilintf0).Elem())
  237. }
  238. }
  239. } else {
  240. decErr("Only encoded map or array can be decoded into a struct. (decodeEncodedType: %x)",
  241. currEncodedType)
  242. }
  243. }
  244. func (f *decFnInfo) kSlice(rv reflect.Value) {
  245. // Be more careful calling Set() here, because a reflect.Value from an array
  246. // may have come in here (which may not be settable).
  247. // In places where the slice got from an array could be, we should guard with CanSet() calls.
  248. if f.rtid == byteSliceTypId { // rawbytes
  249. if bs2, changed2 := f.dd.decodeBytes(rv.Bytes()); changed2 {
  250. rv.SetBytes(bs2)
  251. }
  252. return
  253. }
  254. containerLen := f.dd.readArrayLen()
  255. if rv.IsNil() {
  256. rv.Set(reflect.MakeSlice(f.rt, containerLen, containerLen))
  257. }
  258. if containerLen == 0 {
  259. return
  260. }
  261. // if we need to reset rv but it cannot be set, we should err out.
  262. // for example, if slice is got from unaddressable array, CanSet = false
  263. if rvcap, rvlen := rv.Len(), rv.Cap(); containerLen > rvcap {
  264. if rv.CanSet() {
  265. rvn := reflect.MakeSlice(f.rt, containerLen, containerLen)
  266. if rvlen > 0 {
  267. reflect.Copy(rvn, rv)
  268. }
  269. rv.Set(rvn)
  270. } else {
  271. decErr("Cannot reset slice with less cap: %v than stream contents: %v",
  272. rvcap, containerLen)
  273. }
  274. } else if containerLen > rvlen {
  275. rv.SetLen(containerLen)
  276. }
  277. for j := 0; j < containerLen; j++ {
  278. f.d.decodeValue(rv.Index(j))
  279. }
  280. }
  281. func (f *decFnInfo) kArray(rv reflect.Value) {
  282. f.d.decodeValue(rv.Slice(0, rv.Len()))
  283. }
  284. func (f *decFnInfo) kMap(rv reflect.Value) {
  285. containerLen := f.dd.readMapLen()
  286. if rv.IsNil() {
  287. rv.Set(reflect.MakeMap(f.rt))
  288. }
  289. if containerLen == 0 {
  290. return
  291. }
  292. ktype, vtype := f.rt.Key(), f.rt.Elem()
  293. for j := 0; j < containerLen; j++ {
  294. rvk := reflect.New(ktype).Elem()
  295. f.d.decodeValue(rvk)
  296. if ktype == intfTyp {
  297. rvk = rvk.Elem()
  298. if rvk.Type() == byteSliceTyp {
  299. rvk = reflect.ValueOf(string(rvk.Bytes()))
  300. }
  301. }
  302. rvv := rv.MapIndex(rvk)
  303. if !rvv.IsValid() {
  304. rvv = reflect.New(vtype).Elem()
  305. }
  306. f.d.decodeValue(rvv)
  307. rv.SetMapIndex(rvk, rvv)
  308. }
  309. }
  310. // ioDecReader is a decReader that reads off an io.Reader
  311. type ioDecReader struct {
  312. r io.Reader
  313. br io.ByteReader
  314. x [8]byte //temp byte array re-used internally for efficiency
  315. }
  316. // bytesDecReader is a decReader that reads off a byte slice with zero copying
  317. type bytesDecReader struct {
  318. b []byte // data
  319. c int // cursor
  320. a int // available
  321. }
  322. type decodeHandleI interface {
  323. getDecodeExt(rt uintptr) (tag byte, fn func(reflect.Value, []byte) error)
  324. errorIfNoField() bool
  325. }
  326. type DecodeOptions struct {
  327. // An instance of MapType is used during schema-less decoding of a map in the stream.
  328. // If nil, we use map[interface{}]interface{}
  329. MapType reflect.Type
  330. // An instance of SliceType is used during schema-less decoding of an array in the stream.
  331. // If nil, we use []interface{}
  332. SliceType reflect.Type
  333. // ErrorIfNoField controls whether an error is returned when decoding a map
  334. // from a codec stream into a struct, and no matching struct field is found.
  335. ErrorIfNoField bool
  336. }
  337. func (o *DecodeOptions) errorIfNoField() bool {
  338. return o.ErrorIfNoField
  339. }
  340. // NewDecoder returns a Decoder for decoding a stream of bytes from an io.Reader.
  341. //
  342. // For efficiency, Users are encouraged to pass in a memory buffered writer
  343. // (eg bufio.Reader, bytes.Buffer).
  344. func NewDecoder(r io.Reader, h Handle) *Decoder {
  345. z := ioDecReader{
  346. r: r,
  347. }
  348. z.br, _ = r.(io.ByteReader)
  349. return &Decoder{r: &z, d: h.newDecDriver(&z), h: h}
  350. }
  351. // NewDecoderBytes returns a Decoder which efficiently decodes directly
  352. // from a byte slice with zero copying.
  353. func NewDecoderBytes(in []byte, h Handle) *Decoder {
  354. z := bytesDecReader{
  355. b: in,
  356. a: len(in),
  357. }
  358. return &Decoder{r: &z, d: h.newDecDriver(&z), h: h}
  359. }
  360. // Decode decodes the stream from reader and stores the result in the
  361. // value pointed to by v. v cannot be a nil pointer. v can also be
  362. // a reflect.Value of a pointer.
  363. //
  364. // Note that a pointer to a nil interface is not a nil pointer.
  365. // If you do not know what type of stream it is, pass in a pointer to a nil interface.
  366. // We will decode and store a value in that nil interface.
  367. //
  368. // Sample usages:
  369. // // Decoding into a non-nil typed value
  370. // var f float32
  371. // err = codec.NewDecoder(r, handle).Decode(&f)
  372. //
  373. // // Decoding into nil interface
  374. // var v interface{}
  375. // dec := codec.NewDecoder(r, handle)
  376. // err = dec.Decode(&v)
  377. //
  378. // When decoding into a nil interface{}, we will decode into an appropriate value based
  379. // on the contents of the stream:
  380. // - Numbers are decoded as float64, int64 or uint64.
  381. // - Other values are decoded appropriately depending on the encoding:
  382. // bool, string, []byte, time.Time, etc
  383. // - Extensions are decoded as RawExt (if no ext function registered for the tag)
  384. // Configurations exist on the Handle to override defaults
  385. // (e.g. for MapType, SliceType and how to decode raw bytes).
  386. //
  387. // When decoding into a non-nil interface{} value, the mode of encoding is based on the
  388. // type of the value. When a value is seen:
  389. // - If an extension is registered for it, call that extension function
  390. // - If it implements BinaryUnmarshaler, call its UnmarshalBinary(data []byte) error
  391. // - Else decode it based on its reflect.Kind
  392. //
  393. // There are some special rules when decoding into containers (slice/array/map/struct).
  394. // Decode will typically use the stream contents to UPDATE the container.
  395. // - This means that for a struct or map, we just update matching fields or keys.
  396. // - For a slice/array, we just update the first n elements, where n is length of the stream.
  397. // - However, if decoding into a nil map/slice and the length of the stream is 0,
  398. // we reset the destination map/slice to be a zero-length non-nil map/slice.
  399. // - Also, if the encoded value is Nil in the stream, then we try to set
  400. // the container to its "zero" value (e.g. nil for slice/map).
  401. // - Note that a struct can be decoded from an array in the stream,
  402. // by updating fields as they occur in the struct.
  403. func (d *Decoder) Decode(v interface{}) (err error) {
  404. defer panicToErr(&err)
  405. d.decode(v)
  406. return
  407. }
  408. func (d *Decoder) decode(iv interface{}) {
  409. d.d.initReadNext()
  410. // Fast path included for various pointer types which cannot be registered as extensions
  411. switch v := iv.(type) {
  412. case nil:
  413. decErr("Cannot decode into nil.")
  414. case reflect.Value:
  415. d.chkPtrValue(v)
  416. d.decodeValue(v)
  417. case *string:
  418. *v = d.d.decodeString()
  419. case *bool:
  420. *v = d.d.decodeBool()
  421. case *int:
  422. *v = int(d.d.decodeInt(intBitsize))
  423. case *int8:
  424. *v = int8(d.d.decodeInt(8))
  425. case *int16:
  426. *v = int16(d.d.decodeInt(16))
  427. case *int32:
  428. *v = int32(d.d.decodeInt(32))
  429. case *int64:
  430. *v = int64(d.d.decodeInt(64))
  431. case *uint:
  432. *v = uint(d.d.decodeUint(uintBitsize))
  433. case *uint8:
  434. *v = uint8(d.d.decodeUint(8))
  435. case *uint16:
  436. *v = uint16(d.d.decodeUint(16))
  437. case *uint32:
  438. *v = uint32(d.d.decodeUint(32))
  439. case *uint64:
  440. *v = uint64(d.d.decodeUint(64))
  441. case *float32:
  442. *v = float32(d.d.decodeFloat(true))
  443. case *float64:
  444. *v = d.d.decodeFloat(false)
  445. case *interface{}:
  446. d.decodeValue(reflect.ValueOf(iv).Elem())
  447. default:
  448. rv := reflect.ValueOf(iv)
  449. d.chkPtrValue(rv)
  450. d.decodeValue(rv)
  451. }
  452. }
  453. func (d *Decoder) decodeValue(rv reflect.Value) {
  454. d.d.initReadNext()
  455. rt := rv.Type()
  456. rvOrig := rv
  457. wasNilIntf := rt.Kind() == reflect.Interface && rv.IsNil()
  458. var ndesc decodeNakedContext
  459. //if nil interface, use some hieristics to set the nil interface to an
  460. //appropriate value based on the first byte read (byte descriptor bd)
  461. if wasNilIntf {
  462. // e.g. nil interface{}, error, io.Reader, etc
  463. rv, ndesc = d.d.decodeNaked()
  464. if ndesc == dncNil {
  465. return
  466. }
  467. //Prevent from decoding into nil error, io.Reader, etc if non-nil value in stream.
  468. //We can only decode into interface{} (0 methods). Else reflect.Set fails later.
  469. if num := rt.NumMethod(); num > 0 {
  470. decErr("decodeValue: Cannot decode non-nil codec value into nil %v (%v methods)", rt, num)
  471. }
  472. if ndesc == dncHandled {
  473. rvOrig.Set(rv)
  474. return
  475. }
  476. rt = rv.Type()
  477. } else if d.d.tryDecodeAsNil() {
  478. // Note: if value in stream is nil,
  479. // then we set the dereferenced value to its "zero" value (if settable).
  480. for rv.Kind() == reflect.Ptr {
  481. rv = rv.Elem()
  482. }
  483. if rv.CanSet() {
  484. rv.Set(reflect.Zero(rv.Type()))
  485. }
  486. return
  487. }
  488. rtid := reflect.ValueOf(rt).Pointer()
  489. // retrieve or register a focus'ed function for this type
  490. // to eliminate need to do the retrieval multiple times
  491. // if d.f == nil && d.s == nil {
  492. // // debugf("---->Creating new dec f map for type: %v\n", rt)
  493. // }
  494. var fn decFn
  495. var ok bool
  496. if useMapForCodecCache {
  497. fn, ok = d.f[rtid]
  498. } else {
  499. for i, v := range d.x {
  500. if v == rtid {
  501. fn, ok = d.s[i], true
  502. break
  503. }
  504. }
  505. }
  506. if !ok {
  507. // debugf("\tCreating new dec fn for type: %v\n", rt)
  508. fi := decFnInfo { sis:getTypeInfo(rtid, rt), d:d, dd:d.d, rt:rt, rtid:rtid }
  509. // An extension can be registered for any type, regardless of the Kind
  510. // (e.g. type BitSet int64, type MyStruct { / * unexported fields * / }, type X []int, etc.
  511. //
  512. // We can't check if it's an extension byte here first, because the user may have
  513. // registered a pointer or non-pointer type, meaning we may have to recurse first
  514. // before matching a mapped type, even though the extension byte is already detected.
  515. //
  516. // If we are checking for builtin or ext type here, it means we didn't go through decodeNaked,
  517. // Because decodeNaked would have handled it. It also means wasNilIntf = false.
  518. if fi.sis.baseId == rawExtTypId {
  519. fn = decFn { &fi, (*decFnInfo).rawExt }
  520. } else if d.d.isBuiltinType(fi.sis.baseId) {
  521. fn = decFn { &fi, (*decFnInfo).builtin }
  522. } else if xfTag, xfFn := d.h.getDecodeExt(fi.sis.baseId); xfFn != nil {
  523. fi.xfTag, fi.xfFn = xfTag, xfFn
  524. fn = decFn { &fi, (*decFnInfo).ext }
  525. } else if supportBinaryMarshal && fi.sis.unm {
  526. fn = decFn { &fi, (*decFnInfo).binaryMarshal }
  527. } else {
  528. // NOTE: if decoding into a nil interface{}, we return a non-nil
  529. // value except even if the container registers a length of 0.
  530. switch rk := rt.Kind(); rk {
  531. case reflect.String:
  532. fn = decFn { &fi, (*decFnInfo).kString }
  533. case reflect.Bool:
  534. fn = decFn { &fi, (*decFnInfo).kBool }
  535. case reflect.Int:
  536. fn = decFn { &fi, (*decFnInfo).kInt }
  537. case reflect.Int64:
  538. fn = decFn { &fi, (*decFnInfo).kInt64 }
  539. case reflect.Int32:
  540. fn = decFn { &fi, (*decFnInfo).kInt32 }
  541. case reflect.Int8:
  542. fn = decFn { &fi, (*decFnInfo).kInt8 }
  543. case reflect.Int16:
  544. fn = decFn { &fi, (*decFnInfo).kInt16 }
  545. case reflect.Float32:
  546. fn = decFn { &fi, (*decFnInfo).kFloat32 }
  547. case reflect.Float64:
  548. fn = decFn { &fi, (*decFnInfo).kFloat64 }
  549. case reflect.Uint8:
  550. fn = decFn { &fi, (*decFnInfo).kUint8 }
  551. case reflect.Uint64:
  552. fn = decFn { &fi, (*decFnInfo).kUint64 }
  553. case reflect.Uint:
  554. fn = decFn { &fi, (*decFnInfo).kUint }
  555. case reflect.Uint32:
  556. fn = decFn { &fi, (*decFnInfo).kUint32 }
  557. case reflect.Uint16:
  558. fn = decFn { &fi, (*decFnInfo).kUint16 }
  559. case reflect.Ptr:
  560. fn = decFn { &fi, (*decFnInfo).kPtr }
  561. case reflect.Interface:
  562. fn = decFn { &fi, (*decFnInfo).kInterface }
  563. case reflect.Struct:
  564. fn = decFn { &fi, (*decFnInfo).kStruct }
  565. case reflect.Slice:
  566. fn = decFn { &fi, (*decFnInfo).kSlice }
  567. case reflect.Array:
  568. fn = decFn { &fi, (*decFnInfo).kArray }
  569. case reflect.Map:
  570. fn = decFn { &fi, (*decFnInfo).kMap }
  571. default:
  572. fn = decFn { &fi, (*decFnInfo).kErr }
  573. }
  574. }
  575. if useMapForCodecCache {
  576. if d.f == nil {
  577. d.f = make(map[uintptr]decFn, 16)
  578. }
  579. d.f[rtid] = fn
  580. } else {
  581. d.s = append(d.s, fn )
  582. d.x = append(d.x, rtid)
  583. }
  584. }
  585. fn.f(fn.i, rv)
  586. if wasNilIntf {
  587. rvOrig.Set(rv)
  588. }
  589. return
  590. }
  591. func (d *Decoder) chkPtrValue(rv reflect.Value) {
  592. // We cannot marshal into a non-pointer or a nil pointer
  593. // (at least pass a nil interface so we can marshal into it)
  594. if rv.Kind() != reflect.Ptr || rv.IsNil() {
  595. var rvi interface{} = rv
  596. if rv.IsValid() && rv.CanInterface() {
  597. rvi = rv.Interface()
  598. }
  599. decErr("Decode: Expecting valid pointer to decode into. Got: %v, %T, %v",
  600. rv.Kind(), rvi, rvi)
  601. }
  602. }
  603. // ------------------------------------
  604. func (z *ioDecReader) readn(n int) (bs []byte) {
  605. bs = make([]byte, n)
  606. if _, err := io.ReadAtLeast(z.r, bs, n); err != nil {
  607. panic(err)
  608. }
  609. return
  610. }
  611. func (z *ioDecReader) readb(bs []byte) {
  612. if _, err := io.ReadAtLeast(z.r, bs, len(bs)); err != nil {
  613. panic(err)
  614. }
  615. }
  616. func (z *ioDecReader) readn1() uint8 {
  617. if z.br != nil {
  618. b, err := z.br.ReadByte()
  619. if err != nil {
  620. panic(err)
  621. }
  622. return b
  623. }
  624. z.readb(z.x[:1])
  625. return z.x[0]
  626. }
  627. func (z *ioDecReader) readUint16() uint16 {
  628. z.readb(z.x[:2])
  629. return bigen.Uint16(z.x[:2])
  630. }
  631. func (z *ioDecReader) readUint32() uint32 {
  632. z.readb(z.x[:4])
  633. return bigen.Uint32(z.x[:4])
  634. }
  635. func (z *ioDecReader) readUint64() uint64 {
  636. z.readb(z.x[:8])
  637. return bigen.Uint64(z.x[:8])
  638. }
  639. // ------------------------------------
  640. func (z *bytesDecReader) consume(n int) (oldcursor int) {
  641. if z.a == 0 {
  642. panic(io.EOF)
  643. }
  644. if n > z.a {
  645. decErr("Trying to read %v bytes. Only %v available", n, z.a)
  646. }
  647. // z.checkAvailable(n)
  648. oldcursor = z.c
  649. z.c = oldcursor + n
  650. z.a = z.a - n
  651. return
  652. }
  653. func (z *bytesDecReader) readn(n int) (bs []byte) {
  654. c0 := z.consume(n)
  655. bs = z.b[c0:z.c]
  656. return
  657. }
  658. func (z *bytesDecReader) readb(bs []byte) {
  659. copy(bs, z.readn(len(bs)))
  660. }
  661. func (z *bytesDecReader) readn1() uint8 {
  662. c0 := z.consume(1)
  663. return z.b[c0]
  664. }
  665. // Use binaryEncoding helper for 4 and 8 bits, but inline it for 2 bits
  666. // creating temp slice variable and copying it to helper function is expensive
  667. // for just 2 bits.
  668. func (z *bytesDecReader) readUint16() uint16 {
  669. c0 := z.consume(2)
  670. return uint16(z.b[c0+1]) | uint16(z.b[c0])<<8
  671. }
  672. func (z *bytesDecReader) readUint32() uint32 {
  673. c0 := z.consume(4)
  674. return bigen.Uint32(z.b[c0:z.c])
  675. }
  676. func (z *bytesDecReader) readUint64() uint64 {
  677. c0 := z.consume(8)
  678. return bigen.Uint64(z.b[c0:z.c])
  679. }
  680. // ----------------------------------------
  681. func decErr(format string, params ...interface{}) {
  682. doPanic(msgTagDec, format, params...)
  683. }