decode.go 24 KB

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