encode.go 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201
  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. "sync"
  11. )
  12. const (
  13. defEncByteBufSize = 1 << 6 // 4:16, 6:64, 8:256, 10:1024
  14. )
  15. // AsSymbolFlag defines what should be encoded as symbols.
  16. type AsSymbolFlag uint8
  17. const (
  18. // AsSymbolDefault is default.
  19. // Currently, this means only encode struct field names as symbols.
  20. // The default is subject to change.
  21. AsSymbolDefault AsSymbolFlag = iota
  22. // AsSymbolAll means encode anything which could be a symbol as a symbol.
  23. AsSymbolAll = 0xfe
  24. // AsSymbolNone means do not encode anything as a symbol.
  25. AsSymbolNone = 1 << iota
  26. // AsSymbolMapStringKeys means encode keys in map[string]XXX as symbols.
  27. AsSymbolMapStringKeysFlag
  28. // AsSymbolStructFieldName means encode struct field names as symbols.
  29. AsSymbolStructFieldNameFlag
  30. )
  31. // encWriter abstracts writing to a byte array or to an io.Writer.
  32. type encWriter interface {
  33. writeb([]byte)
  34. writestr(string)
  35. writen1(byte)
  36. writen2(byte, byte)
  37. atEndOfEncode()
  38. }
  39. // encDriver abstracts the actual codec (binc vs msgpack, etc)
  40. type encDriver interface {
  41. IsBuiltinType(rt uintptr) bool
  42. EncodeBuiltin(rt uintptr, v interface{})
  43. EncodeNil()
  44. EncodeInt(i int64)
  45. EncodeUint(i uint64)
  46. EncodeBool(b bool)
  47. EncodeFloat32(f float32)
  48. EncodeFloat64(f float64)
  49. // encodeExtPreamble(xtag byte, length int)
  50. EncodeRawExt(re *RawExt, e *Encoder)
  51. EncodeExt(v interface{}, xtag uint64, ext Ext, e *Encoder)
  52. EncodeArrayStart(length int)
  53. EncodeArrayEnd()
  54. EncodeArrayEntrySeparator()
  55. EncodeMapStart(length int)
  56. EncodeMapEnd()
  57. EncodeMapEntrySeparator()
  58. EncodeMapKVSeparator()
  59. EncodeString(c charEncoding, v string)
  60. EncodeSymbol(v string)
  61. EncodeStringBytes(c charEncoding, v []byte)
  62. //TODO
  63. //encBignum(f *big.Int)
  64. //encStringRunes(c charEncoding, v []rune)
  65. }
  66. type encNoSeparator struct{}
  67. func (_ encNoSeparator) EncodeMapEnd() {}
  68. func (_ encNoSeparator) EncodeArrayEnd() {}
  69. func (_ encNoSeparator) EncodeArrayEntrySeparator() {}
  70. func (_ encNoSeparator) EncodeMapEntrySeparator() {}
  71. func (_ encNoSeparator) EncodeMapKVSeparator() {}
  72. type ioEncWriterWriter interface {
  73. WriteByte(c byte) error
  74. WriteString(s string) (n int, err error)
  75. Write(p []byte) (n int, err error)
  76. }
  77. type ioEncStringWriter interface {
  78. WriteString(s string) (n int, err error)
  79. }
  80. type EncodeOptions struct {
  81. // Encode a struct as an array, and not as a map.
  82. StructToArray bool
  83. // AsSymbols defines what should be encoded as symbols.
  84. //
  85. // Encoding as symbols can reduce the encoded size significantly.
  86. //
  87. // However, during decoding, each string to be encoded as a symbol must
  88. // be checked to see if it has been seen before. Consequently, encoding time
  89. // will increase if using symbols, because string comparisons has a clear cost.
  90. //
  91. // Sample values:
  92. // AsSymbolNone
  93. // AsSymbolAll
  94. // AsSymbolMapStringKeys
  95. // AsSymbolMapStringKeysFlag | AsSymbolStructFieldNameFlag
  96. AsSymbols AsSymbolFlag
  97. }
  98. // ---------------------------------------------
  99. type simpleIoEncWriterWriter struct {
  100. w io.Writer
  101. bw io.ByteWriter
  102. sw ioEncStringWriter
  103. }
  104. func (o *simpleIoEncWriterWriter) WriteByte(c byte) (err error) {
  105. if o.bw != nil {
  106. return o.bw.WriteByte(c)
  107. }
  108. _, err = o.w.Write([]byte{c})
  109. return
  110. }
  111. func (o *simpleIoEncWriterWriter) WriteString(s string) (n int, err error) {
  112. if o.sw != nil {
  113. return o.sw.WriteString(s)
  114. }
  115. // return o.w.Write([]byte(s))
  116. return o.w.Write(bytesView(s))
  117. }
  118. func (o *simpleIoEncWriterWriter) Write(p []byte) (n int, err error) {
  119. return o.w.Write(p)
  120. }
  121. // ----------------------------------------
  122. // ioEncWriter implements encWriter and can write to an io.Writer implementation
  123. type ioEncWriter struct {
  124. w ioEncWriterWriter
  125. // x [8]byte // temp byte array re-used internally for efficiency
  126. }
  127. func (z *ioEncWriter) writeb(bs []byte) {
  128. if len(bs) == 0 {
  129. return
  130. }
  131. n, err := z.w.Write(bs)
  132. if err != nil {
  133. panic(err)
  134. }
  135. if n != len(bs) {
  136. panic(fmt.Errorf("incorrect num bytes written. Expecting: %v, Wrote: %v", len(bs), n))
  137. }
  138. }
  139. func (z *ioEncWriter) writestr(s string) {
  140. n, err := z.w.WriteString(s)
  141. if err != nil {
  142. panic(err)
  143. }
  144. if n != len(s) {
  145. panic(fmt.Errorf("incorrect num bytes written. Expecting: %v, Wrote: %v", len(s), n))
  146. }
  147. }
  148. func (z *ioEncWriter) writen1(b byte) {
  149. if err := z.w.WriteByte(b); err != nil {
  150. panic(err)
  151. }
  152. }
  153. func (z *ioEncWriter) writen2(b1 byte, b2 byte) {
  154. z.writen1(b1)
  155. z.writen1(b2)
  156. }
  157. func (z *ioEncWriter) atEndOfEncode() {}
  158. // ----------------------------------------
  159. // bytesEncWriter implements encWriter and can write to an byte slice.
  160. // It is used by Marshal function.
  161. type bytesEncWriter struct {
  162. b []byte
  163. c int // cursor
  164. out *[]byte // write out on atEndOfEncode
  165. }
  166. func (z *bytesEncWriter) writeb(s []byte) {
  167. if len(s) > 0 {
  168. c := z.grow(len(s))
  169. copy(z.b[c:], s)
  170. }
  171. }
  172. func (z *bytesEncWriter) writestr(s string) {
  173. if len(s) > 0 {
  174. c := z.grow(len(s))
  175. copy(z.b[c:], s)
  176. }
  177. }
  178. func (z *bytesEncWriter) writen1(b1 byte) {
  179. c := z.grow(1)
  180. z.b[c] = b1
  181. }
  182. func (z *bytesEncWriter) writen2(b1 byte, b2 byte) {
  183. c := z.grow(2)
  184. z.b[c] = b1
  185. z.b[c+1] = b2
  186. }
  187. func (z *bytesEncWriter) atEndOfEncode() {
  188. *(z.out) = z.b[:z.c]
  189. }
  190. func (z *bytesEncWriter) grow(n int) (oldcursor int) {
  191. oldcursor = z.c
  192. z.c = oldcursor + n
  193. if z.c > len(z.b) {
  194. if z.c > cap(z.b) {
  195. // Tried using appendslice logic: (if cap < 1024, *2, else *1.25).
  196. // However, it was too expensive, causing too many iterations of copy.
  197. // Using bytes.Buffer model was much better (2*cap + n)
  198. bs := make([]byte, 2*cap(z.b)+n)
  199. copy(bs, z.b[:oldcursor])
  200. z.b = bs
  201. } else {
  202. z.b = z.b[:cap(z.b)]
  203. }
  204. }
  205. return
  206. }
  207. // ---------------------------------------------
  208. type encFnInfoX struct {
  209. e *Encoder
  210. ti *typeInfo
  211. xfFn Ext
  212. xfTag uint64
  213. seq seqType
  214. }
  215. type encFnInfo struct {
  216. // use encFnInfo as a value receiver.
  217. // keep most of it less-used variables accessible via a pointer (*encFnInfoX).
  218. // As sweet spot for value-receiver is 3 words, keep everything except
  219. // encDriver (which everyone needs) directly accessible.
  220. // ensure encFnInfoX is set for everyone who needs it i.e.
  221. // rawExt, ext, builtin, (selfer|binary|text)Marshal, kSlice, kStruct, kMap, kInterface, fastpath
  222. ee encDriver
  223. *encFnInfoX
  224. }
  225. func (f encFnInfo) builtin(rv reflect.Value) {
  226. f.ee.EncodeBuiltin(f.ti.rtid, rv.Interface())
  227. }
  228. func (f encFnInfo) rawExt(rv reflect.Value) {
  229. f.ee.EncodeRawExt(rv.Interface().(*RawExt), f.e)
  230. }
  231. func (f encFnInfo) ext(rv reflect.Value) {
  232. // if this is a struct and it was addressable, then pass the address directly (not the value)
  233. if rv.CanAddr() && rv.Kind() == reflect.Struct {
  234. rv = rv.Addr()
  235. }
  236. f.ee.EncodeExt(rv.Interface(), f.xfTag, f.xfFn, f.e)
  237. }
  238. func (f encFnInfo) getValueForMarshalInterface(rv reflect.Value, indir int8) (v interface{}, proceed bool) {
  239. if indir == 0 {
  240. v = rv.Interface()
  241. } else if indir == -1 {
  242. v = rv.Addr().Interface()
  243. } else {
  244. for j := int8(0); j < indir; j++ {
  245. if rv.IsNil() {
  246. f.ee.EncodeNil()
  247. return
  248. }
  249. rv = rv.Elem()
  250. }
  251. v = rv.Interface()
  252. }
  253. return v, true
  254. }
  255. func (f encFnInfo) selferMarshal(rv reflect.Value) {
  256. if v, proceed := f.getValueForMarshalInterface(rv, f.ti.csIndir); proceed {
  257. v.(Selfer).CodecEncodeSelf(f.e)
  258. }
  259. }
  260. func (f encFnInfo) binaryMarshal(rv reflect.Value) {
  261. if v, proceed := f.getValueForMarshalInterface(rv, f.ti.bmIndir); proceed {
  262. bs, fnerr := v.(encoding.BinaryMarshaler).MarshalBinary()
  263. if fnerr != nil {
  264. panic(fnerr)
  265. }
  266. if bs == nil {
  267. f.ee.EncodeNil()
  268. } else {
  269. f.ee.EncodeStringBytes(c_RAW, bs)
  270. }
  271. }
  272. }
  273. func (f encFnInfo) textMarshal(rv reflect.Value) {
  274. if v, proceed := f.getValueForMarshalInterface(rv, f.ti.tmIndir); proceed {
  275. // debugf(">>>> encoding.TextMarshaler: %T", rv.Interface())
  276. bs, fnerr := v.(encoding.TextMarshaler).MarshalText()
  277. if fnerr != nil {
  278. panic(fnerr)
  279. }
  280. if bs == nil {
  281. f.ee.EncodeNil()
  282. } else {
  283. f.ee.EncodeStringBytes(c_UTF8, bs)
  284. }
  285. }
  286. }
  287. func (f encFnInfo) kBool(rv reflect.Value) {
  288. f.ee.EncodeBool(rv.Bool())
  289. }
  290. func (f encFnInfo) kString(rv reflect.Value) {
  291. f.ee.EncodeString(c_UTF8, rv.String())
  292. }
  293. func (f encFnInfo) kFloat64(rv reflect.Value) {
  294. f.ee.EncodeFloat64(rv.Float())
  295. }
  296. func (f encFnInfo) kFloat32(rv reflect.Value) {
  297. f.ee.EncodeFloat32(float32(rv.Float()))
  298. }
  299. func (f encFnInfo) kInt(rv reflect.Value) {
  300. f.ee.EncodeInt(rv.Int())
  301. }
  302. func (f encFnInfo) kUint(rv reflect.Value) {
  303. f.ee.EncodeUint(rv.Uint())
  304. }
  305. func (f encFnInfo) kInvalid(rv reflect.Value) {
  306. f.ee.EncodeNil()
  307. }
  308. func (f encFnInfo) kErr(rv reflect.Value) {
  309. f.e.errorf("unsupported kind %s, for %#v", rv.Kind(), rv)
  310. }
  311. func (f encFnInfo) kSlice(rv reflect.Value) {
  312. ti := f.ti
  313. // array may be non-addressable, so we have to manage with care
  314. // (don't call rv.Bytes, rv.Slice, etc).
  315. // E.g. type struct S{B [2]byte};
  316. // Encode(S{}) will bomb on "panic: slice of unaddressable array".
  317. if f.seq != seqTypeArray {
  318. if rv.IsNil() {
  319. f.ee.EncodeNil()
  320. return
  321. }
  322. // If in this method, then there was no extension function defined.
  323. // So it's okay to treat as []byte.
  324. if ti.rtid == uint8SliceTypId {
  325. f.ee.EncodeStringBytes(c_RAW, rv.Bytes())
  326. return
  327. }
  328. }
  329. rtelem := ti.rt.Elem()
  330. l := rv.Len()
  331. if rtelem.Kind() == reflect.Uint8 {
  332. switch f.seq {
  333. case seqTypeArray:
  334. // if l == 0 { f.ee.encodeStringBytes(c_RAW, nil) } else
  335. if rv.CanAddr() {
  336. f.ee.EncodeStringBytes(c_RAW, rv.Slice(0, l).Bytes())
  337. } else {
  338. var bs []byte
  339. if l <= cap(f.e.b) {
  340. bs = f.e.b[:l]
  341. } else {
  342. bs = make([]byte, l)
  343. }
  344. reflect.Copy(reflect.ValueOf(bs), rv)
  345. // TODO: Test that reflect.Copy works instead of manual one-by-one
  346. // for i := 0; i < l; i++ {
  347. // bs[i] = byte(rv.Index(i).Uint())
  348. // }
  349. f.ee.EncodeStringBytes(c_RAW, bs)
  350. }
  351. case seqTypeSlice:
  352. f.ee.EncodeStringBytes(c_RAW, rv.Bytes())
  353. case seqTypeChan:
  354. bs := f.e.b[:0]
  355. // do not use range, so that the number of elements encoded
  356. // does not change, and encoding does not hang waiting on someone to close chan.
  357. // for b := range rv.Interface().(<-chan byte) {
  358. // bs = append(bs, b)
  359. // }
  360. ch := rv.Interface().(<-chan byte)
  361. for i := 0; i < l; i++ {
  362. bs = append(bs, <-ch)
  363. }
  364. f.ee.EncodeStringBytes(c_RAW, bs)
  365. }
  366. return
  367. }
  368. if ti.mbs {
  369. if l%2 == 1 {
  370. f.e.errorf("mapBySlice requires even slice length, but got %v", l)
  371. return
  372. }
  373. f.ee.EncodeMapStart(l / 2)
  374. } else {
  375. f.ee.EncodeArrayStart(l)
  376. }
  377. e := f.e
  378. sep := !e.be
  379. if l > 0 {
  380. for rtelem.Kind() == reflect.Ptr {
  381. rtelem = rtelem.Elem()
  382. }
  383. // if kind is reflect.Interface, do not pre-determine the
  384. // encoding type, because preEncodeValue may break it down to
  385. // a concrete type and kInterface will bomb.
  386. var fn encFn
  387. if rtelem.Kind() != reflect.Interface {
  388. rtelemid := reflect.ValueOf(rtelem).Pointer()
  389. fn = e.getEncFn(rtelemid, rtelem, true)
  390. }
  391. // TODO: Consider perf implication of encoding odd index values as symbols if type is string
  392. if sep {
  393. for j := 0; j < l; j++ {
  394. if j > 0 {
  395. if ti.mbs {
  396. if j%2 == 0 {
  397. f.ee.EncodeMapEntrySeparator()
  398. } else {
  399. f.ee.EncodeMapKVSeparator()
  400. }
  401. } else {
  402. f.ee.EncodeArrayEntrySeparator()
  403. }
  404. }
  405. if f.seq == seqTypeChan {
  406. if rv2, ok2 := rv.Recv(); ok2 {
  407. e.encodeValue(rv2, fn)
  408. }
  409. } else {
  410. e.encodeValue(rv.Index(j), fn)
  411. }
  412. }
  413. } else {
  414. for j := 0; j < l; j++ {
  415. if f.seq == seqTypeChan {
  416. if rv2, ok2 := rv.Recv(); ok2 {
  417. e.encodeValue(rv2, fn)
  418. }
  419. } else {
  420. e.encodeValue(rv.Index(j), fn)
  421. }
  422. }
  423. }
  424. }
  425. if sep {
  426. if ti.mbs {
  427. f.ee.EncodeMapEnd()
  428. } else {
  429. f.ee.EncodeArrayEnd()
  430. }
  431. }
  432. }
  433. func (f encFnInfo) kStruct(rv reflect.Value) {
  434. fti := f.ti
  435. e := f.e
  436. tisfi := fti.sfip
  437. toMap := !(fti.toArray || e.h.StructToArray)
  438. newlen := len(fti.sfi)
  439. // Use sync.Pool to reduce allocating slices unnecessarily.
  440. // The cost of the occasional locking is less than the cost of locking.
  441. var rvals []reflect.Value
  442. var encnames []string
  443. var pool *sync.Pool
  444. var poolv interface{}
  445. idxpool := newlen / 8
  446. if encStructPoolLen != 4 {
  447. panic(errors.New("encStructPoolLen must be equal to 4")) // defensive, in case it is changed
  448. }
  449. if idxpool < encStructPoolLen {
  450. pool = &encStructPool[idxpool]
  451. poolv = pool.Get()
  452. switch vv := poolv.(type) {
  453. case *encStructPool8:
  454. rvals = vv.r[:newlen]
  455. if toMap {
  456. encnames = vv.s[:newlen]
  457. }
  458. case *encStructPool16:
  459. rvals = vv.r[:newlen]
  460. if toMap {
  461. encnames = vv.s[:newlen]
  462. }
  463. case *encStructPool32:
  464. rvals = vv.r[:newlen]
  465. if toMap {
  466. encnames = vv.s[:newlen]
  467. }
  468. case *encStructPool64:
  469. rvals = vv.r[:newlen]
  470. if toMap {
  471. encnames = vv.s[:newlen]
  472. }
  473. }
  474. }
  475. if rvals == nil {
  476. rvals = make([]reflect.Value, newlen)
  477. }
  478. // if toMap, use the sorted array. If toArray, use unsorted array (to match sequence in struct)
  479. if toMap {
  480. tisfi = fti.sfi
  481. if encnames == nil {
  482. encnames = make([]string, newlen)
  483. }
  484. }
  485. newlen = 0
  486. for _, si := range tisfi {
  487. rvals[newlen] = si.field(rv, false)
  488. // if si.i != -1 {
  489. // rvals[newlen] = rv.Field(int(si.i))
  490. // } else {
  491. // rvals[newlen] = rv.FieldByIndex(si.is)
  492. // }
  493. if toMap {
  494. if si.omitEmpty && isEmptyValue(rvals[newlen]) {
  495. continue
  496. }
  497. encnames[newlen] = si.encName
  498. } else {
  499. // use the zero value.
  500. // if a reference or struct, set to nil (so you do not output too much)
  501. if si.omitEmpty && isEmptyValue(rvals[newlen]) {
  502. switch rvals[newlen].Kind() {
  503. case reflect.Struct, reflect.Interface, reflect.Ptr, reflect.Array,
  504. reflect.Map, reflect.Slice:
  505. rvals[newlen] = reflect.Value{} //encode as nil
  506. }
  507. }
  508. }
  509. newlen++
  510. }
  511. // debugf(">>>> kStruct: newlen: %v", newlen)
  512. sep := !e.be
  513. ee := f.ee //don't dereference everytime
  514. if sep {
  515. if toMap {
  516. ee.EncodeMapStart(newlen)
  517. // asSymbols := e.h.AsSymbols&AsSymbolStructFieldNameFlag != 0
  518. asSymbols := e.h.AsSymbols == AsSymbolDefault || e.h.AsSymbols&AsSymbolStructFieldNameFlag != 0
  519. for j := 0; j < newlen; j++ {
  520. if j > 0 {
  521. ee.EncodeMapEntrySeparator()
  522. }
  523. if asSymbols {
  524. ee.EncodeSymbol(encnames[j])
  525. } else {
  526. ee.EncodeString(c_UTF8, encnames[j])
  527. }
  528. ee.EncodeMapKVSeparator()
  529. e.encodeValue(rvals[j], encFn{})
  530. }
  531. ee.EncodeMapEnd()
  532. } else {
  533. ee.EncodeArrayStart(newlen)
  534. for j := 0; j < newlen; j++ {
  535. if j > 0 {
  536. ee.EncodeArrayEntrySeparator()
  537. }
  538. e.encodeValue(rvals[j], encFn{})
  539. }
  540. ee.EncodeArrayEnd()
  541. }
  542. } else {
  543. if toMap {
  544. ee.EncodeMapStart(newlen)
  545. // asSymbols := e.h.AsSymbols&AsSymbolStructFieldNameFlag != 0
  546. asSymbols := e.h.AsSymbols == AsSymbolDefault || e.h.AsSymbols&AsSymbolStructFieldNameFlag != 0
  547. for j := 0; j < newlen; j++ {
  548. if asSymbols {
  549. ee.EncodeSymbol(encnames[j])
  550. } else {
  551. ee.EncodeString(c_UTF8, encnames[j])
  552. }
  553. e.encodeValue(rvals[j], encFn{})
  554. }
  555. } else {
  556. ee.EncodeArrayStart(newlen)
  557. for j := 0; j < newlen; j++ {
  558. e.encodeValue(rvals[j], encFn{})
  559. }
  560. }
  561. }
  562. // do not use defer. Instead, use explicit pool return at end of function.
  563. // defer has a cost we are trying to avoid.
  564. // If there is a panic and these slices are not returned, it is ok.
  565. if pool != nil {
  566. pool.Put(poolv)
  567. }
  568. }
  569. // func (f encFnInfo) kPtr(rv reflect.Value) {
  570. // debugf(">>>>>>> ??? encode kPtr called - shouldn't get called")
  571. // if rv.IsNil() {
  572. // f.ee.encodeNil()
  573. // return
  574. // }
  575. // f.e.encodeValue(rv.Elem())
  576. // }
  577. func (f encFnInfo) kInterface(rv reflect.Value) {
  578. if rv.IsNil() {
  579. f.ee.EncodeNil()
  580. return
  581. }
  582. f.e.encodeValue(rv.Elem(), encFn{})
  583. }
  584. func (f encFnInfo) kMap(rv reflect.Value) {
  585. if rv.IsNil() {
  586. f.ee.EncodeNil()
  587. return
  588. }
  589. l := rv.Len()
  590. f.ee.EncodeMapStart(l)
  591. e := f.e
  592. sep := !e.be
  593. if l == 0 {
  594. if sep {
  595. f.ee.EncodeMapEnd()
  596. }
  597. return
  598. }
  599. var asSymbols bool
  600. // determine the underlying key and val encFn's for the map.
  601. // This eliminates some work which is done for each loop iteration i.e.
  602. // rv.Type(), ref.ValueOf(rt).Pointer(), then check map/list for fn.
  603. //
  604. // However, if kind is reflect.Interface, do not pre-determine the
  605. // encoding type, because preEncodeValue may break it down to
  606. // a concrete type and kInterface will bomb.
  607. var keyFn, valFn encFn
  608. ti := f.ti
  609. rtkey := ti.rt.Key()
  610. rtval := ti.rt.Elem()
  611. rtkeyid := reflect.ValueOf(rtkey).Pointer()
  612. // keyTypeIsString := f.ti.rt.Key().Kind() == reflect.String
  613. var keyTypeIsString = rtkeyid == stringTypId
  614. if keyTypeIsString {
  615. asSymbols = e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0
  616. } else {
  617. for rtkey.Kind() == reflect.Ptr {
  618. rtkey = rtkey.Elem()
  619. }
  620. if rtkey.Kind() != reflect.Interface {
  621. rtkeyid = reflect.ValueOf(rtkey).Pointer()
  622. keyFn = e.getEncFn(rtkeyid, rtkey, true)
  623. }
  624. }
  625. for rtval.Kind() == reflect.Ptr {
  626. rtval = rtval.Elem()
  627. }
  628. if rtval.Kind() != reflect.Interface {
  629. rtvalid := reflect.ValueOf(rtval).Pointer()
  630. valFn = e.getEncFn(rtvalid, rtval, true)
  631. }
  632. mks := rv.MapKeys()
  633. // for j, lmks := 0, len(mks); j < lmks; j++ {
  634. ee := f.ee //don't dereference everytime
  635. if sep {
  636. for j := range mks {
  637. if j > 0 {
  638. ee.EncodeMapEntrySeparator()
  639. }
  640. if keyTypeIsString {
  641. if asSymbols {
  642. ee.EncodeSymbol(mks[j].String())
  643. } else {
  644. ee.EncodeString(c_UTF8, mks[j].String())
  645. }
  646. } else {
  647. e.encodeValue(mks[j], keyFn)
  648. }
  649. ee.EncodeMapKVSeparator()
  650. e.encodeValue(rv.MapIndex(mks[j]), valFn)
  651. }
  652. ee.EncodeMapEnd()
  653. } else {
  654. for j := range mks {
  655. if keyTypeIsString {
  656. if asSymbols {
  657. ee.EncodeSymbol(mks[j].String())
  658. } else {
  659. ee.EncodeString(c_UTF8, mks[j].String())
  660. }
  661. } else {
  662. e.encodeValue(mks[j], keyFn)
  663. }
  664. e.encodeValue(rv.MapIndex(mks[j]), valFn)
  665. }
  666. }
  667. }
  668. // --------------------------------------------------
  669. // encFn encapsulates the captured variables and the encode function.
  670. // This way, we only do some calculations one times, and pass to the
  671. // code block that should be called (encapsulated in a function)
  672. // instead of executing the checks every time.
  673. type encFn struct {
  674. i encFnInfo
  675. f func(encFnInfo, reflect.Value)
  676. }
  677. // --------------------------------------------------
  678. type rtidEncFn struct {
  679. rtid uintptr
  680. fn encFn
  681. }
  682. // An Encoder writes an object to an output stream in the codec format.
  683. type Encoder struct {
  684. // hopefully, reduce derefencing cost by laying the encWriter inside the Encoder
  685. e encDriver
  686. w encWriter
  687. s []rtidEncFn
  688. be bool // is binary encoding
  689. wi ioEncWriter
  690. wb bytesEncWriter
  691. h *BasicHandle
  692. hh Handle
  693. f map[uintptr]encFn
  694. b [scratchByteArrayLen]byte
  695. }
  696. // NewEncoder returns an Encoder for encoding into an io.Writer.
  697. //
  698. // For efficiency, Users are encouraged to pass in a memory buffered writer
  699. // (eg bufio.Writer, bytes.Buffer).
  700. func NewEncoder(w io.Writer, h Handle) *Encoder {
  701. e := &Encoder{hh: h, h: h.getBasicHandle(), be: h.isBinary()}
  702. ww, ok := w.(ioEncWriterWriter)
  703. if !ok {
  704. sww := simpleIoEncWriterWriter{w: w}
  705. sww.bw, _ = w.(io.ByteWriter)
  706. sww.sw, _ = w.(ioEncStringWriter)
  707. ww = &sww
  708. //ww = bufio.NewWriterSize(w, defEncByteBufSize)
  709. }
  710. e.wi.w = ww
  711. e.w = &e.wi
  712. e.e = h.newEncDriver(e)
  713. return e
  714. }
  715. // NewEncoderBytes returns an encoder for encoding directly and efficiently
  716. // into a byte slice, using zero-copying to temporary slices.
  717. //
  718. // It will potentially replace the output byte slice pointed to.
  719. // After encoding, the out parameter contains the encoded contents.
  720. func NewEncoderBytes(out *[]byte, h Handle) *Encoder {
  721. e := &Encoder{hh: h, h: h.getBasicHandle(), be: h.isBinary()}
  722. in := *out
  723. if in == nil {
  724. in = make([]byte, defEncByteBufSize)
  725. }
  726. e.wb.b, e.wb.out = in, out
  727. e.w = &e.wb
  728. e.e = h.newEncDriver(e)
  729. return e
  730. }
  731. // Encode writes an object into a stream.
  732. //
  733. // Encoding can be configured via the struct tag for the fields.
  734. // The "codec" key in struct field's tag value is the key name,
  735. // followed by an optional comma and options.
  736. // Note that the "json" key is used in the absence of the "codec" key.
  737. //
  738. // To set an option on all fields (e.g. omitempty on all fields), you
  739. // can create a field called _struct, and set flags on it.
  740. //
  741. // Struct values "usually" encode as maps. Each exported struct field is encoded unless:
  742. // - the field's tag is "-", OR
  743. // - the field is empty (empty or the zero value) and its tag specifies the "omitempty" option.
  744. //
  745. // When encoding as a map, the first string in the tag (before the comma)
  746. // is the map key string to use when encoding.
  747. //
  748. // However, struct values may encode as arrays. This happens when:
  749. // - StructToArray Encode option is set, OR
  750. // - the tag on the _struct field sets the "toarray" option
  751. //
  752. // Values with types that implement MapBySlice are encoded as stream maps.
  753. //
  754. // The empty values (for omitempty option) are false, 0, any nil pointer
  755. // or interface value, and any array, slice, map, or string of length zero.
  756. //
  757. // Anonymous fields are encoded inline if no struct tag is present.
  758. // Else they are encoded as regular fields.
  759. //
  760. // Examples:
  761. //
  762. // // NOTE: 'json:' can be used as struct tag key, in place 'codec:' below.
  763. // type MyStruct struct {
  764. // _struct bool `codec:",omitempty"` //set omitempty for every field
  765. // Field1 string `codec:"-"` //skip this field
  766. // Field2 int `codec:"myName"` //Use key "myName" in encode stream
  767. // Field3 int32 `codec:",omitempty"` //use key "Field3". Omit if empty.
  768. // Field4 bool `codec:"f4,omitempty"` //use key "f4". Omit if empty.
  769. // ...
  770. // }
  771. //
  772. // type MyStruct struct {
  773. // _struct bool `codec:",omitempty,toarray"` //set omitempty for every field
  774. // //and encode struct as an array
  775. // }
  776. //
  777. // The mode of encoding is based on the type of the value. When a value is seen:
  778. // - If an extension is registered for it, call that extension function
  779. // - If it implements BinaryMarshaler, call its MarshalBinary() (data []byte, err error)
  780. // - Else encode it based on its reflect.Kind
  781. //
  782. // Note that struct field names and keys in map[string]XXX will be treated as symbols.
  783. // Some formats support symbols (e.g. binc) and will properly encode the string
  784. // only once in the stream, and use a tag to refer to it thereafter.
  785. func (e *Encoder) Encode(v interface{}) (err error) {
  786. defer panicToErr(&err)
  787. e.encode(v)
  788. e.w.atEndOfEncode()
  789. return
  790. }
  791. // MustEncode is like Encode, but panics if unable to Encode.
  792. // This provides insight to the code location that triggered the error.
  793. func (e *Encoder) MustEncode(v interface{}) {
  794. e.encode(v)
  795. e.w.atEndOfEncode()
  796. }
  797. // comment out these (Must)Write methods. They were only put there to support cbor.
  798. // However, users already have access to the streams, and can write directly.
  799. //
  800. // // Write allows users write to the Encoder stream directly.
  801. // func (e *Encoder) Write(bs []byte) (err error) {
  802. // defer panicToErr(&err)
  803. // e.w.writeb(bs)
  804. // return
  805. // }
  806. // // MustWrite is like write, but panics if unable to Write.
  807. // func (e *Encoder) MustWrite(bs []byte) {
  808. // e.w.writeb(bs)
  809. // }
  810. func (e *Encoder) encode(iv interface{}) {
  811. // if ics, ok := iv.(Selfer); ok {
  812. // ics.CodecEncodeSelf(e)
  813. // return
  814. // }
  815. switch v := iv.(type) {
  816. case nil:
  817. e.e.EncodeNil()
  818. case Selfer:
  819. v.CodecEncodeSelf(e)
  820. case reflect.Value:
  821. e.encodeValue(v, encFn{})
  822. case string:
  823. e.e.EncodeString(c_UTF8, v)
  824. case bool:
  825. e.e.EncodeBool(v)
  826. case int:
  827. e.e.EncodeInt(int64(v))
  828. case int8:
  829. e.e.EncodeInt(int64(v))
  830. case int16:
  831. e.e.EncodeInt(int64(v))
  832. case int32:
  833. e.e.EncodeInt(int64(v))
  834. case int64:
  835. e.e.EncodeInt(v)
  836. case uint:
  837. e.e.EncodeUint(uint64(v))
  838. case uint8:
  839. e.e.EncodeUint(uint64(v))
  840. case uint16:
  841. e.e.EncodeUint(uint64(v))
  842. case uint32:
  843. e.e.EncodeUint(uint64(v))
  844. case uint64:
  845. e.e.EncodeUint(v)
  846. case float32:
  847. e.e.EncodeFloat32(v)
  848. case float64:
  849. e.e.EncodeFloat64(v)
  850. case []uint8:
  851. e.e.EncodeStringBytes(c_RAW, v)
  852. case *string:
  853. e.e.EncodeString(c_UTF8, *v)
  854. case *bool:
  855. e.e.EncodeBool(*v)
  856. case *int:
  857. e.e.EncodeInt(int64(*v))
  858. case *int8:
  859. e.e.EncodeInt(int64(*v))
  860. case *int16:
  861. e.e.EncodeInt(int64(*v))
  862. case *int32:
  863. e.e.EncodeInt(int64(*v))
  864. case *int64:
  865. e.e.EncodeInt(*v)
  866. case *uint:
  867. e.e.EncodeUint(uint64(*v))
  868. case *uint8:
  869. e.e.EncodeUint(uint64(*v))
  870. case *uint16:
  871. e.e.EncodeUint(uint64(*v))
  872. case *uint32:
  873. e.e.EncodeUint(uint64(*v))
  874. case *uint64:
  875. e.e.EncodeUint(*v)
  876. case *float32:
  877. e.e.EncodeFloat32(*v)
  878. case *float64:
  879. e.e.EncodeFloat64(*v)
  880. case *[]uint8:
  881. e.e.EncodeStringBytes(c_RAW, *v)
  882. default:
  883. if !fastpathEncodeTypeSwitch(iv, e) {
  884. e.encodeI(iv, false)
  885. }
  886. }
  887. }
  888. func (e *Encoder) encodeI(iv interface{}, encFnCheckAll bool) {
  889. if rv, proceed := e.preEncodeValue(reflect.ValueOf(iv)); proceed {
  890. rt := rv.Type()
  891. rtid := reflect.ValueOf(rt).Pointer()
  892. fn := e.getEncFn(rtid, rt, encFnCheckAll)
  893. fn.f(fn.i, rv)
  894. }
  895. }
  896. func (e *Encoder) preEncodeValue(rv reflect.Value) (rv2 reflect.Value, proceed bool) {
  897. LOOP:
  898. for {
  899. switch rv.Kind() {
  900. case reflect.Ptr, reflect.Interface:
  901. if rv.IsNil() {
  902. e.e.EncodeNil()
  903. return
  904. }
  905. rv = rv.Elem()
  906. continue LOOP
  907. case reflect.Slice, reflect.Map:
  908. if rv.IsNil() {
  909. e.e.EncodeNil()
  910. return
  911. }
  912. case reflect.Invalid, reflect.Func:
  913. e.e.EncodeNil()
  914. return
  915. }
  916. break
  917. }
  918. return rv, true
  919. }
  920. func (e *Encoder) encodeValue(rv reflect.Value, fn encFn) {
  921. // if a valid fn is passed, it MUST BE for the dereferenced type of rv
  922. if rv, proceed := e.preEncodeValue(rv); proceed {
  923. if fn.f == nil {
  924. rt := rv.Type()
  925. rtid := reflect.ValueOf(rt).Pointer()
  926. fn = e.getEncFn(rtid, rt, true)
  927. }
  928. fn.f(fn.i, rv)
  929. }
  930. }
  931. func (e *Encoder) getEncFn(rtid uintptr, rt reflect.Type, checkAll bool) (fn encFn) {
  932. // rtid := reflect.ValueOf(rt).Pointer()
  933. var ok bool
  934. if useMapForCodecCache {
  935. fn, ok = e.f[rtid]
  936. } else {
  937. for _, v := range e.s {
  938. if v.rtid == rtid {
  939. fn, ok = v.fn, true
  940. break
  941. }
  942. }
  943. }
  944. if ok {
  945. return
  946. }
  947. // fi.encFnInfoX = new(encFnInfoX)
  948. ti := getTypeInfo(rtid, rt)
  949. var fi encFnInfo
  950. fi.ee = e.e
  951. if checkAll && ti.cs {
  952. fi.encFnInfoX = &encFnInfoX{e: e, ti: ti}
  953. fn.f = (encFnInfo).selferMarshal
  954. } else if rtid == rawExtTypId {
  955. fi.encFnInfoX = &encFnInfoX{e: e, ti: ti}
  956. fn.f = (encFnInfo).rawExt
  957. } else if e.e.IsBuiltinType(rtid) {
  958. fi.encFnInfoX = &encFnInfoX{e: e, ti: ti}
  959. fn.f = (encFnInfo).builtin
  960. } else if xfFn := e.h.getExt(rtid); xfFn != nil {
  961. // fi.encFnInfoX = new(encFnInfoX)
  962. fi.encFnInfoX = &encFnInfoX{e: e, ti: ti}
  963. fi.xfTag, fi.xfFn = xfFn.tag, xfFn.ext
  964. fn.f = (encFnInfo).ext
  965. } else if supportMarshalInterfaces && e.be && ti.bm {
  966. fi.encFnInfoX = &encFnInfoX{e: e, ti: ti}
  967. fn.f = (encFnInfo).binaryMarshal
  968. } else if supportMarshalInterfaces && !e.be && ti.tm {
  969. fi.encFnInfoX = &encFnInfoX{e: e, ti: ti}
  970. fn.f = (encFnInfo).textMarshal
  971. } else {
  972. rk := rt.Kind()
  973. if fastpathEnabled && checkAll && (rk == reflect.Map || rk == reflect.Slice) {
  974. if rt.PkgPath() == "" {
  975. if idx := fastpathAV.index(rtid); idx != -1 {
  976. fi.encFnInfoX = &encFnInfoX{e: e, ti: ti}
  977. fn.f = fastpathAV[idx].encfn
  978. }
  979. } else {
  980. ok = false
  981. // use mapping for underlying type if there
  982. var rtu reflect.Type
  983. if rk == reflect.Map {
  984. rtu = reflect.MapOf(rt.Key(), rt.Elem())
  985. } else {
  986. rtu = reflect.SliceOf(rt.Elem())
  987. }
  988. rtuid := reflect.ValueOf(rtu).Pointer()
  989. if idx := fastpathAV.index(rtuid); idx != -1 {
  990. xfnf := fastpathAV[idx].encfn
  991. xrt := fastpathAV[idx].rt
  992. fi.encFnInfoX = &encFnInfoX{e: e, ti: ti}
  993. fn.f = func(xf encFnInfo, xrv reflect.Value) {
  994. xfnf(xf, xrv.Convert(xrt))
  995. }
  996. }
  997. }
  998. }
  999. if fn.f == nil {
  1000. switch rk {
  1001. case reflect.Bool:
  1002. fn.f = (encFnInfo).kBool
  1003. case reflect.String:
  1004. fn.f = (encFnInfo).kString
  1005. case reflect.Float64:
  1006. fn.f = (encFnInfo).kFloat64
  1007. case reflect.Float32:
  1008. fn.f = (encFnInfo).kFloat32
  1009. case reflect.Int, reflect.Int8, reflect.Int64, reflect.Int32, reflect.Int16:
  1010. fn.f = (encFnInfo).kInt
  1011. case reflect.Uint8, reflect.Uint64, reflect.Uint, reflect.Uint32, reflect.Uint16:
  1012. fn.f = (encFnInfo).kUint
  1013. case reflect.Invalid:
  1014. fn.f = (encFnInfo).kInvalid
  1015. case reflect.Chan:
  1016. fi.encFnInfoX = &encFnInfoX{e: e, ti: ti, seq: seqTypeChan}
  1017. fn.f = (encFnInfo).kSlice
  1018. case reflect.Slice:
  1019. fi.encFnInfoX = &encFnInfoX{e: e, ti: ti, seq: seqTypeSlice}
  1020. fn.f = (encFnInfo).kSlice
  1021. case reflect.Array:
  1022. fi.encFnInfoX = &encFnInfoX{e: e, ti: ti, seq: seqTypeArray}
  1023. fn.f = (encFnInfo).kSlice
  1024. case reflect.Struct:
  1025. fi.encFnInfoX = &encFnInfoX{e: e, ti: ti}
  1026. fn.f = (encFnInfo).kStruct
  1027. // case reflect.Ptr:
  1028. // fn.f = (encFnInfo).kPtr
  1029. case reflect.Interface:
  1030. fi.encFnInfoX = &encFnInfoX{e: e, ti: ti}
  1031. fn.f = (encFnInfo).kInterface
  1032. case reflect.Map:
  1033. fi.encFnInfoX = &encFnInfoX{e: e, ti: ti}
  1034. fn.f = (encFnInfo).kMap
  1035. default:
  1036. fn.f = (encFnInfo).kErr
  1037. }
  1038. }
  1039. }
  1040. fn.i = fi
  1041. if useMapForCodecCache {
  1042. if e.f == nil {
  1043. e.f = make(map[uintptr]encFn, 32)
  1044. }
  1045. e.f[rtid] = fn
  1046. } else {
  1047. if e.s == nil {
  1048. e.s = make([]rtidEncFn, 0, 32)
  1049. }
  1050. e.s = append(e.s, rtidEncFn{rtid, fn})
  1051. }
  1052. return
  1053. }
  1054. func (e *Encoder) errorf(format string, params ...interface{}) {
  1055. err := fmt.Errorf(format, params...)
  1056. panic(err)
  1057. }
  1058. // ----------------------------------------
  1059. const encStructPoolLen = 4
  1060. // encStructPool is an array of sync.Pool.
  1061. // Each element of the array pools one of encStructPool(8|16|32|64).
  1062. // It allows the re-use of slices up to 64 in length.
  1063. // A performance cost of encoding structs was collecting
  1064. // which values were empty and should be omitted.
  1065. // We needed slices of reflect.Value and string to collect them.
  1066. // This shared pool reduces the amount of unnecessary creation we do.
  1067. // The cost is that of locking sometimes, but sync.Pool is efficient
  1068. // enough to reduce thread contention.
  1069. var encStructPool [encStructPoolLen]sync.Pool
  1070. type encStructPool8 struct {
  1071. r [8]reflect.Value
  1072. s [8]string
  1073. }
  1074. type encStructPool16 struct {
  1075. r [16]reflect.Value
  1076. s [16]string
  1077. }
  1078. type encStructPool32 struct {
  1079. r [32]reflect.Value
  1080. s [32]string
  1081. }
  1082. type encStructPool64 struct {
  1083. r [64]reflect.Value
  1084. s [64]string
  1085. }
  1086. func init() {
  1087. encStructPool[0].New = func() interface{} { return new(encStructPool8) }
  1088. encStructPool[1].New = func() interface{} { return new(encStructPool16) }
  1089. encStructPool[2].New = func() interface{} { return new(encStructPool32) }
  1090. encStructPool[3].New = func() interface{} { return new(encStructPool64) }
  1091. }
  1092. // ----------------------------------------
  1093. // func encErr(format string, params ...interface{}) {
  1094. // doPanic(msgTagEnc, format, params...)
  1095. // }