decode.go 24 KB

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