decode.go 26 KB

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