decode.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612
  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. //"math"
  8. //"fmt"
  9. )
  10. // Some tagging information for error messages.
  11. var (
  12. msgTagDec = "codec.decoder"
  13. msgBadDesc = "Unrecognized descriptor byte"
  14. digits = [...]byte{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}
  15. )
  16. type decodeNakedContext uint8
  17. const (
  18. dncHandled decodeNakedContext = iota
  19. dncNil
  20. dncExt
  21. dncContainer
  22. )
  23. // decReader abstracts the reading source, allowing implementations that can
  24. // read from an io.Reader or directly off a byte slice with zero-copying.
  25. type decReader interface {
  26. readn(n int) []byte
  27. readb([]byte)
  28. readn1() uint8
  29. readUint16() uint16
  30. readUint32() uint32
  31. readUint64() uint64
  32. }
  33. type decDriver interface {
  34. initReadNext()
  35. currentIsNil() bool
  36. decodeBuiltinType(rt reflect.Type, rv reflect.Value) bool
  37. //decodeNaked should completely handle extensions, builtins, primitives, etc.
  38. //Numbers are decoded as int64, uint64, float64 only (no smaller sized number types).
  39. decodeNaked(h decodeHandleI) (rv reflect.Value, ctx decodeNakedContext)
  40. decodeInt(bitsize uint8) (i int64)
  41. decodeUint(bitsize uint8) (ui uint64)
  42. decodeFloat(chkOverflow32 bool) (f float64)
  43. decodeBool() (b bool)
  44. // decodeString can also decode symbols
  45. decodeString() (s string)
  46. decodeBytes(bs []byte) (bsOut []byte, changed bool)
  47. decodeExt(tag byte) []byte
  48. readMapLen() int
  49. readArrayLen() int
  50. }
  51. // A Decoder reads and decodes an object from an input stream in the codec format.
  52. type Decoder struct {
  53. r decReader
  54. d decDriver
  55. h decodeHandleI
  56. }
  57. // ioDecReader is a decReader that reads off an io.Reader
  58. type ioDecReader struct {
  59. r io.Reader
  60. x [8]byte //temp byte array re-used internally for efficiency
  61. }
  62. // bytesDecReader is a decReader that reads off a byte slice with zero copying
  63. type bytesDecReader struct {
  64. b []byte // data
  65. c int // cursor
  66. a int // available
  67. }
  68. type decExtTagFn struct {
  69. fn func(reflect.Value, []byte) error
  70. tag byte
  71. }
  72. type decExtTypeTagFn struct {
  73. rt reflect.Type
  74. decExtTagFn
  75. }
  76. type decodeHandleI interface {
  77. getDecodeExt(rt reflect.Type) (tag byte, fn func(reflect.Value, []byte) error)
  78. errorIfNoField() bool
  79. }
  80. type decHandle struct {
  81. // put word-aligned fields first (before bools, etc)
  82. exts []decExtTypeTagFn
  83. extFuncs map[reflect.Type]decExtTagFn
  84. // if an extension for byte slice is defined, then always decode Raw as strings
  85. rawToStringOverride bool
  86. }
  87. type DecodeOptions struct {
  88. // An instance of MapType is used during schema-less decoding of a map in the stream.
  89. // If nil, we use map[interface{}]interface{}
  90. MapType reflect.Type
  91. // An instance of SliceType is used during schema-less decoding of an array in the stream.
  92. // If nil, we use []interface{}
  93. SliceType reflect.Type
  94. // ErrorIfNoField controls whether an error is returned when decoding a map
  95. // from a codec stream into a struct, and no matching struct field is found.
  96. ErrorIfNoField bool
  97. }
  98. func (o *DecodeOptions) errorIfNoField() bool {
  99. return o.ErrorIfNoField
  100. }
  101. // addDecodeExt registers a function to handle decoding into a given type when an
  102. // extension type and specific tag byte is detected in the codec stream.
  103. // To remove an extension, pass fn=nil.
  104. func (o *decHandle) addDecodeExt(rt reflect.Type, tag byte, fn func(reflect.Value, []byte) error) {
  105. if o.exts == nil {
  106. o.exts = make([]decExtTypeTagFn, 0, 2)
  107. o.extFuncs = make(map[reflect.Type]decExtTagFn, 2)
  108. }
  109. if _, ok := o.extFuncs[rt]; ok {
  110. delete(o.extFuncs, rt)
  111. if rt == byteSliceTyp {
  112. o.rawToStringOverride = false
  113. }
  114. }
  115. if fn != nil {
  116. o.extFuncs[rt] = decExtTagFn{fn, tag}
  117. if rt == byteSliceTyp {
  118. o.rawToStringOverride = true
  119. }
  120. }
  121. if leno := len(o.extFuncs); leno > cap(o.exts) {
  122. o.exts = make([]decExtTypeTagFn, leno, (leno * 3 / 2))
  123. } else {
  124. o.exts = o.exts[0:leno]
  125. }
  126. var i int
  127. for k, v := range o.extFuncs {
  128. o.exts[i] = decExtTypeTagFn{k, v}
  129. i++
  130. }
  131. }
  132. func (o *decHandle) getDecodeExtForTag(tag byte) (rt reflect.Type, fn func(reflect.Value, []byte) error) {
  133. for i, l := 0, len(o.exts); i < l; i++ {
  134. if o.exts[i].tag == tag {
  135. return o.exts[i].rt, o.exts[i].fn
  136. }
  137. }
  138. return
  139. }
  140. func (o *decHandle) getDecodeExt(rt reflect.Type) (tag byte, fn func(reflect.Value, []byte) error) {
  141. if l := len(o.exts); l == 0 {
  142. return
  143. } else if l < mapAccessThreshold {
  144. for i := 0; i < l; i++ {
  145. if o.exts[i].rt == rt {
  146. x := o.exts[i].decExtTagFn
  147. return x.tag, x.fn
  148. }
  149. }
  150. } else {
  151. x := o.extFuncs[rt]
  152. return x.tag, x.fn
  153. }
  154. return
  155. }
  156. // NewDecoder returns a Decoder for decoding a stream of bytes from an io.Reader.
  157. func NewDecoder(r io.Reader, h Handle) *Decoder {
  158. z := ioDecReader{
  159. r: r,
  160. }
  161. return &Decoder{r: &z, d: h.newDecDriver(&z), h: h}
  162. }
  163. // NewDecoderBytes returns a Decoder which efficiently decodes directly
  164. // from a byte slice with zero copying.
  165. func NewDecoderBytes(in []byte, h Handle) *Decoder {
  166. z := bytesDecReader{
  167. b: in,
  168. a: len(in),
  169. }
  170. return &Decoder{r: &z, d: h.newDecDriver(&z), h: h}
  171. }
  172. // Decode decodes the stream from reader and stores the result in the
  173. // value pointed to by v. v cannot be a nil pointer. v can also be
  174. // a reflect.Value of a pointer.
  175. //
  176. // Note that a pointer to a nil interface is not a nil pointer.
  177. // If you do not know what type of stream it is, pass in a pointer to a nil interface.
  178. // We will decode and store a value in that nil interface.
  179. //
  180. // Sample usages:
  181. // // Decoding into a non-nil typed value
  182. // var f float32
  183. // err = codec.NewDecoder(r, handle).Decode(&f)
  184. //
  185. // // Decoding into nil interface
  186. // var v interface{}
  187. // dec := codec.NewDecoder(r, handle)
  188. // err = dec.Decode(&v)
  189. //
  190. func (d *Decoder) Decode(v interface{}) (err error) {
  191. defer panicToErr(&err)
  192. d.decode(v)
  193. return
  194. }
  195. func (d *Decoder) decode(iv interface{}) {
  196. d.d.initReadNext()
  197. // Fast path included for various pointer types which cannot be registered as extensions
  198. switch v := iv.(type) {
  199. case nil:
  200. decErr("Cannot decode into nil.")
  201. case reflect.Value:
  202. d.chkPtrValue(v)
  203. d.decodeValue(v)
  204. case *string:
  205. *v = d.d.decodeString()
  206. case *bool:
  207. *v = d.d.decodeBool()
  208. case *int:
  209. *v = int(d.d.decodeInt(intBitsize))
  210. case *int8:
  211. *v = int8(d.d.decodeInt(8))
  212. case *int16:
  213. *v = int16(d.d.decodeInt(16))
  214. case *int32:
  215. *v = int32(d.d.decodeInt(32))
  216. case *int64:
  217. *v = int64(d.d.decodeInt(64))
  218. case *uint:
  219. *v = uint(d.d.decodeUint(uintBitsize))
  220. case *uint8:
  221. *v = uint8(d.d.decodeUint(8))
  222. case *uint16:
  223. *v = uint16(d.d.decodeUint(16))
  224. case *uint32:
  225. *v = uint32(d.d.decodeUint(32))
  226. case *uint64:
  227. *v = uint64(d.d.decodeUint(64))
  228. case *float32:
  229. *v = float32(d.d.decodeFloat(true))
  230. case *float64:
  231. *v = d.d.decodeFloat(false)
  232. case *interface{}:
  233. d.decodeValue(reflect.ValueOf(iv).Elem())
  234. default:
  235. rv := reflect.ValueOf(iv)
  236. d.chkPtrValue(rv)
  237. d.decodeValue(rv)
  238. }
  239. }
  240. func (d *Decoder) decodeValue(rv reflect.Value) {
  241. // Note: if stream is set to nil, we set the corresponding value to its "zero" value
  242. // var ctr int (define this above the function if trying to do this run)
  243. // ctr++
  244. // log(".. [%v] enter decode: rv: %v <==> %T <==> %v", ctr, rv, rv.Interface(), rv.Interface())
  245. // defer func(ctr2 int) {
  246. // log(".... [%v] exit decode: rv: %v <==> %T <==> %v", ctr2, rv, rv.Interface(), rv.Interface())
  247. // }(ctr)
  248. dd := d.d //so we don't dereference constantly
  249. dd.initReadNext()
  250. rvOrig := rv
  251. wasNilIntf := rv.Kind() == reflect.Interface && rv.IsNil()
  252. rt := rv.Type()
  253. var ndesc decodeNakedContext
  254. //if nil interface, use some hieristics to set the nil interface to an
  255. //appropriate value based on the first byte read (byte descriptor bd)
  256. if wasNilIntf {
  257. if dd.currentIsNil() {
  258. return
  259. }
  260. //Prevent from decoding into e.g. error, io.Reader, etc if it's nil and non-nil value in stream.
  261. //We can only decode into interface{} (0 methods). Else reflect.Set fails later.
  262. if num := rt.NumMethod(); num > 0 {
  263. decErr("decodeValue: Cannot decode non-nil codec value into nil %v (%v methods)", rt, num)
  264. } else {
  265. rv, ndesc = dd.decodeNaked(d.h)
  266. if ndesc == dncHandled {
  267. rvOrig.Set(rv)
  268. return
  269. }
  270. rt = rv.Type()
  271. }
  272. } else if dd.currentIsNil() {
  273. // Note: if stream is set to nil, we set the dereferenced value to its "zero" value (if settable).
  274. for rv.Kind() == reflect.Ptr {
  275. rv = rv.Elem()
  276. }
  277. if rv.CanSet() {
  278. rv.Set(reflect.Zero(rv.Type()))
  279. }
  280. return
  281. }
  282. // An extension can be registered for any type, regardless of the Kind
  283. // (e.g. type BitSet int64, type MyStruct { / * unexported fields * / }, type X []int, etc.
  284. //
  285. // We can't check if it's an extension byte here first, because the user may have
  286. // registered a pointer or non-pointer type, meaning we may have to recurse first
  287. // before matching a mapped type, even though the extension byte is already detected.
  288. //
  289. // If we are checking for builtin or ext type here, it means we didn't go through decodeNaked,
  290. // Because decodeNaked would have handled it. It also means wasNilIntf = false.
  291. if dd.decodeBuiltinType(rt, rv) {
  292. return
  293. }
  294. if bfnTag, bfnFn := d.h.getDecodeExt(rt); bfnFn != nil {
  295. xbs := dd.decodeExt(bfnTag)
  296. if fnerr := bfnFn(rv, xbs); fnerr != nil {
  297. panic(fnerr)
  298. }
  299. return
  300. }
  301. // Note: In decoding into containers, we just use the stream to UPDATE the container.
  302. // This means that for a struct or map, we just update matching fields or keys.
  303. // For a slice/array, we just update the first n elements, where n is the length of the
  304. // stream.
  305. // However, if the encoded value is Nil in the stream, then we try to set
  306. // to nil, or a "zero" value.
  307. //
  308. // Also, we must ensure that, if decoding into a nil interface{}, we return a non-nil
  309. // value except even if the container registers a length of 0.
  310. //
  311. // NOTE: Do not make blocks for struct, slice, map, etc individual methods.
  312. // It ends up being more expensive, because they recursively calls decodeValue
  313. //
  314. // (Mar 7, 2013. DON'T REARRANGE ... code clarity)
  315. // tried arranging in sequence of most probable ones.
  316. // string, bool, integer, float, struct, ptr, slice, array, map, interface, uint.
  317. switch rk := rv.Kind(); rk {
  318. case reflect.String:
  319. rv.SetString(dd.decodeString())
  320. case reflect.Bool:
  321. rv.SetBool(dd.decodeBool())
  322. case reflect.Int:
  323. rv.SetInt(dd.decodeInt(intBitsize))
  324. case reflect.Int64:
  325. rv.SetInt(dd.decodeInt(64))
  326. case reflect.Int32:
  327. rv.SetInt(dd.decodeInt(32))
  328. case reflect.Int8:
  329. rv.SetInt(dd.decodeInt(8))
  330. case reflect.Int16:
  331. rv.SetInt(dd.decodeInt(16))
  332. case reflect.Float32:
  333. rv.SetFloat(dd.decodeFloat(true))
  334. case reflect.Float64:
  335. rv.SetFloat(dd.decodeFloat(false))
  336. case reflect.Uint8:
  337. rv.SetUint(dd.decodeUint(8))
  338. case reflect.Uint64:
  339. rv.SetUint(dd.decodeUint(64))
  340. case reflect.Uint:
  341. rv.SetUint(dd.decodeUint(uintBitsize))
  342. case reflect.Uint32:
  343. rv.SetUint(dd.decodeUint(32))
  344. case reflect.Uint16:
  345. rv.SetUint(dd.decodeUint(16))
  346. case reflect.Ptr:
  347. if rv.IsNil() {
  348. if wasNilIntf {
  349. rv = reflect.New(rt.Elem())
  350. } else {
  351. rv.Set(reflect.New(rt.Elem()))
  352. }
  353. }
  354. d.decodeValue(rv.Elem())
  355. case reflect.Interface:
  356. d.decodeValue(rv.Elem())
  357. case reflect.Struct:
  358. containerLen := dd.readMapLen()
  359. if containerLen == 0 {
  360. break
  361. }
  362. sfi := getStructFieldInfos(rt)
  363. for j := 0; j < containerLen; j++ {
  364. // var rvkencname string
  365. // ddecode(&rvkencname)
  366. dd.initReadNext()
  367. rvkencname := dd.decodeString()
  368. // rvksi := sfi.getForEncName(rvkencname)
  369. if k := sfi.indexForEncName(rvkencname); k > -1 {
  370. sfik := sfi[k]
  371. if sfik.i > -1 {
  372. d.decodeValue(rv.Field(int(sfik.i)))
  373. } else {
  374. d.decodeValue(rv.FieldByIndex(sfik.is))
  375. }
  376. // d.decodeValue(sfi.field(k, rv))
  377. } else {
  378. if d.h.errorIfNoField() {
  379. decErr("No matching struct field found when decoding stream map with key: %v", rvkencname)
  380. } else {
  381. var nilintf0 interface{}
  382. d.decodeValue(reflect.ValueOf(&nilintf0).Elem())
  383. }
  384. }
  385. }
  386. case reflect.Slice:
  387. // Be more careful calling Set() here, because a reflect.Value from an array
  388. // may have come in here (which may not be settable).
  389. // In places where the slice got from an array could be, we should guard with CanSet() calls.
  390. if rt == byteSliceTyp { // rawbytes
  391. if bs2, changed2 := dd.decodeBytes(rv.Bytes()); changed2 {
  392. rv.SetBytes(bs2)
  393. }
  394. if wasNilIntf && rv.IsNil() {
  395. rv.SetBytes([]byte{})
  396. }
  397. break
  398. }
  399. containerLen := dd.readArrayLen()
  400. if wasNilIntf {
  401. rv = reflect.MakeSlice(rt, containerLen, containerLen)
  402. }
  403. if containerLen == 0 {
  404. break
  405. }
  406. if rv.IsNil() {
  407. // wasNilIntf only applies if rv is nil (since that's what we did earlier)
  408. if containerLen > 0 {
  409. rv.Set(reflect.MakeSlice(rt, containerLen, containerLen))
  410. }
  411. } else {
  412. // if we need to reset rv but it cannot be set, we should err out.
  413. // for example, if slice is got from unaddressable array, CanSet = false
  414. if rvcap, rvlen := rv.Len(), rv.Cap(); containerLen > rvcap {
  415. if rv.CanSet() {
  416. rvn := reflect.MakeSlice(rt, containerLen, containerLen)
  417. if rvlen > 0 {
  418. reflect.Copy(rvn, rv)
  419. }
  420. rv.Set(rvn)
  421. } else {
  422. decErr("Cannot reset slice with less cap: %v that stream contents: %v", rvcap, containerLen)
  423. }
  424. } else if containerLen > rvlen {
  425. rv.SetLen(containerLen)
  426. }
  427. }
  428. for j := 0; j < containerLen; j++ {
  429. d.decodeValue(rv.Index(j))
  430. }
  431. case reflect.Array:
  432. d.decodeValue(rv.Slice(0, rv.Len()))
  433. case reflect.Map:
  434. containerLen := dd.readMapLen()
  435. if containerLen == 0 {
  436. break
  437. }
  438. if rv.IsNil() {
  439. rv.Set(reflect.MakeMap(rt))
  440. }
  441. ktype, vtype := rt.Key(), rt.Elem()
  442. for j := 0; j < containerLen; j++ {
  443. rvk := reflect.New(ktype).Elem()
  444. d.decodeValue(rvk)
  445. if ktype == intfTyp {
  446. rvk = rvk.Elem()
  447. if rvk.Type() == byteSliceTyp {
  448. rvk = reflect.ValueOf(string(rvk.Bytes()))
  449. }
  450. }
  451. rvv := rv.MapIndex(rvk)
  452. if !rvv.IsValid() {
  453. rvv = reflect.New(vtype).Elem()
  454. }
  455. d.decodeValue(rvv)
  456. rv.SetMapIndex(rvk, rvv)
  457. }
  458. default:
  459. decErr("Unhandled value for kind: %v: %s", rk, msgBadDesc)
  460. }
  461. if wasNilIntf {
  462. rvOrig.Set(rv)
  463. }
  464. return
  465. }
  466. func (d *Decoder) chkPtrValue(rv reflect.Value) {
  467. // We cannot marshal into a non-pointer or a nil pointer
  468. // (at least pass a nil interface so we can marshal into it)
  469. if rv.Kind() != reflect.Ptr || rv.IsNil() {
  470. var rvi interface{} = rv
  471. if rv.IsValid() && rv.CanInterface() {
  472. rvi = rv.Interface()
  473. }
  474. decErr("Decode: Expecting valid pointer to decode into. Got: %v, %T, %v",
  475. rv.Kind(), rvi, rvi)
  476. }
  477. }
  478. // ------------------------------------
  479. func (z *ioDecReader) readn(n int) (bs []byte) {
  480. bs = make([]byte, n)
  481. if _, err := io.ReadFull(z.r, bs); err != nil {
  482. panic(err)
  483. }
  484. return
  485. }
  486. func (z *ioDecReader) readb(bs []byte) {
  487. if _, err := io.ReadFull(z.r, bs); err != nil {
  488. panic(err)
  489. }
  490. }
  491. func (z *ioDecReader) readn1() uint8 {
  492. z.readb(z.x[:1])
  493. return z.x[0]
  494. }
  495. func (z *ioDecReader) readUint16() uint16 {
  496. z.readb(z.x[:2])
  497. return bigen.Uint16(z.x[:2])
  498. }
  499. func (z *ioDecReader) readUint32() uint32 {
  500. z.readb(z.x[:4])
  501. return bigen.Uint32(z.x[:4])
  502. }
  503. func (z *ioDecReader) readUint64() uint64 {
  504. z.readb(z.x[:8])
  505. return bigen.Uint64(z.x[:8])
  506. }
  507. // ------------------------------------
  508. func (z *bytesDecReader) consume(n int) (oldcursor int) {
  509. if z.a == 0 {
  510. panic(io.EOF)
  511. }
  512. if n > z.a {
  513. doPanic(msgTagDec, "Trying to read %v bytes. Only %v available", n, z.a)
  514. }
  515. // z.checkAvailable(n)
  516. oldcursor = z.c
  517. z.c = oldcursor + n
  518. z.a = z.a - n
  519. return
  520. }
  521. func (z *bytesDecReader) readn(n int) (bs []byte) {
  522. c0 := z.consume(n)
  523. bs = z.b[c0:z.c]
  524. return
  525. }
  526. func (z *bytesDecReader) readb(bs []byte) {
  527. copy(bs, z.readn(len(bs)))
  528. }
  529. func (z *bytesDecReader) readn1() uint8 {
  530. c0 := z.consume(1)
  531. return z.b[c0]
  532. }
  533. // Use binaryEncoding helper for 4 and 8 bits, but inline it for 2 bits
  534. // creating temp slice variable and copying it to helper function is expensive
  535. // for just 2 bits.
  536. func (z *bytesDecReader) readUint16() uint16 {
  537. c0 := z.consume(2)
  538. return uint16(z.b[c0+1]) | uint16(z.b[c0])<<8
  539. }
  540. func (z *bytesDecReader) readUint32() uint32 {
  541. c0 := z.consume(4)
  542. return bigen.Uint32(z.b[c0:z.c])
  543. }
  544. func (z *bytesDecReader) readUint64() uint64 {
  545. c0 := z.consume(8)
  546. return bigen.Uint64(z.b[c0:z.c])
  547. }
  548. // ----------------------------------------
  549. func decErr(format string, params ...interface{}) {
  550. doPanic(msgTagDec, format, params...)
  551. }