decode.go 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513
  1. // Copyright (c) 2012-2015 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. "encoding"
  6. "errors"
  7. "fmt"
  8. "io"
  9. "reflect"
  10. )
  11. // Some tagging information for error messages.
  12. const (
  13. msgTagDec = "codec.decoder"
  14. msgBadDesc = "Unrecognized descriptor byte"
  15. msgDecCannotExpandArr = "cannot expand go array from %v to stream length: %v"
  16. )
  17. var (
  18. onlyMapOrArrayCanDecodeIntoStructErr = errors.New("only encoded map or array can be decoded into a struct")
  19. cannotDecodeIntoNilErr = errors.New("cannot decode into nil")
  20. )
  21. // decReader abstracts the reading source, allowing implementations that can
  22. // read from an io.Reader or directly off a byte slice with zero-copying.
  23. type decReader interface {
  24. // TODO:
  25. // Add method to get num bytes read.
  26. // This will be used to annotate errors, so user knows at what point the error occurred.
  27. unreadn1()
  28. // readx will use the implementation scratch buffer if possible i.e. n < len(scratchbuf), OR
  29. // just return a view of the []byte being decoded from.
  30. // Ensure you call detachZeroCopyBytes later if this needs to be sent outside codec control.
  31. readx(n int) []byte
  32. readb([]byte)
  33. readn1() uint8
  34. readn1eof() (v uint8, eof bool)
  35. }
  36. type decReaderByteScanner interface {
  37. io.Reader
  38. io.ByteScanner
  39. }
  40. type decDriver interface {
  41. // this will check if the next token is a break.
  42. CheckBreak() bool
  43. TryDecodeAsNil() bool
  44. // check if a container type: vt is one of: Bytes, String, Nil, Slice or Map.
  45. // if vt param == valueTypeNil, and nil is seen in stream, consume the nil.
  46. IsContainerType(vt valueType) bool
  47. IsBuiltinType(rt uintptr) bool
  48. DecodeBuiltin(rt uintptr, v interface{})
  49. //decodeNaked: Numbers are decoded as int64, uint64, float64 only (no smaller sized number types).
  50. //for extensions, decodeNaked must completely decode them as a *RawExt.
  51. //extensions should also use readx to decode them, for efficiency.
  52. //kInterface will extract the detached byte slice if it has to pass it outside its realm.
  53. DecodeNaked() (v interface{}, vt valueType, decodeFurther bool)
  54. DecodeInt(bitsize uint8) (i int64)
  55. DecodeUint(bitsize uint8) (ui uint64)
  56. DecodeFloat(chkOverflow32 bool) (f float64)
  57. DecodeBool() (b bool)
  58. // DecodeString can also decode symbols.
  59. // It looks redundant as DecodeBytes is available.
  60. // However, some codecs (e.g. binc) support symbols and can
  61. // return a pre-stored string value, meaning that it can bypass
  62. // the cost of []byte->string conversion.
  63. DecodeString() (s string)
  64. // DecodeBytes may be called directly, without going through reflection.
  65. // Consequently, it must be designed to handle possible nil.
  66. DecodeBytes(bs []byte, isstring, zerocopy bool) (bsOut []byte)
  67. // decodeExt will decode into a *RawExt or into an extension.
  68. DecodeExt(v interface{}, xtag uint64, ext Ext) (realxtag uint64)
  69. // decodeExt(verifyTag bool, tag byte) (xtag byte, xbs []byte)
  70. ReadMapStart() int
  71. ReadArrayStart() int
  72. ReadMapEnd()
  73. ReadArrayEnd()
  74. ReadArrayEntrySeparator()
  75. ReadMapEntrySeparator()
  76. ReadMapKVSeparator()
  77. }
  78. type decNoSeparator struct{}
  79. func (_ decNoSeparator) ReadMapEnd() {}
  80. func (_ decNoSeparator) ReadArrayEnd() {}
  81. func (_ decNoSeparator) ReadArrayEntrySeparator() {}
  82. func (_ decNoSeparator) ReadMapEntrySeparator() {}
  83. func (_ decNoSeparator) ReadMapKVSeparator() {}
  84. type DecodeOptions struct {
  85. // MapType specifies type to use during schema-less decoding of a map in the stream.
  86. // If nil, we use map[interface{}]interface{}
  87. MapType reflect.Type
  88. // SliceType specifies type to use during schema-less decoding of an array in the stream.
  89. // If nil, we use []interface{}
  90. SliceType reflect.Type
  91. // If ErrorIfNoField, return an error when decoding a map
  92. // from a codec stream into a struct, and no matching struct field is found.
  93. ErrorIfNoField bool
  94. // If ErrorIfNoArrayExpand, return an error when decoding a slice/array that cannot be expanded.
  95. // For example, the stream contains an array of 8 items, but you are decoding into a [4]T array,
  96. // or you are decoding into a slice of length 4 which is non-addressable (and so cannot be set).
  97. ErrorIfNoArrayExpand bool
  98. // If SignedInteger, use the int64 during schema-less decoding of unsigned values (not uint64).
  99. SignedInteger bool
  100. }
  101. // ------------------------------------
  102. // ioDecByteScanner implements Read(), ReadByte(...), UnreadByte(...) methods
  103. // of io.Reader, io.ByteScanner.
  104. type ioDecByteScanner struct {
  105. r io.Reader
  106. l byte // last byte
  107. ls byte // last byte status. 0: init-canDoNothing, 1: canRead, 2: canUnread
  108. b [1]byte // tiny buffer for reading single bytes
  109. }
  110. func (z *ioDecByteScanner) Read(p []byte) (n int, err error) {
  111. var firstByte bool
  112. if z.ls == 1 {
  113. z.ls = 2
  114. p[0] = z.l
  115. if len(p) == 1 {
  116. n = 1
  117. return
  118. }
  119. firstByte = true
  120. p = p[1:]
  121. }
  122. n, err = z.r.Read(p)
  123. if n > 0 {
  124. z.l = p[n-1]
  125. z.ls = 2
  126. }
  127. if firstByte {
  128. n++
  129. }
  130. return
  131. }
  132. func (z *ioDecByteScanner) ReadByte() (c byte, err error) {
  133. n, err := z.Read(z.b[:])
  134. if n == 1 {
  135. c = z.b[0]
  136. }
  137. return
  138. }
  139. func (z *ioDecByteScanner) UnreadByte() (err error) {
  140. x := z.ls
  141. if x == 0 {
  142. err = errors.New("cannot unread - nothing has been read")
  143. } else if x == 1 {
  144. err = errors.New("cannot unread - last byte has not been read")
  145. } else if x == 2 {
  146. z.ls = 1
  147. }
  148. return
  149. }
  150. // ioDecReader is a decReader that reads off an io.Reader
  151. type ioDecReader struct {
  152. br decReaderByteScanner
  153. // temp byte array re-used internally for efficiency during read.
  154. // shares buffer with Decoder, so we keep size of struct within 8 words.
  155. x *[scratchByteArrayLen]byte
  156. bs ioDecByteScanner
  157. }
  158. func (z *ioDecReader) readx(n int) (bs []byte) {
  159. if n <= 0 {
  160. return
  161. }
  162. if n < len(z.x) {
  163. bs = z.x[:n]
  164. } else {
  165. bs = make([]byte, n)
  166. }
  167. if _, err := io.ReadAtLeast(z.br, bs, n); err != nil {
  168. panic(err)
  169. }
  170. return
  171. }
  172. func (z *ioDecReader) readb(bs []byte) {
  173. if len(bs) == 0 {
  174. return
  175. }
  176. if _, err := io.ReadAtLeast(z.br, bs, len(bs)); err != nil {
  177. panic(err)
  178. }
  179. }
  180. func (z *ioDecReader) readn1() (b uint8) {
  181. b, err := z.br.ReadByte()
  182. if err != nil {
  183. panic(err)
  184. }
  185. return b
  186. }
  187. func (z *ioDecReader) readn1eof() (b uint8, eof bool) {
  188. b, err := z.br.ReadByte()
  189. if err == nil {
  190. } else if err == io.EOF {
  191. eof = true
  192. } else {
  193. panic(err)
  194. }
  195. return
  196. }
  197. func (z *ioDecReader) unreadn1() {
  198. if err := z.br.UnreadByte(); err != nil {
  199. panic(err)
  200. }
  201. }
  202. // ------------------------------------
  203. var bytesDecReaderCannotUnreadErr = errors.New("cannot unread last byte read")
  204. // bytesDecReader is a decReader that reads off a byte slice with zero copying
  205. type bytesDecReader struct {
  206. b []byte // data
  207. c int // cursor
  208. a int // available
  209. }
  210. func (z *bytesDecReader) unreadn1() {
  211. if z.c == 0 || len(z.b) == 0 {
  212. panic(bytesDecReaderCannotUnreadErr)
  213. }
  214. z.c--
  215. z.a++
  216. return
  217. }
  218. func (z *bytesDecReader) readx(n int) (bs []byte) {
  219. // slicing from a non-constant start position is more expensive,
  220. // as more computation is required to decipher the pointer start position.
  221. // However, we do it only once, and it's better than reslicing both z.b and return value.
  222. if n <= 0 {
  223. } else if z.a == 0 {
  224. panic(io.EOF)
  225. } else if n > z.a {
  226. panic(io.ErrUnexpectedEOF)
  227. } else {
  228. c0 := z.c
  229. z.c = c0 + n
  230. z.a = z.a - n
  231. bs = z.b[c0:z.c]
  232. }
  233. return
  234. }
  235. func (z *bytesDecReader) readn1() (v uint8) {
  236. if z.a == 0 {
  237. panic(io.EOF)
  238. }
  239. v = z.b[z.c]
  240. z.c++
  241. z.a--
  242. return
  243. }
  244. func (z *bytesDecReader) readn1eof() (v uint8, eof bool) {
  245. if z.a == 0 {
  246. eof = true
  247. return
  248. }
  249. v = z.b[z.c]
  250. z.c++
  251. z.a--
  252. return
  253. }
  254. func (z *bytesDecReader) readb(bs []byte) {
  255. copy(bs, z.readx(len(bs)))
  256. }
  257. // ------------------------------------
  258. type decFnInfoX struct {
  259. d *Decoder
  260. ti *typeInfo
  261. xfFn Ext
  262. xfTag uint64
  263. array bool
  264. }
  265. // decFnInfo has methods for handling decoding of a specific type
  266. // based on some characteristics (builtin, extension, reflect Kind, etc)
  267. type decFnInfo struct {
  268. // use decFnInfo as a value receiver.
  269. // keep most of it less-used variables accessible via a pointer (*decFnInfoX).
  270. // As sweet spot for value-receiver is 3 words, keep everything except
  271. // decDriver (which everyone needs) directly accessible.
  272. // ensure decFnInfoX is set for everyone who needs it i.e.
  273. // rawExt, ext, builtin, (selfer|binary|text)Marshal, kSlice, kStruct, kMap, kInterface, fastpath
  274. dd decDriver
  275. *decFnInfoX
  276. }
  277. // ----------------------------------------
  278. type decFn struct {
  279. i decFnInfo
  280. f func(decFnInfo, reflect.Value)
  281. }
  282. func (f decFnInfo) builtin(rv reflect.Value) {
  283. f.dd.DecodeBuiltin(f.ti.rtid, rv.Addr().Interface())
  284. }
  285. func (f decFnInfo) rawExt(rv reflect.Value) {
  286. f.dd.DecodeExt(rv.Addr().Interface(), 0, nil)
  287. }
  288. func (f decFnInfo) ext(rv reflect.Value) {
  289. f.dd.DecodeExt(rv.Addr().Interface(), f.xfTag, f.xfFn)
  290. }
  291. func (f decFnInfo) getValueForUnmarshalInterface(rv reflect.Value, indir int8) (v interface{}) {
  292. if indir == -1 {
  293. v = rv.Addr().Interface()
  294. } else if indir == 0 {
  295. v = rv.Interface()
  296. } else {
  297. for j := int8(0); j < indir; j++ {
  298. if rv.IsNil() {
  299. rv.Set(reflect.New(rv.Type().Elem()))
  300. }
  301. rv = rv.Elem()
  302. }
  303. v = rv.Interface()
  304. }
  305. return
  306. }
  307. func (f decFnInfo) selferUnmarshal(rv reflect.Value) {
  308. f.getValueForUnmarshalInterface(rv, f.ti.csIndir).(Selfer).CodecDecodeSelf(f.d)
  309. }
  310. func (f decFnInfo) binaryUnmarshal(rv reflect.Value) {
  311. bm := f.getValueForUnmarshalInterface(rv, f.ti.bunmIndir).(encoding.BinaryUnmarshaler)
  312. xbs := f.dd.DecodeBytes(nil, false, true)
  313. if fnerr := bm.UnmarshalBinary(xbs); fnerr != nil {
  314. panic(fnerr)
  315. }
  316. }
  317. func (f decFnInfo) textUnmarshal(rv reflect.Value) {
  318. tm := f.getValueForUnmarshalInterface(rv, f.ti.tunmIndir).(encoding.TextUnmarshaler)
  319. fnerr := tm.UnmarshalText(f.dd.DecodeBytes(f.d.b[:], true, true))
  320. // fnerr := tm.UnmarshalText(f.dd.DecodeStringAsBytes(f.d.b[:]))
  321. // var fnerr error
  322. // if sb, sbok := f.dd.(decDriverStringAsBytes); sbok {
  323. // fnerr = tm.UnmarshalText(sb.decStringAsBytes(f.d.b[:0]))
  324. // } else {
  325. // fnerr = tm.UnmarshalText([]byte(f.dd.decodeString()))
  326. // }
  327. if fnerr != nil {
  328. panic(fnerr)
  329. }
  330. }
  331. func (f decFnInfo) kErr(rv reflect.Value) {
  332. f.d.errorf("no decoding function defined for kind %v", rv.Kind())
  333. }
  334. func (f decFnInfo) kString(rv reflect.Value) {
  335. rv.SetString(f.dd.DecodeString())
  336. }
  337. func (f decFnInfo) kBool(rv reflect.Value) {
  338. rv.SetBool(f.dd.DecodeBool())
  339. }
  340. func (f decFnInfo) kInt(rv reflect.Value) {
  341. rv.SetInt(f.dd.DecodeInt(intBitsize))
  342. }
  343. func (f decFnInfo) kInt64(rv reflect.Value) {
  344. rv.SetInt(f.dd.DecodeInt(64))
  345. }
  346. func (f decFnInfo) kInt32(rv reflect.Value) {
  347. rv.SetInt(f.dd.DecodeInt(32))
  348. }
  349. func (f decFnInfo) kInt8(rv reflect.Value) {
  350. rv.SetInt(f.dd.DecodeInt(8))
  351. }
  352. func (f decFnInfo) kInt16(rv reflect.Value) {
  353. rv.SetInt(f.dd.DecodeInt(16))
  354. }
  355. func (f decFnInfo) kFloat32(rv reflect.Value) {
  356. rv.SetFloat(f.dd.DecodeFloat(true))
  357. }
  358. func (f decFnInfo) kFloat64(rv reflect.Value) {
  359. rv.SetFloat(f.dd.DecodeFloat(false))
  360. }
  361. func (f decFnInfo) kUint8(rv reflect.Value) {
  362. rv.SetUint(f.dd.DecodeUint(8))
  363. }
  364. func (f decFnInfo) kUint64(rv reflect.Value) {
  365. rv.SetUint(f.dd.DecodeUint(64))
  366. }
  367. func (f decFnInfo) kUint(rv reflect.Value) {
  368. rv.SetUint(f.dd.DecodeUint(uintBitsize))
  369. }
  370. func (f decFnInfo) kUint32(rv reflect.Value) {
  371. rv.SetUint(f.dd.DecodeUint(32))
  372. }
  373. func (f decFnInfo) kUint16(rv reflect.Value) {
  374. rv.SetUint(f.dd.DecodeUint(16))
  375. }
  376. // func (f decFnInfo) kPtr(rv reflect.Value) {
  377. // debugf(">>>>>>> ??? decode kPtr called - shouldn't get called")
  378. // if rv.IsNil() {
  379. // rv.Set(reflect.New(rv.Type().Elem()))
  380. // }
  381. // f.d.decodeValue(rv.Elem())
  382. // }
  383. // var kIntfCtr uint64
  384. func (f decFnInfo) kInterfaceNaked() (rvn reflect.Value) {
  385. // nil interface:
  386. // use some hieristics to decode it appropriately
  387. // based on the detected next value in the stream.
  388. v, vt, decodeFurther := f.dd.DecodeNaked()
  389. if vt == valueTypeNil {
  390. return
  391. }
  392. // We cannot decode non-nil stream value into nil interface with methods (e.g. io.Reader).
  393. if num := f.ti.rt.NumMethod(); num > 0 {
  394. f.d.errorf("cannot decode non-nil codec value into nil %v (%v methods)", f.ti.rt, num)
  395. return
  396. }
  397. var useRvn bool
  398. switch vt {
  399. case valueTypeMap:
  400. if f.d.h.MapType == nil {
  401. var m2 map[interface{}]interface{}
  402. v = &m2
  403. } else {
  404. rvn = reflect.New(f.d.h.MapType).Elem()
  405. useRvn = true
  406. }
  407. case valueTypeArray:
  408. if f.d.h.SliceType == nil {
  409. var m2 []interface{}
  410. v = &m2
  411. } else {
  412. rvn = reflect.New(f.d.h.SliceType).Elem()
  413. useRvn = true
  414. }
  415. case valueTypeExt:
  416. re := v.(*RawExt)
  417. bfn := f.d.h.getExtForTag(re.Tag)
  418. if bfn == nil {
  419. re.Data = detachZeroCopyBytes(f.d.bytes, nil, re.Data)
  420. rvn = reflect.ValueOf(*re)
  421. } else {
  422. rvnA := reflect.New(bfn.rt)
  423. rvn = rvnA.Elem()
  424. if re.Data != nil {
  425. bfn.ext.ReadExt(rvnA.Interface(), re.Data)
  426. } else {
  427. bfn.ext.UpdateExt(rvnA.Interface(), re.Value)
  428. }
  429. }
  430. return
  431. }
  432. if decodeFurther {
  433. if useRvn {
  434. f.d.decodeValue(rvn, decFn{})
  435. } else if v != nil {
  436. // this v is a pointer, so we need to dereference it when done
  437. f.d.decode(v)
  438. rvn = reflect.ValueOf(v).Elem()
  439. useRvn = true
  440. }
  441. }
  442. if !useRvn && v != nil {
  443. rvn = reflect.ValueOf(v)
  444. }
  445. return
  446. }
  447. func (f decFnInfo) kInterface(rv reflect.Value) {
  448. // debugf("\t===> kInterface")
  449. // Note:
  450. // A consequence of how kInterface works, is that
  451. // if an interface already contains something, we try
  452. // to decode into what was there before.
  453. // We do not replace with a generic value (as got from decodeNaked).
  454. if rv.IsNil() {
  455. rvn := f.kInterfaceNaked()
  456. if rvn.IsValid() {
  457. rv.Set(rvn)
  458. }
  459. } else {
  460. rve := rv.Elem()
  461. // Note: interface{} is settable, but underlying type may not be.
  462. // Consequently, we have to set the reflect.Value directly.
  463. // if underlying type is settable (e.g. ptr or interface),
  464. // we just decode into it.
  465. // Else we create a settable value, decode into it, and set on the interface.
  466. if rve.CanSet() {
  467. f.d.decodeValue(rve, decFn{})
  468. } else {
  469. rve2 := reflect.New(rve.Type()).Elem()
  470. rve2.Set(rve)
  471. f.d.decodeValue(rve2, decFn{})
  472. rv.Set(rve2)
  473. }
  474. }
  475. }
  476. func (f decFnInfo) kStruct(rv reflect.Value) {
  477. fti := f.ti
  478. d := f.d
  479. if f.dd.IsContainerType(valueTypeMap) {
  480. containerLen := f.dd.ReadMapStart()
  481. if containerLen == 0 {
  482. f.dd.ReadMapEnd()
  483. return
  484. }
  485. tisfi := fti.sfi
  486. hasLen := containerLen >= 0
  487. if hasLen {
  488. for j := 0; j < containerLen; j++ {
  489. // rvkencname := f.dd.DecodeString()
  490. rvkencname := stringView(f.dd.DecodeBytes(f.d.b[:], true, true))
  491. // rvksi := ti.getForEncName(rvkencname)
  492. if k := fti.indexForEncName(rvkencname); k > -1 {
  493. si := tisfi[k]
  494. if f.dd.TryDecodeAsNil() {
  495. si.setToZeroValue(rv)
  496. } else {
  497. d.decodeValue(si.field(rv, true), decFn{})
  498. }
  499. } else {
  500. d.structFieldNotFound(-1, rvkencname)
  501. }
  502. }
  503. } else {
  504. for j := 0; !f.dd.CheckBreak(); j++ {
  505. if j > 0 {
  506. f.dd.ReadMapEntrySeparator()
  507. }
  508. // rvkencname := f.dd.DecodeString()
  509. rvkencname := stringView(f.dd.DecodeBytes(f.d.b[:], true, true))
  510. f.dd.ReadMapKVSeparator()
  511. // rvksi := ti.getForEncName(rvkencname)
  512. if k := fti.indexForEncName(rvkencname); k > -1 {
  513. si := tisfi[k]
  514. if f.dd.TryDecodeAsNil() {
  515. si.setToZeroValue(rv)
  516. } else {
  517. d.decodeValue(si.field(rv, true), decFn{})
  518. }
  519. } else {
  520. d.structFieldNotFound(-1, rvkencname)
  521. }
  522. }
  523. f.dd.ReadMapEnd()
  524. }
  525. } else if f.dd.IsContainerType(valueTypeArray) {
  526. containerLen := f.dd.ReadArrayStart()
  527. if containerLen == 0 {
  528. f.dd.ReadArrayEnd()
  529. return
  530. }
  531. // Not much gain from doing it two ways for array.
  532. // Arrays are not used as much for structs.
  533. hasLen := containerLen >= 0
  534. for j, si := range fti.sfip {
  535. if hasLen {
  536. if j == containerLen {
  537. break
  538. }
  539. } else if f.dd.CheckBreak() {
  540. break
  541. }
  542. if j > 0 {
  543. f.dd.ReadArrayEntrySeparator()
  544. }
  545. if f.dd.TryDecodeAsNil() {
  546. si.setToZeroValue(rv)
  547. } else {
  548. d.decodeValue(si.field(rv, true), decFn{})
  549. }
  550. // if si.i != -1 {
  551. // d.decodeValue(rv.Field(int(si.i)), decFn{})
  552. // } else {
  553. // d.decEmbeddedField(rv, si.is)
  554. // }
  555. }
  556. if containerLen > len(fti.sfip) {
  557. // read remaining values and throw away
  558. for j := len(fti.sfip); j < containerLen; j++ {
  559. if j > 0 {
  560. f.dd.ReadArrayEntrySeparator()
  561. }
  562. d.structFieldNotFound(j, "")
  563. }
  564. }
  565. f.dd.ReadArrayEnd()
  566. } else {
  567. f.d.error(onlyMapOrArrayCanDecodeIntoStructErr)
  568. return
  569. }
  570. }
  571. func (f decFnInfo) kSlice(rv reflect.Value) {
  572. // A slice can be set from a map or array in stream.
  573. // This way, the order can be kept (as order is lost with map).
  574. ti := f.ti
  575. d := f.d
  576. if f.dd.IsContainerType(valueTypeBytes) || f.dd.IsContainerType(valueTypeString) {
  577. if ti.rtid == uint8SliceTypId || ti.rt.Elem().Kind() == reflect.Uint8 {
  578. rvbs := rv.Bytes()
  579. bs2 := f.dd.DecodeBytes(rvbs, false, false)
  580. if rvbs == nil && bs2 != nil || rvbs != nil && bs2 == nil || len(bs2) != len(rvbs) {
  581. if rv.CanSet() {
  582. rv.SetBytes(bs2)
  583. } else {
  584. copy(rvbs, bs2)
  585. }
  586. }
  587. return
  588. }
  589. }
  590. array := f.array
  591. slh, containerLenS := d.decSliceHelperStart()
  592. // an array can never return a nil slice. so no need to check f.array here.
  593. if rv.IsNil() {
  594. if containerLenS <= 0 {
  595. rv.Set(reflect.MakeSlice(ti.rt, 0, 0))
  596. } else {
  597. rv.Set(reflect.MakeSlice(ti.rt, containerLenS, containerLenS))
  598. }
  599. }
  600. rvlen := rv.Len()
  601. if containerLenS == 0 {
  602. if !array && rvlen != 0 {
  603. rv.SetLen(0)
  604. }
  605. // slh.End() // f.dd.ReadArrayEnd()
  606. return
  607. }
  608. rtelem0 := ti.rt.Elem()
  609. rtelem := rtelem0
  610. for rtelem.Kind() == reflect.Ptr {
  611. rtelem = rtelem.Elem()
  612. }
  613. fn := d.getDecFn(rtelem, true)
  614. rv0 := rv
  615. rvChanged := false
  616. rvcap := rv.Cap()
  617. // for j := 0; j < containerLenS; j++ {
  618. hasLen := containerLenS >= 0
  619. if hasLen {
  620. numToRead := containerLenS
  621. if containerLenS > rvcap {
  622. if array {
  623. d.arrayCannotExpand(rv.Len(), containerLenS)
  624. numToRead = rvlen
  625. } else {
  626. rv = reflect.MakeSlice(ti.rt, containerLenS, containerLenS)
  627. if rvlen > 0 && !isMutableKind(ti.rt.Kind()) {
  628. rv1 := rv0
  629. rv1.SetLen(rvcap)
  630. reflect.Copy(rv, rv1)
  631. }
  632. rvChanged = true
  633. rvlen = containerLenS
  634. }
  635. } else if containerLenS != rvlen {
  636. rv.SetLen(containerLenS)
  637. rvlen = containerLenS
  638. }
  639. j := 0
  640. for ; j < numToRead; j++ {
  641. d.decodeValue(rv.Index(j), fn)
  642. }
  643. if array {
  644. for ; j < containerLenS; j++ {
  645. d.swallow()
  646. }
  647. }
  648. } else {
  649. for j := 0; !f.dd.CheckBreak(); j++ {
  650. var decodeIntoBlank bool
  651. // if indefinite, etc, then expand the slice if necessary
  652. if j >= rvlen {
  653. if array {
  654. d.arrayCannotExpand(rvlen, j+1)
  655. decodeIntoBlank = true
  656. } else {
  657. rv = reflect.Append(rv, reflect.Zero(rtelem0))
  658. rvlen++
  659. rvChanged = true
  660. }
  661. }
  662. if j > 0 {
  663. slh.Sep(j)
  664. }
  665. if decodeIntoBlank {
  666. d.swallow()
  667. } else {
  668. d.decodeValue(rv.Index(j), fn)
  669. }
  670. }
  671. slh.End()
  672. }
  673. if rvChanged {
  674. rv0.Set(rv)
  675. }
  676. }
  677. func (f decFnInfo) kArray(rv reflect.Value) {
  678. // f.d.decodeValue(rv.Slice(0, rv.Len()))
  679. f.kSlice(rv.Slice(0, rv.Len()))
  680. }
  681. func (f decFnInfo) kMap(rv reflect.Value) {
  682. containerLen := f.dd.ReadMapStart()
  683. ti := f.ti
  684. if rv.IsNil() {
  685. rv.Set(reflect.MakeMap(ti.rt))
  686. }
  687. if containerLen == 0 {
  688. // f.dd.ReadMapEnd()
  689. return
  690. }
  691. d := f.d
  692. ktype, vtype := ti.rt.Key(), ti.rt.Elem()
  693. ktypeId := reflect.ValueOf(ktype).Pointer()
  694. var keyFn, valFn decFn
  695. var xtyp reflect.Type
  696. for xtyp = ktype; xtyp.Kind() == reflect.Ptr; xtyp = xtyp.Elem() {
  697. }
  698. keyFn = d.getDecFn(xtyp, true)
  699. for xtyp = vtype; xtyp.Kind() == reflect.Ptr; xtyp = xtyp.Elem() {
  700. }
  701. valFn = d.getDecFn(xtyp, true)
  702. // for j := 0; j < containerLen; j++ {
  703. if containerLen > 0 {
  704. for j := 0; j < containerLen; j++ {
  705. rvk := reflect.New(ktype).Elem()
  706. d.decodeValue(rvk, keyFn)
  707. // special case if a byte array.
  708. if ktypeId == intfTypId {
  709. rvk = rvk.Elem()
  710. if rvk.Type() == uint8SliceTyp {
  711. rvk = reflect.ValueOf(string(rvk.Bytes()))
  712. }
  713. }
  714. rvv := rv.MapIndex(rvk)
  715. // TODO: is !IsValid check required?
  716. if !rvv.IsValid() {
  717. rvv = reflect.New(vtype).Elem()
  718. }
  719. d.decodeValue(rvv, valFn)
  720. rv.SetMapIndex(rvk, rvv)
  721. }
  722. } else {
  723. for j := 0; !f.dd.CheckBreak(); j++ {
  724. if j > 0 {
  725. f.dd.ReadMapEntrySeparator()
  726. }
  727. rvk := reflect.New(ktype).Elem()
  728. d.decodeValue(rvk, keyFn)
  729. // special case if a byte array.
  730. if ktypeId == intfTypId {
  731. rvk = rvk.Elem()
  732. if rvk.Type() == uint8SliceTyp {
  733. rvk = reflect.ValueOf(string(rvk.Bytes()))
  734. }
  735. }
  736. rvv := rv.MapIndex(rvk)
  737. if !rvv.IsValid() {
  738. rvv = reflect.New(vtype).Elem()
  739. }
  740. f.dd.ReadMapKVSeparator()
  741. d.decodeValue(rvv, valFn)
  742. rv.SetMapIndex(rvk, rvv)
  743. }
  744. f.dd.ReadMapEnd()
  745. }
  746. }
  747. type rtidDecFn struct {
  748. rtid uintptr
  749. fn decFn
  750. }
  751. // A Decoder reads and decodes an object from an input stream in the codec format.
  752. type Decoder struct {
  753. // hopefully, reduce derefencing cost by laying the decReader inside the Decoder.
  754. // Try to put things that go together to fit within a cache line (8 words).
  755. d decDriver
  756. r decReader
  757. //sa [32]rtidDecFn
  758. s []rtidDecFn
  759. h *BasicHandle
  760. rb bytesDecReader
  761. hh Handle
  762. be bool // is binary encoding
  763. bytes bool // is bytes reader
  764. ri ioDecReader
  765. f map[uintptr]decFn
  766. _ uintptr // for alignment purposes, so next one starts from a cache line
  767. b [scratchByteArrayLen]byte
  768. }
  769. // NewDecoder returns a Decoder for decoding a stream of bytes from an io.Reader.
  770. //
  771. // For efficiency, Users are encouraged to pass in a memory buffered reader
  772. // (eg bufio.Reader, bytes.Buffer).
  773. func NewDecoder(r io.Reader, h Handle) (d *Decoder) {
  774. d = &Decoder{hh: h, h: h.getBasicHandle(), be: h.isBinary()}
  775. //d.s = d.sa[:0]
  776. d.ri.x = &d.b
  777. d.ri.bs.r = r
  778. var ok bool
  779. d.ri.br, ok = r.(decReaderByteScanner)
  780. if !ok {
  781. d.ri.br = &d.ri.bs
  782. }
  783. d.r = &d.ri
  784. d.d = h.newDecDriver(d)
  785. return
  786. }
  787. // NewDecoderBytes returns a Decoder which efficiently decodes directly
  788. // from a byte slice with zero copying.
  789. func NewDecoderBytes(in []byte, h Handle) (d *Decoder) {
  790. d = &Decoder{hh: h, h: h.getBasicHandle(), be: h.isBinary(), bytes: true}
  791. //d.s = d.sa[:0]
  792. d.rb.b = in
  793. d.rb.a = len(in)
  794. d.r = &d.rb
  795. d.d = h.newDecDriver(d)
  796. // d.d = h.newDecDriver(decReaderT{true, &d.rb, &d.ri})
  797. return
  798. }
  799. // Decode decodes the stream from reader and stores the result in the
  800. // value pointed to by v. v cannot be a nil pointer. v can also be
  801. // a reflect.Value of a pointer.
  802. //
  803. // Note that a pointer to a nil interface is not a nil pointer.
  804. // If you do not know what type of stream it is, pass in a pointer to a nil interface.
  805. // We will decode and store a value in that nil interface.
  806. //
  807. // Sample usages:
  808. // // Decoding into a non-nil typed value
  809. // var f float32
  810. // err = codec.NewDecoder(r, handle).Decode(&f)
  811. //
  812. // // Decoding into nil interface
  813. // var v interface{}
  814. // dec := codec.NewDecoder(r, handle)
  815. // err = dec.Decode(&v)
  816. //
  817. // When decoding into a nil interface{}, we will decode into an appropriate value based
  818. // on the contents of the stream:
  819. // - Numbers are decoded as float64, int64 or uint64.
  820. // - Other values are decoded appropriately depending on the type:
  821. // bool, string, []byte, time.Time, etc
  822. // - Extensions are decoded as RawExt (if no ext function registered for the tag)
  823. // Configurations exist on the Handle to override defaults
  824. // (e.g. for MapType, SliceType and how to decode raw bytes).
  825. //
  826. // When decoding into a non-nil interface{} value, the mode of encoding is based on the
  827. // type of the value. When a value is seen:
  828. // - If an extension is registered for it, call that extension function
  829. // - If it implements BinaryUnmarshaler, call its UnmarshalBinary(data []byte) error
  830. // - Else decode it based on its reflect.Kind
  831. //
  832. // There are some special rules when decoding into containers (slice/array/map/struct).
  833. // Decode will typically use the stream contents to UPDATE the container.
  834. // - A map can be decoded from a stream map, by updating matching keys.
  835. // - A slice can be decoded from a stream array,
  836. // by updating the first n elements, where n is length of the stream.
  837. // - A slice can be decoded from a stream map, by decoding as if
  838. // it contains a sequence of key-value pairs.
  839. // - A struct can be decoded from a stream map, by updating matching fields.
  840. // - A struct can be decoded from a stream array,
  841. // by updating fields as they occur in the struct (by index).
  842. //
  843. // When decoding a stream map or array with length of 0 into a nil map or slice,
  844. // we reset the destination map or slice to a zero-length value.
  845. //
  846. // However, when decoding a stream nil, we reset the destination container
  847. // to its "zero" value (e.g. nil for slice/map, etc).
  848. //
  849. func (d *Decoder) Decode(v interface{}) (err error) {
  850. defer panicToErr(&err)
  851. d.decode(v)
  852. return
  853. }
  854. // this is not a smart swallow, as it allocates objects and does unnecessary work.
  855. func (d *Decoder) swallowViaHammer() {
  856. var blank interface{}
  857. d.decodeValue(reflect.ValueOf(&blank).Elem(), decFn{})
  858. }
  859. func (d *Decoder) swallow() {
  860. // smarter decode that just swallows the content
  861. dd := d.d
  862. switch {
  863. case dd.TryDecodeAsNil():
  864. case dd.IsContainerType(valueTypeMap):
  865. containerLen := dd.ReadMapStart()
  866. clenGtEqualZero := containerLen >= 0
  867. for j := 0; ; j++ {
  868. if clenGtEqualZero {
  869. if j >= containerLen {
  870. break
  871. }
  872. } else if dd.CheckBreak() {
  873. break
  874. }
  875. if j > 0 {
  876. dd.ReadMapEntrySeparator()
  877. }
  878. d.swallow()
  879. dd.ReadMapKVSeparator()
  880. d.swallow()
  881. }
  882. dd.ReadMapEnd()
  883. case dd.IsContainerType(valueTypeArray):
  884. containerLenS := dd.ReadArrayStart()
  885. clenGtEqualZero := containerLenS >= 0
  886. for j := 0; ; j++ {
  887. if clenGtEqualZero {
  888. if j >= containerLenS {
  889. break
  890. }
  891. } else if dd.CheckBreak() {
  892. break
  893. }
  894. if j > 0 {
  895. dd.ReadArrayEntrySeparator()
  896. }
  897. d.swallow()
  898. }
  899. dd.ReadArrayEnd()
  900. case dd.IsContainerType(valueTypeBytes):
  901. dd.DecodeBytes(d.b[:], false, true)
  902. case dd.IsContainerType(valueTypeString):
  903. dd.DecodeBytes(d.b[:], true, true)
  904. // dd.DecodeStringAsBytes(d.b[:])
  905. default:
  906. // these are all primitives, which we can get from decodeNaked
  907. dd.DecodeNaked()
  908. }
  909. }
  910. // MustDecode is like Decode, but panics if unable to Decode.
  911. // This provides insight to the code location that triggered the error.
  912. func (d *Decoder) MustDecode(v interface{}) {
  913. d.decode(v)
  914. }
  915. func (d *Decoder) decode(iv interface{}) {
  916. // if ics, ok := iv.(Selfer); ok {
  917. // ics.CodecDecodeSelf(d)
  918. // return
  919. // }
  920. if d.d.TryDecodeAsNil() {
  921. switch v := iv.(type) {
  922. case nil:
  923. case *string:
  924. *v = ""
  925. case *bool:
  926. *v = false
  927. case *int:
  928. *v = 0
  929. case *int8:
  930. *v = 0
  931. case *int16:
  932. *v = 0
  933. case *int32:
  934. *v = 0
  935. case *int64:
  936. *v = 0
  937. case *uint:
  938. *v = 0
  939. case *uint8:
  940. *v = 0
  941. case *uint16:
  942. *v = 0
  943. case *uint32:
  944. *v = 0
  945. case *uint64:
  946. *v = 0
  947. case *float32:
  948. *v = 0
  949. case *float64:
  950. *v = 0
  951. case *[]uint8:
  952. *v = nil
  953. case reflect.Value:
  954. d.chkPtrValue(v)
  955. v = v.Elem()
  956. if v.IsValid() {
  957. v.Set(reflect.Zero(v.Type()))
  958. }
  959. default:
  960. rv := reflect.ValueOf(iv)
  961. d.chkPtrValue(rv)
  962. rv = rv.Elem()
  963. if rv.IsValid() {
  964. rv.Set(reflect.Zero(rv.Type()))
  965. }
  966. }
  967. return
  968. }
  969. switch v := iv.(type) {
  970. case nil:
  971. d.error(cannotDecodeIntoNilErr)
  972. return
  973. case Selfer:
  974. v.CodecDecodeSelf(d)
  975. case reflect.Value:
  976. d.chkPtrValue(v)
  977. d.decodeValueNotNil(v.Elem(), decFn{})
  978. case *string:
  979. *v = d.d.DecodeString()
  980. case *bool:
  981. *v = d.d.DecodeBool()
  982. case *int:
  983. *v = int(d.d.DecodeInt(intBitsize))
  984. case *int8:
  985. *v = int8(d.d.DecodeInt(8))
  986. case *int16:
  987. *v = int16(d.d.DecodeInt(16))
  988. case *int32:
  989. *v = int32(d.d.DecodeInt(32))
  990. case *int64:
  991. *v = d.d.DecodeInt(64)
  992. case *uint:
  993. *v = uint(d.d.DecodeUint(uintBitsize))
  994. case *uint8:
  995. *v = uint8(d.d.DecodeUint(8))
  996. case *uint16:
  997. *v = uint16(d.d.DecodeUint(16))
  998. case *uint32:
  999. *v = uint32(d.d.DecodeUint(32))
  1000. case *uint64:
  1001. *v = d.d.DecodeUint(64)
  1002. case *float32:
  1003. *v = float32(d.d.DecodeFloat(true))
  1004. case *float64:
  1005. *v = d.d.DecodeFloat(false)
  1006. case *[]uint8:
  1007. *v = d.d.DecodeBytes(*v, false, false)
  1008. case *interface{}:
  1009. d.decodeValueNotNil(reflect.ValueOf(iv).Elem(), decFn{})
  1010. default:
  1011. if !fastpathDecodeTypeSwitch(iv, d) {
  1012. d.decodeI(iv, true, false, false)
  1013. }
  1014. }
  1015. }
  1016. func (d *Decoder) preDecodeValue(rv reflect.Value, tryNil bool) (rv2 reflect.Value, proceed bool) {
  1017. if tryNil && d.d.TryDecodeAsNil() {
  1018. // No need to check if a ptr, recursively, to determine
  1019. // whether to set value to nil.
  1020. // Just always set value to its zero type.
  1021. if rv.IsValid() { // rv.CanSet() // always settable, except it's invalid
  1022. rv.Set(reflect.Zero(rv.Type()))
  1023. }
  1024. return
  1025. }
  1026. // If stream is not containing a nil value, then we can deref to the base
  1027. // non-pointer value, and decode into that.
  1028. for rv.Kind() == reflect.Ptr {
  1029. if rv.IsNil() {
  1030. rv.Set(reflect.New(rv.Type().Elem()))
  1031. }
  1032. rv = rv.Elem()
  1033. }
  1034. return rv, true
  1035. }
  1036. func (d *Decoder) decodeI(iv interface{}, checkPtr, tryNil, decFnCheckAll bool) {
  1037. rv := reflect.ValueOf(iv)
  1038. if checkPtr {
  1039. d.chkPtrValue(rv)
  1040. }
  1041. rv, proceed := d.preDecodeValue(rv, tryNil)
  1042. if proceed {
  1043. fn := d.getDecFn(rv.Type(), decFnCheckAll)
  1044. fn.f(fn.i, rv)
  1045. }
  1046. }
  1047. func (d *Decoder) decodeValue(rv reflect.Value, fn decFn) {
  1048. if rv, proceed := d.preDecodeValue(rv, true); proceed {
  1049. if fn.f == nil {
  1050. fn = d.getDecFn(rv.Type(), true)
  1051. }
  1052. fn.f(fn.i, rv)
  1053. }
  1054. }
  1055. func (d *Decoder) decodeValueNotNil(rv reflect.Value, fn decFn) {
  1056. if rv, proceed := d.preDecodeValue(rv, false); proceed {
  1057. if fn.f == nil {
  1058. fn = d.getDecFn(rv.Type(), true)
  1059. }
  1060. fn.f(fn.i, rv)
  1061. }
  1062. }
  1063. func (d *Decoder) getDecFn(rt reflect.Type, checkAll bool) (fn decFn) {
  1064. rtid := reflect.ValueOf(rt).Pointer()
  1065. // retrieve or register a focus'ed function for this type
  1066. // to eliminate need to do the retrieval multiple times
  1067. // if d.f == nil && d.s == nil { debugf("---->Creating new dec f map for type: %v\n", rt) }
  1068. var ok bool
  1069. if useMapForCodecCache {
  1070. fn, ok = d.f[rtid]
  1071. } else {
  1072. for _, v := range d.s {
  1073. if v.rtid == rtid {
  1074. fn, ok = v.fn, true
  1075. break
  1076. }
  1077. }
  1078. }
  1079. if ok {
  1080. return
  1081. }
  1082. // debugf("\tCreating new dec fn for type: %v\n", rt)
  1083. ti := getTypeInfo(rtid, rt)
  1084. var fi decFnInfo
  1085. fi.dd = d.d
  1086. // fi.decFnInfoX = new(decFnInfoX)
  1087. // An extension can be registered for any type, regardless of the Kind
  1088. // (e.g. type BitSet int64, type MyStruct { / * unexported fields * / }, type X []int, etc.
  1089. //
  1090. // We can't check if it's an extension byte here first, because the user may have
  1091. // registered a pointer or non-pointer type, meaning we may have to recurse first
  1092. // before matching a mapped type, even though the extension byte is already detected.
  1093. //
  1094. // NOTE: if decoding into a nil interface{}, we return a non-nil
  1095. // value except even if the container registers a length of 0.
  1096. if checkAll && ti.cs {
  1097. fi.decFnInfoX = &decFnInfoX{d: d, ti: ti}
  1098. fn.f = (decFnInfo).selferUnmarshal
  1099. } else if rtid == rawExtTypId {
  1100. fi.decFnInfoX = &decFnInfoX{d: d, ti: ti}
  1101. fn.f = (decFnInfo).rawExt
  1102. } else if d.d.IsBuiltinType(rtid) {
  1103. fi.decFnInfoX = &decFnInfoX{d: d, ti: ti}
  1104. fn.f = (decFnInfo).builtin
  1105. } else if xfFn := d.h.getExt(rtid); xfFn != nil {
  1106. // fi.decFnInfoX = &decFnInfoX{xfTag: xfFn.tag, xfFn: xfFn.ext}
  1107. fi.decFnInfoX = &decFnInfoX{d: d, ti: ti}
  1108. fi.xfTag, fi.xfFn = xfFn.tag, xfFn.ext
  1109. fn.f = (decFnInfo).ext
  1110. } else if supportMarshalInterfaces && d.be && ti.bunm {
  1111. fi.decFnInfoX = &decFnInfoX{d: d, ti: ti}
  1112. fn.f = (decFnInfo).binaryUnmarshal
  1113. } else if supportMarshalInterfaces && !d.be && ti.tunm {
  1114. fi.decFnInfoX = &decFnInfoX{d: d, ti: ti}
  1115. fn.f = (decFnInfo).textUnmarshal
  1116. } else {
  1117. rk := rt.Kind()
  1118. if fastpathEnabled && checkAll && (rk == reflect.Map || rk == reflect.Slice) {
  1119. if rt.PkgPath() == "" {
  1120. if idx := fastpathAV.index(rtid); idx != -1 {
  1121. fi.decFnInfoX = &decFnInfoX{d: d, ti: ti}
  1122. fn.f = fastpathAV[idx].decfn
  1123. }
  1124. } else {
  1125. // use mapping for underlying type if there
  1126. ok = false
  1127. var rtu reflect.Type
  1128. if rk == reflect.Map {
  1129. rtu = reflect.MapOf(rt.Key(), rt.Elem())
  1130. } else {
  1131. rtu = reflect.SliceOf(rt.Elem())
  1132. }
  1133. rtuid := reflect.ValueOf(rtu).Pointer()
  1134. if idx := fastpathAV.index(rtuid); idx != -1 {
  1135. xfnf := fastpathAV[idx].decfn
  1136. xrt := fastpathAV[idx].rt
  1137. fi.decFnInfoX = &decFnInfoX{d: d, ti: ti}
  1138. fn.f = func(xf decFnInfo, xrv reflect.Value) {
  1139. // xfnf(xf, xrv.Convert(xrt))
  1140. xfnf(xf, xrv.Addr().Convert(reflect.PtrTo(xrt)).Elem())
  1141. }
  1142. }
  1143. }
  1144. }
  1145. if fn.f == nil {
  1146. switch rk {
  1147. case reflect.String:
  1148. fn.f = (decFnInfo).kString
  1149. case reflect.Bool:
  1150. fn.f = (decFnInfo).kBool
  1151. case reflect.Int:
  1152. fn.f = (decFnInfo).kInt
  1153. case reflect.Int64:
  1154. fn.f = (decFnInfo).kInt64
  1155. case reflect.Int32:
  1156. fn.f = (decFnInfo).kInt32
  1157. case reflect.Int8:
  1158. fn.f = (decFnInfo).kInt8
  1159. case reflect.Int16:
  1160. fn.f = (decFnInfo).kInt16
  1161. case reflect.Float32:
  1162. fn.f = (decFnInfo).kFloat32
  1163. case reflect.Float64:
  1164. fn.f = (decFnInfo).kFloat64
  1165. case reflect.Uint8:
  1166. fn.f = (decFnInfo).kUint8
  1167. case reflect.Uint64:
  1168. fn.f = (decFnInfo).kUint64
  1169. case reflect.Uint:
  1170. fn.f = (decFnInfo).kUint
  1171. case reflect.Uint32:
  1172. fn.f = (decFnInfo).kUint32
  1173. case reflect.Uint16:
  1174. fn.f = (decFnInfo).kUint16
  1175. // case reflect.Ptr:
  1176. // fn.f = (decFnInfo).kPtr
  1177. case reflect.Interface:
  1178. fi.decFnInfoX = &decFnInfoX{d: d, ti: ti}
  1179. fn.f = (decFnInfo).kInterface
  1180. case reflect.Struct:
  1181. fi.decFnInfoX = &decFnInfoX{d: d, ti: ti}
  1182. fn.f = (decFnInfo).kStruct
  1183. case reflect.Slice:
  1184. fi.decFnInfoX = &decFnInfoX{d: d, ti: ti}
  1185. fn.f = (decFnInfo).kSlice
  1186. case reflect.Array:
  1187. // fi.decFnInfoX = &decFnInfoX{array: true}
  1188. fi.decFnInfoX = &decFnInfoX{d: d, ti: ti}
  1189. fi.array = true
  1190. fn.f = (decFnInfo).kArray
  1191. case reflect.Map:
  1192. fi.decFnInfoX = &decFnInfoX{d: d, ti: ti}
  1193. fn.f = (decFnInfo).kMap
  1194. default:
  1195. fn.f = (decFnInfo).kErr
  1196. }
  1197. }
  1198. }
  1199. fn.i = fi
  1200. if useMapForCodecCache {
  1201. if d.f == nil {
  1202. d.f = make(map[uintptr]decFn, 32)
  1203. }
  1204. d.f[rtid] = fn
  1205. } else {
  1206. if d.s == nil {
  1207. d.s = make([]rtidDecFn, 0, 32)
  1208. }
  1209. d.s = append(d.s, rtidDecFn{rtid, fn})
  1210. }
  1211. return
  1212. }
  1213. func (d *Decoder) structFieldNotFound(index int, rvkencname string) {
  1214. if d.h.ErrorIfNoField {
  1215. if index >= 0 {
  1216. d.errorf("no matching struct field found when decoding stream array at index %v", index)
  1217. return
  1218. } else if rvkencname != "" {
  1219. d.errorf("no matching struct field found when decoding stream map with key %s", rvkencname)
  1220. return
  1221. }
  1222. }
  1223. d.swallow()
  1224. }
  1225. func (d *Decoder) arrayCannotExpand(sliceLen, streamLen int) {
  1226. if d.h.ErrorIfNoArrayExpand {
  1227. d.errorf("cannot expand array len during decode from %v to %v", sliceLen, streamLen)
  1228. }
  1229. }
  1230. func (d *Decoder) chkPtrValue(rv reflect.Value) {
  1231. // We can only decode into a non-nil pointer
  1232. if rv.Kind() == reflect.Ptr && !rv.IsNil() {
  1233. return
  1234. }
  1235. if !rv.IsValid() {
  1236. d.error(cannotDecodeIntoNilErr)
  1237. return
  1238. }
  1239. if !rv.CanInterface() {
  1240. d.errorf("cannot decode into a value without an interface: %v", rv)
  1241. return
  1242. }
  1243. rvi := rv.Interface()
  1244. d.errorf("cannot decode into non-pointer or nil pointer. Got: %v, %T, %v", rv.Kind(), rvi, rvi)
  1245. }
  1246. func (d *Decoder) error(err error) {
  1247. panic(err)
  1248. }
  1249. func (d *Decoder) errorf(format string, params ...interface{}) {
  1250. err := fmt.Errorf(format, params...)
  1251. panic(err)
  1252. }
  1253. // --------------------------------------------------
  1254. // decSliceHelper assists when decoding into a slice, from a map or an array in the stream.
  1255. // A slice can be set from a map or array in stream. This supports the MapBySlice interface.
  1256. type decSliceHelper struct {
  1257. dd decDriver
  1258. ct valueType
  1259. }
  1260. func (d *Decoder) decSliceHelperStart() (x decSliceHelper, clen int) {
  1261. x.dd = d.d
  1262. if x.dd.IsContainerType(valueTypeArray) {
  1263. x.ct = valueTypeArray
  1264. clen = x.dd.ReadArrayStart()
  1265. } else if x.dd.IsContainerType(valueTypeMap) {
  1266. x.ct = valueTypeMap
  1267. clen = x.dd.ReadMapStart() * 2
  1268. } else {
  1269. d.errorf("only encoded map or array can be decoded into a slice")
  1270. }
  1271. return
  1272. }
  1273. func (x decSliceHelper) Sep(index int) {
  1274. if x.ct == valueTypeArray {
  1275. x.dd.ReadArrayEntrySeparator()
  1276. } else {
  1277. if index%2 == 0 {
  1278. x.dd.ReadMapEntrySeparator()
  1279. } else {
  1280. x.dd.ReadMapKVSeparator()
  1281. }
  1282. }
  1283. }
  1284. func (x decSliceHelper) End() {
  1285. if x.ct == valueTypeArray {
  1286. x.dd.ReadArrayEnd()
  1287. } else {
  1288. x.dd.ReadMapEnd()
  1289. }
  1290. }
  1291. // func decErr(format string, params ...interface{}) {
  1292. // doPanic(msgTagDec, format, params...)
  1293. // }
  1294. func decByteSlice(r decReader, clen int, bs []byte) (bsOut []byte) {
  1295. if clen == 0 {
  1296. return zeroByteSlice
  1297. }
  1298. if len(bs) == clen {
  1299. bsOut = bs
  1300. } else if cap(bs) >= clen {
  1301. bsOut = bs[:clen]
  1302. } else {
  1303. bsOut = make([]byte, clen)
  1304. }
  1305. r.readb(bsOut)
  1306. return
  1307. }
  1308. func detachZeroCopyBytes(isBytesReader bool, dest []byte, in []byte) (out []byte) {
  1309. if xlen := len(in); xlen > 0 {
  1310. if isBytesReader || xlen <= scratchByteArrayLen {
  1311. if cap(dest) >= xlen {
  1312. out = dest[:xlen]
  1313. } else {
  1314. out = make([]byte, xlen)
  1315. }
  1316. copy(out, in)
  1317. return
  1318. }
  1319. }
  1320. return in
  1321. }
  1322. // // implement overall decReader wrapping both, for possible use inline:
  1323. // type decReaderT struct {
  1324. // bytes bool
  1325. // rb *bytesDecReader
  1326. // ri *ioDecReader
  1327. // }
  1328. //
  1329. // // implement *Decoder as a decReader.
  1330. // // Using decReaderT (defined just above) caused performance degradation
  1331. // // possibly because of constant copying the value,
  1332. // // and some value->interface conversion causing allocation.
  1333. // func (d *Decoder) unreadn1() {
  1334. // if d.bytes {
  1335. // d.rb.unreadn1()
  1336. // } else {
  1337. // d.ri.unreadn1()
  1338. // }
  1339. // }
  1340. // func (d *Decoder) readb(b []byte) {
  1341. // if d.bytes {
  1342. // d.rb.readb(b)
  1343. // } else {
  1344. // d.ri.readb(b)
  1345. // }
  1346. // }
  1347. // func (d *Decoder) readx(n int) []byte {
  1348. // if d.bytes {
  1349. // return d.rb.readx(n)
  1350. // } else {
  1351. // return d.ri.readx(n)
  1352. // }
  1353. // }
  1354. // func (d *Decoder) readn1() uint8 {
  1355. // if d.bytes {
  1356. // return d.rb.readn1()
  1357. // } else {
  1358. // return d.ri.readn1()
  1359. // }
  1360. // }
  1361. // func (d *Decoder) readn1eof() (v uint8, eof bool) {
  1362. // if d.bytes {
  1363. // return d.rb.readn1eof()
  1364. // } else {
  1365. // return d.ri.readn1eof()
  1366. // }
  1367. // }
  1368. // var _ decReader = (*Decoder)(nil) // decReaderT{} //