decode.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870
  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. // "runtime/debug"
  8. )
  9. // Some tagging information for error messages.
  10. const (
  11. msgTagDec = "codec.decoder"
  12. msgBadDesc = "Unrecognized descriptor byte"
  13. msgDecCannotExpandArr = "cannot expand go array from %v to stream length: %v"
  14. )
  15. // fastpathsEnc holds the rtid (reflect.Type Pointer) to fast decode function for a selected slice/map type.
  16. var fastpathsDec = make(map[uintptr]func(*decFnInfo, reflect.Value))
  17. // decReader abstracts the reading source, allowing implementations that can
  18. // read from an io.Reader or directly off a byte slice with zero-copying.
  19. type decReader interface {
  20. readn(n int) []byte
  21. readb([]byte)
  22. readn1() uint8
  23. readUint16() uint16
  24. readUint32() uint32
  25. readUint64() uint64
  26. }
  27. type decDriver interface {
  28. initReadNext()
  29. tryDecodeAsNil() bool
  30. currentEncodedType() valueType
  31. isBuiltinType(rt uintptr) bool
  32. decodeBuiltin(rt uintptr, v interface{})
  33. //decodeNaked: Numbers are decoded as int64, uint64, float64 only (no smaller sized number types).
  34. decodeNaked() (v interface{}, vt valueType, decodeFurther bool)
  35. decodeInt(bitsize uint8) (i int64)
  36. decodeUint(bitsize uint8) (ui uint64)
  37. decodeFloat(chkOverflow32 bool) (f float64)
  38. decodeBool() (b bool)
  39. // decodeString can also decode symbols
  40. decodeString() (s string)
  41. decodeBytes(bs []byte) (bsOut []byte, changed bool)
  42. decodeExt(verifyTag bool, tag byte) (xtag byte, xbs []byte)
  43. readMapLen() int
  44. readArrayLen() int
  45. }
  46. type DecodeOptions struct {
  47. // An instance of MapType is used during schema-less decoding of a map in the stream.
  48. // If nil, we use map[interface{}]interface{}
  49. MapType reflect.Type
  50. // An instance of SliceType is used during schema-less decoding of an array in the stream.
  51. // If nil, we use []interface{}
  52. SliceType reflect.Type
  53. // ErrorIfNoField controls whether an error is returned when decoding a map
  54. // from a codec stream into a struct, and no matching struct field is found.
  55. ErrorIfNoField bool
  56. }
  57. // ------------------------------------
  58. // ioDecReader is a decReader that reads off an io.Reader
  59. type ioDecReader struct {
  60. r io.Reader
  61. br io.ByteReader
  62. x [8]byte //temp byte array re-used internally for efficiency
  63. }
  64. func (z *ioDecReader) readn(n int) (bs []byte) {
  65. if n <= 0 {
  66. return
  67. }
  68. bs = make([]byte, n)
  69. if _, err := io.ReadAtLeast(z.r, bs, n); err != nil {
  70. panic(err)
  71. }
  72. return
  73. }
  74. func (z *ioDecReader) readb(bs []byte) {
  75. if _, err := io.ReadAtLeast(z.r, bs, len(bs)); err != nil {
  76. panic(err)
  77. }
  78. }
  79. func (z *ioDecReader) readn1() uint8 {
  80. if z.br != nil {
  81. b, err := z.br.ReadByte()
  82. if err != nil {
  83. panic(err)
  84. }
  85. return b
  86. }
  87. z.readb(z.x[:1])
  88. return z.x[0]
  89. }
  90. func (z *ioDecReader) readUint16() uint16 {
  91. z.readb(z.x[:2])
  92. return bigen.Uint16(z.x[:2])
  93. }
  94. func (z *ioDecReader) readUint32() uint32 {
  95. z.readb(z.x[:4])
  96. return bigen.Uint32(z.x[:4])
  97. }
  98. func (z *ioDecReader) readUint64() uint64 {
  99. z.readb(z.x[:8])
  100. return bigen.Uint64(z.x[:8])
  101. }
  102. // ------------------------------------
  103. // bytesDecReader is a decReader that reads off a byte slice with zero copying
  104. type bytesDecReader struct {
  105. b []byte // data
  106. c int // cursor
  107. a int // available
  108. }
  109. func (z *bytesDecReader) consume(n int) (oldcursor int) {
  110. if z.a == 0 {
  111. panic(io.EOF)
  112. }
  113. if n > z.a {
  114. decErr("Trying to read %v bytes. Only %v available", n, z.a)
  115. }
  116. // z.checkAvailable(n)
  117. oldcursor = z.c
  118. z.c = oldcursor + n
  119. z.a = z.a - n
  120. return
  121. }
  122. func (z *bytesDecReader) readn(n int) (bs []byte) {
  123. if n <= 0 {
  124. return
  125. }
  126. c0 := z.consume(n)
  127. bs = z.b[c0:z.c]
  128. return
  129. }
  130. func (z *bytesDecReader) readb(bs []byte) {
  131. copy(bs, z.readn(len(bs)))
  132. }
  133. func (z *bytesDecReader) readn1() uint8 {
  134. c0 := z.consume(1)
  135. return z.b[c0]
  136. }
  137. // Use binaryEncoding helper for 4 and 8 bits, but inline it for 2 bits
  138. // creating temp slice variable and copying it to helper function is expensive
  139. // for just 2 bits.
  140. func (z *bytesDecReader) readUint16() uint16 {
  141. c0 := z.consume(2)
  142. return uint16(z.b[c0+1]) | uint16(z.b[c0])<<8
  143. }
  144. func (z *bytesDecReader) readUint32() uint32 {
  145. c0 := z.consume(4)
  146. return bigen.Uint32(z.b[c0:z.c])
  147. }
  148. func (z *bytesDecReader) readUint64() uint64 {
  149. c0 := z.consume(8)
  150. return bigen.Uint64(z.b[c0:z.c])
  151. }
  152. // ------------------------------------
  153. // decFnInfo has methods for registering handling decoding of a specific type
  154. // based on some characteristics (builtin, extension, reflect Kind, etc)
  155. type decFnInfo struct {
  156. ti *typeInfo
  157. d *Decoder
  158. dd decDriver
  159. xfFn func(reflect.Value, []byte) error
  160. xfTag byte
  161. array bool
  162. }
  163. // ----------------------------------------
  164. type decFn struct {
  165. i *decFnInfo
  166. f func(*decFnInfo, reflect.Value)
  167. }
  168. func (f *decFnInfo) builtin(rv reflect.Value) {
  169. f.dd.decodeBuiltin(f.ti.rtid, rv.Addr().Interface())
  170. }
  171. func (f *decFnInfo) rawExt(rv reflect.Value) {
  172. xtag, xbs := f.dd.decodeExt(false, 0)
  173. rv.Field(0).SetUint(uint64(xtag))
  174. rv.Field(1).SetBytes(xbs)
  175. }
  176. func (f *decFnInfo) ext(rv reflect.Value) {
  177. _, xbs := f.dd.decodeExt(true, f.xfTag)
  178. if fnerr := f.xfFn(rv, xbs); fnerr != nil {
  179. panic(fnerr)
  180. }
  181. }
  182. func (f *decFnInfo) binaryMarshal(rv reflect.Value) {
  183. var bm binaryUnmarshaler
  184. if f.ti.unmIndir == -1 {
  185. bm = rv.Addr().Interface().(binaryUnmarshaler)
  186. } else if f.ti.unmIndir == 0 {
  187. bm = rv.Interface().(binaryUnmarshaler)
  188. } else {
  189. for j, k := int8(0), f.ti.unmIndir; j < k; j++ {
  190. if rv.IsNil() {
  191. rv.Set(reflect.New(rv.Type().Elem()))
  192. }
  193. rv = rv.Elem()
  194. }
  195. bm = rv.Interface().(binaryUnmarshaler)
  196. }
  197. xbs, _ := f.dd.decodeBytes(nil)
  198. if fnerr := bm.UnmarshalBinary(xbs); fnerr != nil {
  199. panic(fnerr)
  200. }
  201. }
  202. func (f *decFnInfo) kErr(rv reflect.Value) {
  203. decErr("Unhandled value for kind: %v: %s", rv.Kind(), msgBadDesc)
  204. }
  205. func (f *decFnInfo) kString(rv reflect.Value) {
  206. rv.SetString(f.dd.decodeString())
  207. }
  208. func (f *decFnInfo) kBool(rv reflect.Value) {
  209. rv.SetBool(f.dd.decodeBool())
  210. }
  211. func (f *decFnInfo) kInt(rv reflect.Value) {
  212. rv.SetInt(f.dd.decodeInt(intBitsize))
  213. }
  214. func (f *decFnInfo) kInt64(rv reflect.Value) {
  215. rv.SetInt(f.dd.decodeInt(64))
  216. }
  217. func (f *decFnInfo) kInt32(rv reflect.Value) {
  218. rv.SetInt(f.dd.decodeInt(32))
  219. }
  220. func (f *decFnInfo) kInt8(rv reflect.Value) {
  221. rv.SetInt(f.dd.decodeInt(8))
  222. }
  223. func (f *decFnInfo) kInt16(rv reflect.Value) {
  224. rv.SetInt(f.dd.decodeInt(16))
  225. }
  226. func (f *decFnInfo) kFloat32(rv reflect.Value) {
  227. rv.SetFloat(f.dd.decodeFloat(true))
  228. }
  229. func (f *decFnInfo) kFloat64(rv reflect.Value) {
  230. rv.SetFloat(f.dd.decodeFloat(false))
  231. }
  232. func (f *decFnInfo) kUint8(rv reflect.Value) {
  233. rv.SetUint(f.dd.decodeUint(8))
  234. }
  235. func (f *decFnInfo) kUint64(rv reflect.Value) {
  236. rv.SetUint(f.dd.decodeUint(64))
  237. }
  238. func (f *decFnInfo) kUint(rv reflect.Value) {
  239. rv.SetUint(f.dd.decodeUint(uintBitsize))
  240. }
  241. func (f *decFnInfo) kUint32(rv reflect.Value) {
  242. rv.SetUint(f.dd.decodeUint(32))
  243. }
  244. func (f *decFnInfo) kUint16(rv reflect.Value) {
  245. rv.SetUint(f.dd.decodeUint(16))
  246. }
  247. // func (f *decFnInfo) kPtr(rv reflect.Value) {
  248. // debugf(">>>>>>> ??? decode kPtr called - shouldn't get called")
  249. // if rv.IsNil() {
  250. // rv.Set(reflect.New(rv.Type().Elem()))
  251. // }
  252. // f.d.decodeValue(rv.Elem())
  253. // }
  254. func (f *decFnInfo) kInterface(rv reflect.Value) {
  255. // debugf("\t===> kInterface")
  256. if !rv.IsNil() {
  257. f.d.decodeValue(rv.Elem(), decFn{})
  258. return
  259. }
  260. // nil interface:
  261. // use some hieristics to set the nil interface to an
  262. // appropriate value based on the first byte read (byte descriptor bd)
  263. v, vt, decodeFurther := f.dd.decodeNaked()
  264. if vt == valueTypeNil {
  265. return
  266. }
  267. // Cannot decode into nil interface with methods (e.g. error, io.Reader, etc)
  268. // if non-nil value in stream.
  269. if num := f.ti.rt.NumMethod(); num > 0 {
  270. decErr("decodeValue: Cannot decode non-nil codec value into nil %v (%v methods)",
  271. f.ti.rt, num)
  272. }
  273. var rvn reflect.Value
  274. var useRvn bool
  275. switch vt {
  276. case valueTypeMap:
  277. if f.d.h.MapType == nil {
  278. var m2 map[interface{}]interface{}
  279. v = &m2
  280. } else {
  281. rvn = reflect.New(f.d.h.MapType).Elem()
  282. useRvn = true
  283. }
  284. case valueTypeArray:
  285. if f.d.h.SliceType == nil {
  286. var m2 []interface{}
  287. v = &m2
  288. } else {
  289. rvn = reflect.New(f.d.h.SliceType).Elem()
  290. useRvn = true
  291. }
  292. case valueTypeExt:
  293. re := v.(*RawExt)
  294. var bfn func(reflect.Value, []byte) error
  295. rvn, bfn = f.d.h.getDecodeExtForTag(re.Tag)
  296. if bfn == nil {
  297. rvn = reflect.ValueOf(*re)
  298. } else if fnerr := bfn(rvn, re.Data); fnerr != nil {
  299. panic(fnerr)
  300. }
  301. rv.Set(rvn)
  302. return
  303. }
  304. if decodeFurther {
  305. if useRvn {
  306. f.d.decodeValue(rvn, decFn{})
  307. } else if v != nil {
  308. // this v is a pointer, so we need to dereference it when done
  309. f.d.decode(v)
  310. rvn = reflect.ValueOf(v).Elem()
  311. useRvn = true
  312. }
  313. }
  314. if useRvn {
  315. rv.Set(rvn)
  316. } else if v != nil {
  317. rv.Set(reflect.ValueOf(v))
  318. }
  319. }
  320. func (f *decFnInfo) kStruct(rv reflect.Value) {
  321. fti := f.ti
  322. if currEncodedType := f.dd.currentEncodedType(); currEncodedType == valueTypeMap {
  323. containerLen := f.dd.readMapLen()
  324. if containerLen == 0 {
  325. return
  326. }
  327. tisfi := fti.sfi
  328. for j := 0; j < containerLen; j++ {
  329. // var rvkencname string
  330. // ddecode(&rvkencname)
  331. f.dd.initReadNext()
  332. rvkencname := f.dd.decodeString()
  333. // rvksi := ti.getForEncName(rvkencname)
  334. if k := fti.indexForEncName(rvkencname); k > -1 {
  335. sfik := tisfi[k]
  336. if sfik.i != -1 {
  337. f.d.decodeValue(rv.Field(int(sfik.i)), decFn{})
  338. } else {
  339. f.d.decEmbeddedField(rv, sfik.is)
  340. }
  341. // f.d.decodeValue(ti.field(k, rv))
  342. } else {
  343. if f.d.h.ErrorIfNoField {
  344. decErr("No matching struct field found when decoding stream map with key: %v",
  345. rvkencname)
  346. } else {
  347. var nilintf0 interface{}
  348. f.d.decodeValue(reflect.ValueOf(&nilintf0).Elem(), decFn{})
  349. }
  350. }
  351. }
  352. } else if currEncodedType == valueTypeArray {
  353. containerLen := f.dd.readArrayLen()
  354. if containerLen == 0 {
  355. return
  356. }
  357. for j, si := range fti.sfip {
  358. if j == containerLen {
  359. break
  360. }
  361. if si.i != -1 {
  362. f.d.decodeValue(rv.Field(int(si.i)), decFn{})
  363. } else {
  364. f.d.decEmbeddedField(rv, si.is)
  365. }
  366. }
  367. if containerLen > len(fti.sfip) {
  368. // read remaining values and throw away
  369. for j := len(fti.sfip); j < containerLen; j++ {
  370. var nilintf0 interface{}
  371. f.d.decodeValue(reflect.ValueOf(&nilintf0).Elem(), decFn{})
  372. }
  373. }
  374. } else {
  375. decErr("Only encoded map or array can be decoded into a struct. (valueType: %x)",
  376. currEncodedType)
  377. }
  378. }
  379. func (f *decFnInfo) kSlice(rv reflect.Value) {
  380. // A slice can be set from a map or array in stream.
  381. currEncodedType := f.dd.currentEncodedType()
  382. switch currEncodedType {
  383. case valueTypeBytes, valueTypeString:
  384. if f.ti.rtid == uint8SliceTypId || f.ti.rt.Elem().Kind() == reflect.Uint8 {
  385. if bs2, changed2 := f.dd.decodeBytes(rv.Bytes()); changed2 {
  386. rv.SetBytes(bs2)
  387. }
  388. return
  389. }
  390. }
  391. containerLen, containerLenS := decContLens(f.dd, currEncodedType)
  392. // an array can never return a nil slice. so no need to check f.array here.
  393. if rv.IsNil() {
  394. rv.Set(reflect.MakeSlice(f.ti.rt, containerLenS, containerLenS))
  395. }
  396. if containerLen == 0 {
  397. return
  398. }
  399. if rvcap, rvlen := rv.Len(), rv.Cap(); containerLenS > rvcap {
  400. if f.array { // !rv.CanSet()
  401. decErr(msgDecCannotExpandArr, rvcap, containerLenS)
  402. }
  403. rvn := reflect.MakeSlice(f.ti.rt, containerLenS, containerLenS)
  404. if rvlen > 0 {
  405. reflect.Copy(rvn, rv)
  406. }
  407. rv.Set(rvn)
  408. } else if containerLenS > rvlen {
  409. rv.SetLen(containerLenS)
  410. }
  411. rtelem := f.ti.rt.Elem()
  412. for rtelem.Kind() == reflect.Ptr {
  413. rtelem = rtelem.Elem()
  414. }
  415. fn := f.d.getDecFn(rtelem)
  416. for j := 0; j < containerLenS; j++ {
  417. f.d.decodeValue(rv.Index(j), fn)
  418. }
  419. }
  420. func (f *decFnInfo) kArray(rv reflect.Value) {
  421. // f.d.decodeValue(rv.Slice(0, rv.Len()))
  422. f.kSlice(rv.Slice(0, rv.Len()))
  423. }
  424. func (f *decFnInfo) kMap(rv reflect.Value) {
  425. containerLen := f.dd.readMapLen()
  426. if rv.IsNil() {
  427. rv.Set(reflect.MakeMap(f.ti.rt))
  428. }
  429. if containerLen == 0 {
  430. return
  431. }
  432. ktype, vtype := f.ti.rt.Key(), f.ti.rt.Elem()
  433. ktypeId := reflect.ValueOf(ktype).Pointer()
  434. var keyFn, valFn decFn
  435. var xtyp reflect.Type
  436. for xtyp = ktype; xtyp.Kind() == reflect.Ptr; xtyp = xtyp.Elem() {
  437. }
  438. keyFn = f.d.getDecFn(xtyp)
  439. for xtyp = vtype; xtyp.Kind() == reflect.Ptr; xtyp = xtyp.Elem() {
  440. }
  441. valFn = f.d.getDecFn(xtyp)
  442. for j := 0; j < containerLen; j++ {
  443. rvk := reflect.New(ktype).Elem()
  444. f.d.decodeValue(rvk, keyFn)
  445. // special case if a byte array.
  446. if ktypeId == intfTypId {
  447. rvk = rvk.Elem()
  448. if rvk.Type() == uint8SliceTyp {
  449. rvk = reflect.ValueOf(string(rvk.Bytes()))
  450. }
  451. }
  452. rvv := rv.MapIndex(rvk)
  453. if !rvv.IsValid() {
  454. rvv = reflect.New(vtype).Elem()
  455. }
  456. f.d.decodeValue(rvv, valFn)
  457. rv.SetMapIndex(rvk, rvv)
  458. }
  459. }
  460. // A Decoder reads and decodes an object from an input stream in the codec format.
  461. type Decoder struct {
  462. r decReader
  463. d decDriver
  464. h *BasicHandle
  465. f map[uintptr]decFn
  466. x []uintptr
  467. s []decFn
  468. }
  469. // NewDecoder returns a Decoder for decoding a stream of bytes from an io.Reader.
  470. //
  471. // For efficiency, Users are encouraged to pass in a memory buffered writer
  472. // (eg bufio.Reader, bytes.Buffer).
  473. func NewDecoder(r io.Reader, h Handle) *Decoder {
  474. z := ioDecReader{
  475. r: r,
  476. }
  477. z.br, _ = r.(io.ByteReader)
  478. return &Decoder{r: &z, d: h.newDecDriver(&z), h: h.getBasicHandle()}
  479. }
  480. // NewDecoderBytes returns a Decoder which efficiently decodes directly
  481. // from a byte slice with zero copying.
  482. func NewDecoderBytes(in []byte, h Handle) *Decoder {
  483. z := bytesDecReader{
  484. b: in,
  485. a: len(in),
  486. }
  487. return &Decoder{r: &z, d: h.newDecDriver(&z), h: h.getBasicHandle()}
  488. }
  489. // Decode decodes the stream from reader and stores the result in the
  490. // value pointed to by v. v cannot be a nil pointer. v can also be
  491. // a reflect.Value of a pointer.
  492. //
  493. // Note that a pointer to a nil interface is not a nil pointer.
  494. // If you do not know what type of stream it is, pass in a pointer to a nil interface.
  495. // We will decode and store a value in that nil interface.
  496. //
  497. // Sample usages:
  498. // // Decoding into a non-nil typed value
  499. // var f float32
  500. // err = codec.NewDecoder(r, handle).Decode(&f)
  501. //
  502. // // Decoding into nil interface
  503. // var v interface{}
  504. // dec := codec.NewDecoder(r, handle)
  505. // err = dec.Decode(&v)
  506. //
  507. // When decoding into a nil interface{}, we will decode into an appropriate value based
  508. // on the contents of the stream:
  509. // - Numbers are decoded as float64, int64 or uint64.
  510. // - Other values are decoded appropriately depending on the type:
  511. // bool, string, []byte, time.Time, etc
  512. // - Extensions are decoded as RawExt (if no ext function registered for the tag)
  513. // Configurations exist on the Handle to override defaults
  514. // (e.g. for MapType, SliceType and how to decode raw bytes).
  515. //
  516. // When decoding into a non-nil interface{} value, the mode of encoding is based on the
  517. // type of the value. When a value is seen:
  518. // - If an extension is registered for it, call that extension function
  519. // - If it implements BinaryUnmarshaler, call its UnmarshalBinary(data []byte) error
  520. // - Else decode it based on its reflect.Kind
  521. //
  522. // There are some special rules when decoding into containers (slice/array/map/struct).
  523. // Decode will typically use the stream contents to UPDATE the container.
  524. // - A map can be decoded from a stream map, by updating matching keys.
  525. // - A slice can be decoded from a stream array,
  526. // by updating the first n elements, where n is length of the stream.
  527. // - A slice can be decoded from a stream map, by decoding as if
  528. // it contains a sequence of key-value pairs.
  529. // - A struct can be decoded from a stream map, by updating matching fields.
  530. // - A struct can be decoded from a stream array,
  531. // by updating fields as they occur in the struct (by index).
  532. //
  533. // When decoding a stream map or array with length of 0 into a nil map or slice,
  534. // we reset the destination map or slice to a zero-length value.
  535. //
  536. // However, when decoding a stream nil, we reset the destination container
  537. // to its "zero" value (e.g. nil for slice/map, etc).
  538. //
  539. func (d *Decoder) Decode(v interface{}) (err error) {
  540. defer panicToErr(&err)
  541. d.decode(v)
  542. return
  543. }
  544. func (d *Decoder) decode(iv interface{}) {
  545. d.d.initReadNext()
  546. switch v := iv.(type) {
  547. case nil:
  548. decErr("Cannot decode into nil.")
  549. case reflect.Value:
  550. d.chkPtrValue(v)
  551. d.decodeValue(v.Elem(), decFn{})
  552. case *string:
  553. *v = d.d.decodeString()
  554. case *bool:
  555. *v = d.d.decodeBool()
  556. case *int:
  557. *v = int(d.d.decodeInt(intBitsize))
  558. case *int8:
  559. *v = int8(d.d.decodeInt(8))
  560. case *int16:
  561. *v = int16(d.d.decodeInt(16))
  562. case *int32:
  563. *v = int32(d.d.decodeInt(32))
  564. case *int64:
  565. *v = d.d.decodeInt(64)
  566. case *uint:
  567. *v = uint(d.d.decodeUint(uintBitsize))
  568. case *uint8:
  569. *v = uint8(d.d.decodeUint(8))
  570. case *uint16:
  571. *v = uint16(d.d.decodeUint(16))
  572. case *uint32:
  573. *v = uint32(d.d.decodeUint(32))
  574. case *uint64:
  575. *v = d.d.decodeUint(64)
  576. case *float32:
  577. *v = float32(d.d.decodeFloat(true))
  578. case *float64:
  579. *v = d.d.decodeFloat(false)
  580. case *[]byte:
  581. *v, _ = d.d.decodeBytes(*v)
  582. case *interface{}:
  583. d.decodeValue(reflect.ValueOf(iv).Elem(), decFn{})
  584. default:
  585. rv := reflect.ValueOf(iv)
  586. d.chkPtrValue(rv)
  587. d.decodeValue(rv.Elem(), decFn{})
  588. }
  589. }
  590. func (d *Decoder) decodeValue(rv reflect.Value, fn decFn) {
  591. d.d.initReadNext()
  592. if d.d.tryDecodeAsNil() {
  593. // If value in stream is nil, set the dereferenced value to its "zero" value (if settable)
  594. if rv.Kind() == reflect.Ptr {
  595. if !rv.IsNil() {
  596. rv.Set(reflect.Zero(rv.Type()))
  597. }
  598. return
  599. }
  600. // for rv.Kind() == reflect.Ptr {
  601. // rv = rv.Elem()
  602. // }
  603. if rv.IsValid() { // rv.CanSet() // always settable, except it's invalid
  604. rv.Set(reflect.Zero(rv.Type()))
  605. }
  606. return
  607. }
  608. // If stream is not containing a nil value, then we can deref to the base
  609. // non-pointer value, and decode into that.
  610. for rv.Kind() == reflect.Ptr {
  611. if rv.IsNil() {
  612. rv.Set(reflect.New(rv.Type().Elem()))
  613. }
  614. rv = rv.Elem()
  615. }
  616. if fn.i == nil {
  617. fn = d.getDecFn(rv.Type())
  618. }
  619. fn.f(fn.i, rv)
  620. return
  621. }
  622. func (d *Decoder) getDecFn(rt reflect.Type) (fn decFn) {
  623. rtid := reflect.ValueOf(rt).Pointer()
  624. // retrieve or register a focus'ed function for this type
  625. // to eliminate need to do the retrieval multiple times
  626. // if d.f == nil && d.s == nil { debugf("---->Creating new dec f map for type: %v\n", rt) }
  627. var ok bool
  628. if useMapForCodecCache {
  629. fn, ok = d.f[rtid]
  630. } else {
  631. for i, v := range d.x {
  632. if v == rtid {
  633. fn, ok = d.s[i], true
  634. break
  635. }
  636. }
  637. }
  638. if !ok {
  639. // debugf("\tCreating new dec fn for type: %v\n", rt)
  640. fi := decFnInfo{ti: getTypeInfo(rtid, rt), d: d, dd: d.d}
  641. fn.i = &fi
  642. // An extension can be registered for any type, regardless of the Kind
  643. // (e.g. type BitSet int64, type MyStruct { / * unexported fields * / }, type X []int, etc.
  644. //
  645. // We can't check if it's an extension byte here first, because the user may have
  646. // registered a pointer or non-pointer type, meaning we may have to recurse first
  647. // before matching a mapped type, even though the extension byte is already detected.
  648. //
  649. // NOTE: if decoding into a nil interface{}, we return a non-nil
  650. // value except even if the container registers a length of 0.
  651. if rtid == rawExtTypId {
  652. fn.f = (*decFnInfo).rawExt
  653. } else if d.d.isBuiltinType(rtid) {
  654. fn.f = (*decFnInfo).builtin
  655. } else if xfTag, xfFn := d.h.getDecodeExt(rtid); xfFn != nil {
  656. fi.xfTag, fi.xfFn = xfTag, xfFn
  657. fn.f = (*decFnInfo).ext
  658. } else if supportBinaryMarshal && fi.ti.unm {
  659. fn.f = (*decFnInfo).binaryMarshal
  660. } else if xxf := fastDec(rtid); xxf != nil {
  661. fn.f = xxf
  662. // } else if xxf, xxok := fastpathsDec[rtid]; xxok {
  663. // fn.f = xxf
  664. } else {
  665. switch rk := rt.Kind(); rk {
  666. case reflect.String:
  667. fn.f = (*decFnInfo).kString
  668. case reflect.Bool:
  669. fn.f = (*decFnInfo).kBool
  670. case reflect.Int:
  671. fn.f = (*decFnInfo).kInt
  672. case reflect.Int64:
  673. fn.f = (*decFnInfo).kInt64
  674. case reflect.Int32:
  675. fn.f = (*decFnInfo).kInt32
  676. case reflect.Int8:
  677. fn.f = (*decFnInfo).kInt8
  678. case reflect.Int16:
  679. fn.f = (*decFnInfo).kInt16
  680. case reflect.Float32:
  681. fn.f = (*decFnInfo).kFloat32
  682. case reflect.Float64:
  683. fn.f = (*decFnInfo).kFloat64
  684. case reflect.Uint8:
  685. fn.f = (*decFnInfo).kUint8
  686. case reflect.Uint64:
  687. fn.f = (*decFnInfo).kUint64
  688. case reflect.Uint:
  689. fn.f = (*decFnInfo).kUint
  690. case reflect.Uint32:
  691. fn.f = (*decFnInfo).kUint32
  692. case reflect.Uint16:
  693. fn.f = (*decFnInfo).kUint16
  694. // case reflect.Ptr:
  695. // fn.f = (*decFnInfo).kPtr
  696. case reflect.Interface:
  697. fn.f = (*decFnInfo).kInterface
  698. case reflect.Struct:
  699. fn.f = (*decFnInfo).kStruct
  700. case reflect.Slice:
  701. fn.f = (*decFnInfo).kSlice
  702. case reflect.Array:
  703. fi.array = true
  704. fn.f = (*decFnInfo).kArray
  705. case reflect.Map:
  706. fn.f = (*decFnInfo).kMap
  707. default:
  708. fn.f = (*decFnInfo).kErr
  709. }
  710. }
  711. if useMapForCodecCache {
  712. if d.f == nil {
  713. d.f = make(map[uintptr]decFn, 16)
  714. }
  715. d.f[rtid] = fn
  716. } else {
  717. d.s = append(d.s, fn)
  718. d.x = append(d.x, rtid)
  719. }
  720. }
  721. return
  722. }
  723. func (d *Decoder) chkPtrValue(rv reflect.Value) {
  724. // We can only decode into a non-nil pointer
  725. if rv.Kind() == reflect.Ptr && !rv.IsNil() {
  726. return
  727. }
  728. if !rv.IsValid() {
  729. decErr("Cannot decode into a zero (ie invalid) reflect.Value")
  730. }
  731. if !rv.CanInterface() {
  732. decErr("Cannot decode into a value without an interface: %v", rv)
  733. }
  734. rvi := rv.Interface()
  735. decErr("Cannot decode into non-pointer or nil pointer. Got: %v, %T, %v",
  736. rv.Kind(), rvi, rvi)
  737. }
  738. func (d *Decoder) decEmbeddedField(rv reflect.Value, index []int) {
  739. // d.decodeValue(rv.FieldByIndex(index))
  740. // nil pointers may be here; so reproduce FieldByIndex logic + enhancements
  741. for _, j := range index {
  742. if rv.Kind() == reflect.Ptr {
  743. if rv.IsNil() {
  744. rv.Set(reflect.New(rv.Type().Elem()))
  745. }
  746. // If a pointer, it must be a pointer to struct (based on typeInfo contract)
  747. rv = rv.Elem()
  748. }
  749. rv = rv.Field(j)
  750. }
  751. d.decodeValue(rv, decFn{})
  752. }
  753. // --------------------------------------------------
  754. func decContLens(dd decDriver, currEncodedType valueType) (containerLen, containerLenS int) {
  755. if currEncodedType == valueTypeInvalid {
  756. currEncodedType = dd.currentEncodedType()
  757. }
  758. switch currEncodedType {
  759. case valueTypeArray:
  760. containerLen = dd.readArrayLen()
  761. containerLenS = containerLen
  762. case valueTypeMap:
  763. containerLen = dd.readMapLen()
  764. containerLenS = containerLen * 2
  765. default:
  766. decErr("Only encoded map or array can be decoded into a slice. (valueType: %0x)",
  767. currEncodedType)
  768. }
  769. return
  770. }
  771. func decErr(format string, params ...interface{}) {
  772. doPanic(msgTagDec, format, params...)
  773. }
  774. func fastDec(rtid uintptr) func(*decFnInfo, reflect.Value) {
  775. // Unfortunately, accessing an empty map is not free free.
  776. if fastpathEnabled {
  777. return fastpathsDec[rtid]
  778. }
  779. return nil
  780. }