decode.go 19 KB

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