encode.go 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384
  1. // Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved.
  2. // Use of this source code is governed by a MIT license found in the LICENSE file.
  3. package codec
  4. import (
  5. "bufio"
  6. "encoding"
  7. "fmt"
  8. "io"
  9. "reflect"
  10. "sort"
  11. "sync"
  12. )
  13. const defEncByteBufSize = 1 << 6 // 4:16, 6:64, 8:256, 10:1024
  14. // AsSymbolFlag defines what should be encoded as symbols.
  15. type AsSymbolFlag uint8
  16. const (
  17. // AsSymbolDefault is default.
  18. // Currently, this means only encode struct field names as symbols.
  19. // The default is subject to change.
  20. AsSymbolDefault AsSymbolFlag = iota
  21. // AsSymbolAll means encode anything which could be a symbol as a symbol.
  22. AsSymbolAll = 0xfe
  23. // AsSymbolNone means do not encode anything as a symbol.
  24. AsSymbolNone = 1 << iota
  25. // AsSymbolMapStringKeys means encode keys in map[string]XXX as symbols.
  26. AsSymbolMapStringKeysFlag
  27. // AsSymbolStructFieldName means encode struct field names as symbols.
  28. AsSymbolStructFieldNameFlag
  29. )
  30. // encWriter abstracts writing to a byte array or to an io.Writer.
  31. type encWriter interface {
  32. writeb([]byte)
  33. writestr(string)
  34. writen1(byte)
  35. writen2(byte, byte)
  36. atEndOfEncode()
  37. }
  38. // encDriver abstracts the actual codec (binc vs msgpack, etc)
  39. type encDriver interface {
  40. // IsBuiltinType(rt uintptr) bool
  41. EncodeBuiltin(rt uintptr, v interface{})
  42. EncodeNil()
  43. EncodeInt(i int64)
  44. EncodeUint(i uint64)
  45. EncodeBool(b bool)
  46. EncodeFloat32(f float32)
  47. EncodeFloat64(f float64)
  48. // encodeExtPreamble(xtag byte, length int)
  49. EncodeRawExt(re *RawExt, e *Encoder)
  50. EncodeExt(v interface{}, xtag uint64, ext Ext, e *Encoder)
  51. WriteArrayStart(length int)
  52. WriteArrayElem()
  53. WriteArrayEnd()
  54. WriteMapStart(length int)
  55. WriteMapElemKey()
  56. WriteMapElemValue()
  57. WriteMapEnd()
  58. EncodeString(c charEncoding, v string)
  59. EncodeSymbol(v string)
  60. EncodeStringBytes(c charEncoding, v []byte)
  61. //TODO
  62. //encBignum(f *big.Int)
  63. //encStringRunes(c charEncoding, v []rune)
  64. reset()
  65. atEndOfEncode()
  66. }
  67. type ioEncStringWriter interface {
  68. WriteString(s string) (n int, err error)
  69. }
  70. type ioEncFlusher interface {
  71. Flush() error
  72. }
  73. type encDriverAsis interface {
  74. EncodeAsis(v []byte)
  75. }
  76. // type encNoSeparator struct{}
  77. // func (_ encNoSeparator) EncodeEnd() {}
  78. type encDriverNoopContainerWriter struct{}
  79. func (_ encDriverNoopContainerWriter) WriteArrayStart(length int) {}
  80. func (_ encDriverNoopContainerWriter) WriteArrayElem() {}
  81. func (_ encDriverNoopContainerWriter) WriteArrayEnd() {}
  82. func (_ encDriverNoopContainerWriter) WriteMapStart(length int) {}
  83. func (_ encDriverNoopContainerWriter) WriteMapElemKey() {}
  84. func (_ encDriverNoopContainerWriter) WriteMapElemValue() {}
  85. func (_ encDriverNoopContainerWriter) WriteMapEnd() {}
  86. func (_ encDriverNoopContainerWriter) atEndOfEncode() {}
  87. // type ioEncWriterWriter interface {
  88. // WriteByte(c byte) error
  89. // WriteString(s string) (n int, err error)
  90. // Write(p []byte) (n int, err error)
  91. // }
  92. type EncodeOptions struct {
  93. // Encode a struct as an array, and not as a map
  94. StructToArray bool
  95. // Canonical representation means that encoding a value will always result in the same
  96. // sequence of bytes.
  97. //
  98. // This only affects maps, as the iteration order for maps is random.
  99. //
  100. // The implementation MAY use the natural sort order for the map keys if possible:
  101. //
  102. // - If there is a natural sort order (ie for number, bool, string or []byte keys),
  103. // then the map keys are first sorted in natural order and then written
  104. // with corresponding map values to the strema.
  105. // - If there is no natural sort order, then the map keys will first be
  106. // encoded into []byte, and then sorted,
  107. // before writing the sorted keys and the corresponding map values to the stream.
  108. //
  109. Canonical bool
  110. // CheckCircularRef controls whether we check for circular references
  111. // and error fast during an encode.
  112. //
  113. // If enabled, an error is received if a pointer to a struct
  114. // references itself either directly or through one of its fields (iteratively).
  115. //
  116. // This is opt-in, as there may be a performance hit to checking circular references.
  117. CheckCircularRef bool
  118. // RecursiveEmptyCheck controls whether we descend into interfaces, structs and pointers
  119. // when checking if a value is empty.
  120. //
  121. // Note that this may make OmitEmpty more expensive, as it incurs a lot more reflect calls.
  122. RecursiveEmptyCheck bool
  123. // Raw controls whether we encode Raw values.
  124. // This is a "dangerous" option and must be explicitly set.
  125. // If set, we blindly encode Raw values as-is, without checking
  126. // if they are a correct representation of a value in that format.
  127. // If unset, we error out.
  128. Raw bool
  129. // AsSymbols defines what should be encoded as symbols.
  130. //
  131. // Encoding as symbols can reduce the encoded size significantly.
  132. //
  133. // However, during decoding, each string to be encoded as a symbol must
  134. // be checked to see if it has been seen before. Consequently, encoding time
  135. // will increase if using symbols, because string comparisons has a clear cost.
  136. //
  137. // Sample values:
  138. // AsSymbolNone
  139. // AsSymbolAll
  140. // AsSymbolMapStringKeys
  141. // AsSymbolMapStringKeysFlag | AsSymbolStructFieldNameFlag
  142. AsSymbols AsSymbolFlag
  143. // WriterBufferSize is the size of the buffer used when writing.
  144. //
  145. // if > 0, we use a smart buffer internally for performance purposes.
  146. WriterBufferSize int
  147. }
  148. // ---------------------------------------------
  149. type simpleIoEncWriter struct {
  150. io.Writer
  151. }
  152. // type bufIoEncWriter struct {
  153. // w io.Writer
  154. // buf []byte
  155. // err error
  156. // }
  157. // func (x *bufIoEncWriter) Write(b []byte) (n int, err error) {
  158. // if x.err != nil {
  159. // return 0, x.err
  160. // }
  161. // if cap(x.buf)-len(x.buf) >= len(b) {
  162. // x.buf = append(x.buf, b)
  163. // return len(b), nil
  164. // }
  165. // n, err = x.w.Write(x.buf)
  166. // if err != nil {
  167. // x.err = err
  168. // return 0, x.err
  169. // }
  170. // n, err = x.w.Write(b)
  171. // x.err = err
  172. // return
  173. // }
  174. // ioEncWriter implements encWriter and can write to an io.Writer implementation
  175. type ioEncWriter struct {
  176. w io.Writer
  177. ww io.Writer
  178. bw io.ByteWriter
  179. sw ioEncStringWriter
  180. fw ioEncFlusher
  181. b [8]byte
  182. }
  183. func (z *ioEncWriter) WriteByte(b byte) (err error) {
  184. // x.bs[0] = b
  185. // _, err = x.ww.Write(x.bs[:])
  186. z.b[0] = b
  187. _, err = z.w.Write(z.b[:1])
  188. return
  189. }
  190. func (z *ioEncWriter) WriteString(s string) (n int, err error) {
  191. return z.w.Write(bytesView(s))
  192. }
  193. func (z *ioEncWriter) writeb(bs []byte) {
  194. // if len(bs) == 0 {
  195. // return
  196. // }
  197. if _, err := z.ww.Write(bs); err != nil {
  198. panic(err)
  199. }
  200. }
  201. func (z *ioEncWriter) writestr(s string) {
  202. // if len(s) == 0 {
  203. // return
  204. // }
  205. if _, err := z.sw.WriteString(s); err != nil {
  206. panic(err)
  207. }
  208. }
  209. func (z *ioEncWriter) writen1(b byte) {
  210. if err := z.bw.WriteByte(b); err != nil {
  211. panic(err)
  212. }
  213. }
  214. func (z *ioEncWriter) writen2(b1, b2 byte) {
  215. var err error
  216. if err = z.bw.WriteByte(b1); err == nil {
  217. if err = z.bw.WriteByte(b2); err == nil {
  218. return
  219. }
  220. }
  221. panic(err)
  222. }
  223. // func (z *ioEncWriter) writen5(b1, b2, b3, b4, b5 byte) {
  224. // z.b[0], z.b[1], z.b[2], z.b[3], z.b[4] = b1, b2, b3, b4, b5
  225. // if _, err := z.ww.Write(z.b[:5]); err != nil {
  226. // panic(err)
  227. // }
  228. // }
  229. func (z *ioEncWriter) atEndOfEncode() {
  230. if z.fw != nil {
  231. z.fw.Flush()
  232. }
  233. }
  234. // ----------------------------------------
  235. // bytesEncWriter implements encWriter and can write to an byte slice.
  236. // It is used by Marshal function.
  237. type bytesEncWriter struct {
  238. b []byte
  239. c int // cursor
  240. out *[]byte // write out on atEndOfEncode
  241. }
  242. func (z *bytesEncWriter) writeb(s []byte) {
  243. oc, a := z.growNoAlloc(len(s))
  244. if a {
  245. z.growAlloc(len(s), oc)
  246. }
  247. copy(z.b[oc:], s)
  248. }
  249. func (z *bytesEncWriter) writestr(s string) {
  250. oc, a := z.growNoAlloc(len(s))
  251. if a {
  252. z.growAlloc(len(s), oc)
  253. }
  254. copy(z.b[oc:], s)
  255. }
  256. func (z *bytesEncWriter) writen1(b1 byte) {
  257. oc, a := z.growNoAlloc(1)
  258. if a {
  259. z.growAlloc(1, oc)
  260. }
  261. z.b[oc] = b1
  262. }
  263. func (z *bytesEncWriter) writen2(b1, b2 byte) {
  264. oc, a := z.growNoAlloc(2)
  265. if a {
  266. z.growAlloc(2, oc)
  267. }
  268. z.b[oc+1] = b2
  269. z.b[oc] = b1
  270. }
  271. func (z *bytesEncWriter) atEndOfEncode() {
  272. *(z.out) = z.b[:z.c]
  273. }
  274. // have a growNoalloc(n int), which can be inlined.
  275. // if allocation is needed, then call growAlloc(n int)
  276. func (z *bytesEncWriter) growNoAlloc(n int) (oldcursor int, allocNeeded bool) {
  277. oldcursor = z.c
  278. z.c = z.c + n
  279. if z.c > len(z.b) {
  280. if z.c > cap(z.b) {
  281. allocNeeded = true
  282. } else {
  283. z.b = z.b[:cap(z.b)]
  284. }
  285. }
  286. return
  287. }
  288. func (z *bytesEncWriter) growAlloc(n int, oldcursor int) {
  289. // appendslice logic (if cap < 1024, *2, else *1.25): more expensive. many copy calls.
  290. // bytes.Buffer model (2*cap + n): much better
  291. // bs := make([]byte, 2*cap(z.b)+n)
  292. bs := make([]byte, growCap(cap(z.b), 1, n))
  293. copy(bs, z.b[:oldcursor])
  294. z.b = bs
  295. }
  296. // ---------------------------------------------
  297. func (e *Encoder) builtin(f *codecFnInfo, rv reflect.Value) {
  298. e.e.EncodeBuiltin(f.ti.rtid, rv2i(rv))
  299. }
  300. func (e *Encoder) raw(f *codecFnInfo, rv reflect.Value) {
  301. e.rawBytes(rv2i(rv).(Raw))
  302. }
  303. func (e *Encoder) rawExt(f *codecFnInfo, rv reflect.Value) {
  304. // rev := rv2i(rv).(RawExt)
  305. // e.e.EncodeRawExt(&rev, e)
  306. var re *RawExt
  307. if rv.CanAddr() {
  308. re = rv2i(rv.Addr()).(*RawExt)
  309. } else {
  310. rev := rv2i(rv).(RawExt)
  311. re = &rev
  312. }
  313. e.e.EncodeRawExt(re, e)
  314. }
  315. func (e *Encoder) ext(f *codecFnInfo, rv reflect.Value) {
  316. // if this is a struct|array and it was addressable, then pass the address directly (not the value)
  317. if k := rv.Kind(); (k == reflect.Struct || k == reflect.Array) && rv.CanAddr() {
  318. rv = rv.Addr()
  319. }
  320. e.e.EncodeExt(rv2i(rv), f.xfTag, f.xfFn, e)
  321. }
  322. func (e *Encoder) getValueForMarshalInterface(rv reflect.Value, indir int8) (v interface{}, proceed bool) {
  323. if indir == 0 {
  324. v = rv2i(rv)
  325. } else if indir == -1 {
  326. // If a non-pointer was passed to Encode(), then that value is not addressable.
  327. // Take addr if addressable, else copy value to an addressable value.
  328. if rv.CanAddr() {
  329. v = rv2i(rv.Addr())
  330. } else {
  331. rv2 := reflect.New(rv.Type())
  332. rv2.Elem().Set(rv)
  333. v = rv2i(rv2)
  334. }
  335. } else {
  336. for j := int8(0); j < indir; j++ {
  337. if rv.IsNil() {
  338. e.e.EncodeNil()
  339. return
  340. }
  341. rv = rv.Elem()
  342. }
  343. v = rv2i(rv)
  344. }
  345. return v, true
  346. }
  347. func (e *Encoder) selferMarshal(f *codecFnInfo, rv reflect.Value) {
  348. if v, proceed := e.getValueForMarshalInterface(rv, f.ti.csIndir); proceed {
  349. v.(Selfer).CodecEncodeSelf(e)
  350. }
  351. }
  352. func (e *Encoder) binaryMarshal(f *codecFnInfo, rv reflect.Value) {
  353. if v, proceed := e.getValueForMarshalInterface(rv, f.ti.bmIndir); proceed {
  354. bs, fnerr := v.(encoding.BinaryMarshaler).MarshalBinary()
  355. e.marshal(bs, fnerr, false, c_RAW)
  356. }
  357. }
  358. func (e *Encoder) textMarshal(f *codecFnInfo, rv reflect.Value) {
  359. if v, proceed := e.getValueForMarshalInterface(rv, f.ti.tmIndir); proceed {
  360. bs, fnerr := v.(encoding.TextMarshaler).MarshalText()
  361. e.marshal(bs, fnerr, false, c_UTF8)
  362. }
  363. }
  364. func (e *Encoder) jsonMarshal(f *codecFnInfo, rv reflect.Value) {
  365. if v, proceed := e.getValueForMarshalInterface(rv, f.ti.jmIndir); proceed {
  366. bs, fnerr := v.(jsonMarshaler).MarshalJSON()
  367. e.marshal(bs, fnerr, true, c_UTF8)
  368. }
  369. }
  370. func (e *Encoder) kBool(f *codecFnInfo, rv reflect.Value) {
  371. e.e.EncodeBool(rv.Bool())
  372. }
  373. func (e *Encoder) kString(f *codecFnInfo, rv reflect.Value) {
  374. e.e.EncodeString(c_UTF8, rv.String())
  375. }
  376. func (e *Encoder) kFloat64(f *codecFnInfo, rv reflect.Value) {
  377. e.e.EncodeFloat64(rv.Float())
  378. }
  379. func (e *Encoder) kFloat32(f *codecFnInfo, rv reflect.Value) {
  380. e.e.EncodeFloat32(float32(rv.Float()))
  381. }
  382. func (e *Encoder) kInt(f *codecFnInfo, rv reflect.Value) {
  383. e.e.EncodeInt(rv.Int())
  384. }
  385. func (e *Encoder) kUint(f *codecFnInfo, rv reflect.Value) {
  386. e.e.EncodeUint(rv.Uint())
  387. }
  388. func (e *Encoder) kInvalid(f *codecFnInfo, rv reflect.Value) {
  389. e.e.EncodeNil()
  390. }
  391. func (e *Encoder) kErr(f *codecFnInfo, rv reflect.Value) {
  392. e.errorf("unsupported kind %s, for %#v", rv.Kind(), rv)
  393. }
  394. func (e *Encoder) kSlice(f *codecFnInfo, rv reflect.Value) {
  395. ti := f.ti
  396. ee := e.e
  397. // array may be non-addressable, so we have to manage with care
  398. // (don't call rv.Bytes, rv.Slice, etc).
  399. // E.g. type struct S{B [2]byte};
  400. // Encode(S{}) will bomb on "panic: slice of unaddressable array".
  401. if f.seq != seqTypeArray {
  402. if rv.IsNil() {
  403. ee.EncodeNil()
  404. return
  405. }
  406. // If in this method, then there was no extension function defined.
  407. // So it's okay to treat as []byte.
  408. if ti.rtid == uint8SliceTypId {
  409. ee.EncodeStringBytes(c_RAW, rv.Bytes())
  410. return
  411. }
  412. }
  413. elemsep := e.hh.hasElemSeparators()
  414. rtelem := ti.rt.Elem()
  415. l := rv.Len()
  416. if ti.rtid == uint8SliceTypId || rtelem.Kind() == reflect.Uint8 {
  417. switch f.seq {
  418. case seqTypeArray:
  419. if rv.CanAddr() {
  420. ee.EncodeStringBytes(c_RAW, rv.Slice(0, l).Bytes())
  421. } else {
  422. var bs []byte
  423. if l <= cap(e.b) {
  424. bs = e.b[:l]
  425. } else {
  426. bs = make([]byte, l)
  427. }
  428. reflect.Copy(reflect.ValueOf(bs), rv)
  429. ee.EncodeStringBytes(c_RAW, bs)
  430. }
  431. return
  432. case seqTypeSlice:
  433. ee.EncodeStringBytes(c_RAW, rv.Bytes())
  434. return
  435. }
  436. }
  437. if ti.rtid == uint8SliceTypId && f.seq == seqTypeChan {
  438. bs := e.b[:0]
  439. // do not use range, so that the number of elements encoded
  440. // does not change, and encoding does not hang waiting on someone to close chan.
  441. // for b := range rv2i(rv).(<-chan byte) { bs = append(bs, b) }
  442. ch := rv2i(rv).(<-chan byte)
  443. for i := 0; i < l; i++ {
  444. bs = append(bs, <-ch)
  445. }
  446. ee.EncodeStringBytes(c_RAW, bs)
  447. return
  448. }
  449. if ti.mbs {
  450. if l%2 == 1 {
  451. e.errorf("mapBySlice requires even slice length, but got %v", l)
  452. return
  453. }
  454. ee.WriteMapStart(l / 2)
  455. } else {
  456. ee.WriteArrayStart(l)
  457. }
  458. if l > 0 {
  459. var fn *codecFn
  460. var recognizedVtyp = useLookupRecognizedTypes && isRecognizedRtidOrPtr(rt2id(rtelem))
  461. if !recognizedVtyp {
  462. for rtelem.Kind() == reflect.Ptr {
  463. rtelem = rtelem.Elem()
  464. }
  465. // if kind is reflect.Interface, do not pre-determine the
  466. // encoding type, because preEncodeValue may break it down to
  467. // a concrete type and kInterface will bomb.
  468. if rtelem.Kind() != reflect.Interface {
  469. fn = e.cf.get(rtelem, true, true)
  470. }
  471. }
  472. // TODO: Consider perf implication of encoding odd index values as symbols if type is string
  473. for j := 0; j < l; j++ {
  474. if elemsep {
  475. if ti.mbs {
  476. if j%2 == 0 {
  477. ee.WriteMapElemKey()
  478. } else {
  479. ee.WriteMapElemValue()
  480. }
  481. } else {
  482. ee.WriteArrayElem()
  483. }
  484. }
  485. if f.seq == seqTypeChan {
  486. if rv2, ok2 := rv.Recv(); ok2 {
  487. if useLookupRecognizedTypes && recognizedVtyp {
  488. e.encode(rv2i(rv2))
  489. } else {
  490. e.encodeValue(rv2, fn, true)
  491. }
  492. } else {
  493. ee.EncodeNil() // WE HAVE TO DO SOMETHING, so nil if nothing received.
  494. }
  495. } else {
  496. if useLookupRecognizedTypes && recognizedVtyp {
  497. e.encode(rv2i(rv.Index(j)))
  498. } else {
  499. e.encodeValue(rv.Index(j), fn, true)
  500. }
  501. }
  502. }
  503. }
  504. if ti.mbs {
  505. ee.WriteMapEnd()
  506. } else {
  507. ee.WriteArrayEnd()
  508. }
  509. }
  510. func (e *Encoder) kStructNoOmitempty(f *codecFnInfo, rv reflect.Value) {
  511. fti := f.ti
  512. elemsep := e.hh.hasElemSeparators()
  513. tisfi := fti.sfip
  514. toMap := !(fti.toArray || e.h.StructToArray)
  515. if toMap {
  516. tisfi = fti.sfi
  517. }
  518. ee := e.e
  519. sfn := structFieldNode{v: rv, update: false}
  520. if toMap {
  521. ee.WriteMapStart(len(tisfi))
  522. // asSymbols := e.h.AsSymbols&AsSymbolStructFieldNameFlag != 0
  523. asSymbols := e.h.AsSymbols == AsSymbolDefault || e.h.AsSymbols&AsSymbolStructFieldNameFlag != 0
  524. if !elemsep {
  525. for _, si := range tisfi {
  526. if asSymbols {
  527. ee.EncodeSymbol(si.encName)
  528. } else {
  529. ee.EncodeString(c_UTF8, si.encName)
  530. }
  531. e.encodeValue(sfn.field(si), nil, true)
  532. }
  533. } else {
  534. for _, si := range tisfi {
  535. ee.WriteMapElemKey()
  536. if asSymbols {
  537. ee.EncodeSymbol(si.encName)
  538. } else {
  539. ee.EncodeString(c_UTF8, si.encName)
  540. }
  541. ee.WriteMapElemValue()
  542. e.encodeValue(sfn.field(si), nil, true)
  543. }
  544. }
  545. ee.WriteMapEnd()
  546. } else {
  547. ee.WriteArrayStart(len(tisfi))
  548. if !elemsep {
  549. for _, si := range tisfi {
  550. e.encodeValue(sfn.field(si), nil, true)
  551. }
  552. } else {
  553. for _, si := range tisfi {
  554. ee.WriteArrayElem()
  555. e.encodeValue(sfn.field(si), nil, true)
  556. }
  557. }
  558. ee.WriteArrayEnd()
  559. }
  560. }
  561. func (e *Encoder) kStruct(f *codecFnInfo, rv reflect.Value) {
  562. fti := f.ti
  563. elemsep := e.hh.hasElemSeparators()
  564. tisfi := fti.sfip
  565. toMap := !(fti.toArray || e.h.StructToArray)
  566. // if toMap, use the sorted array. If toArray, use unsorted array (to match sequence in struct)
  567. if toMap {
  568. tisfi = fti.sfi
  569. }
  570. newlen := len(fti.sfi)
  571. ee := e.e
  572. // Use sync.Pool to reduce allocating slices unnecessarily.
  573. // The cost of sync.Pool is less than the cost of new allocation.
  574. //
  575. // Each element of the array pools one of encStructPool(8|16|32|64).
  576. // It allows the re-use of slices up to 64 in length.
  577. // A performance cost of encoding structs was collecting
  578. // which values were empty and should be omitted.
  579. // We needed slices of reflect.Value and string to collect them.
  580. // This shared pool reduces the amount of unnecessary creation we do.
  581. // The cost is that of locking sometimes, but sync.Pool is efficient
  582. // enough to reduce thread contention.
  583. var spool *sync.Pool
  584. var poolv interface{}
  585. var fkvs []stringRv
  586. if newlen <= 8 {
  587. spool, poolv = pool.stringRv8()
  588. fkvs = poolv.(*[8]stringRv)[:newlen]
  589. } else if newlen <= 16 {
  590. spool, poolv = pool.stringRv16()
  591. fkvs = poolv.(*[16]stringRv)[:newlen]
  592. } else if newlen <= 32 {
  593. spool, poolv = pool.stringRv32()
  594. fkvs = poolv.(*[32]stringRv)[:newlen]
  595. } else if newlen <= 64 {
  596. spool, poolv = pool.stringRv64()
  597. fkvs = poolv.(*[64]stringRv)[:newlen]
  598. } else if newlen <= 128 {
  599. spool, poolv = pool.stringRv128()
  600. fkvs = poolv.(*[128]stringRv)[:newlen]
  601. } else {
  602. fkvs = make([]stringRv, newlen)
  603. }
  604. newlen = 0
  605. var kv stringRv
  606. recur := e.h.RecursiveEmptyCheck
  607. sfn := structFieldNode{v: rv, update: false}
  608. for _, si := range tisfi {
  609. // kv.r = si.field(rv, false)
  610. kv.r = sfn.field(si)
  611. if toMap {
  612. if si.omitEmpty && isEmptyValue(kv.r, recur, recur) {
  613. continue
  614. }
  615. kv.v = si.encName
  616. } else {
  617. // use the zero value.
  618. // if a reference or struct, set to nil (so you do not output too much)
  619. if si.omitEmpty && isEmptyValue(kv.r, recur, recur) {
  620. switch kv.r.Kind() {
  621. case reflect.Struct, reflect.Interface, reflect.Ptr, reflect.Array, reflect.Map, reflect.Slice:
  622. kv.r = reflect.Value{} //encode as nil
  623. }
  624. }
  625. }
  626. fkvs[newlen] = kv
  627. newlen++
  628. }
  629. if toMap {
  630. ee.WriteMapStart(newlen)
  631. // asSymbols := e.h.AsSymbols&AsSymbolStructFieldNameFlag != 0
  632. asSymbols := e.h.AsSymbols == AsSymbolDefault || e.h.AsSymbols&AsSymbolStructFieldNameFlag != 0
  633. if !elemsep {
  634. for j := 0; j < newlen; j++ {
  635. kv = fkvs[j]
  636. if asSymbols {
  637. ee.EncodeSymbol(kv.v)
  638. } else {
  639. ee.EncodeString(c_UTF8, kv.v)
  640. }
  641. e.encodeValue(kv.r, nil, true)
  642. }
  643. } else {
  644. for j := 0; j < newlen; j++ {
  645. kv = fkvs[j]
  646. ee.WriteMapElemKey()
  647. if asSymbols {
  648. ee.EncodeSymbol(kv.v)
  649. } else {
  650. ee.EncodeString(c_UTF8, kv.v)
  651. }
  652. ee.WriteMapElemValue()
  653. e.encodeValue(kv.r, nil, true)
  654. }
  655. }
  656. ee.WriteMapEnd()
  657. } else {
  658. ee.WriteArrayStart(newlen)
  659. if !elemsep {
  660. for j := 0; j < newlen; j++ {
  661. e.encodeValue(fkvs[j].r, nil, true)
  662. }
  663. } else {
  664. for j := 0; j < newlen; j++ {
  665. ee.WriteArrayElem()
  666. e.encodeValue(fkvs[j].r, nil, true)
  667. }
  668. }
  669. ee.WriteArrayEnd()
  670. }
  671. // do not use defer. Instead, use explicit pool return at end of function.
  672. // defer has a cost we are trying to avoid.
  673. // If there is a panic and these slices are not returned, it is ok.
  674. if spool != nil {
  675. spool.Put(poolv)
  676. }
  677. }
  678. func (e *Encoder) kMap(f *codecFnInfo, rv reflect.Value) {
  679. ee := e.e
  680. if rv.IsNil() {
  681. ee.EncodeNil()
  682. return
  683. }
  684. l := rv.Len()
  685. ee.WriteMapStart(l)
  686. elemsep := e.hh.hasElemSeparators()
  687. if l == 0 {
  688. ee.WriteMapEnd()
  689. return
  690. }
  691. var asSymbols bool
  692. // determine the underlying key and val encFn's for the map.
  693. // This eliminates some work which is done for each loop iteration i.e.
  694. // rv.Type(), ref.ValueOf(rt).Pointer(), then check map/list for fn.
  695. //
  696. // However, if kind is reflect.Interface, do not pre-determine the
  697. // encoding type, because preEncodeValue may break it down to
  698. // a concrete type and kInterface will bomb.
  699. var keyFn, valFn *codecFn
  700. ti := f.ti
  701. rtkey0 := ti.rt.Key()
  702. rtkey := rtkey0
  703. rtval0 := ti.rt.Elem()
  704. rtval := rtval0
  705. rtkeyid := rt2id(rtkey0)
  706. rtvalid := rt2id(rtval0)
  707. for rtval.Kind() == reflect.Ptr {
  708. rtval = rtval.Elem()
  709. }
  710. if rtval.Kind() != reflect.Interface {
  711. valFn = e.cf.get(rtval, true, true)
  712. }
  713. mks := rv.MapKeys()
  714. if e.h.Canonical {
  715. e.kMapCanonical(rtkey, rv, mks, valFn, asSymbols)
  716. ee.WriteMapEnd()
  717. return
  718. }
  719. var recognizedKtyp, recognizedVtyp bool
  720. var keyTypeIsString = rtkeyid == stringTypId
  721. if keyTypeIsString {
  722. asSymbols = e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0
  723. } else {
  724. if useLookupRecognizedTypes {
  725. if recognizedKtyp = isRecognizedRtidOrPtr(rtkeyid); recognizedKtyp {
  726. goto LABEL1
  727. }
  728. }
  729. for rtkey.Kind() == reflect.Ptr {
  730. rtkey = rtkey.Elem()
  731. }
  732. if rtkey.Kind() != reflect.Interface {
  733. rtkeyid = rt2id(rtkey)
  734. keyFn = e.cf.get(rtkey, true, true)
  735. }
  736. }
  737. // for j, lmks := 0, len(mks); j < lmks; j++ {
  738. LABEL1:
  739. recognizedVtyp = useLookupRecognizedTypes && isRecognizedRtidOrPtr(rtvalid)
  740. for j := range mks {
  741. if elemsep {
  742. ee.WriteMapElemKey()
  743. }
  744. if keyTypeIsString {
  745. if asSymbols {
  746. ee.EncodeSymbol(mks[j].String())
  747. } else {
  748. ee.EncodeString(c_UTF8, mks[j].String())
  749. }
  750. } else if useLookupRecognizedTypes && recognizedKtyp {
  751. e.encode(rv2i(mks[j]))
  752. } else {
  753. e.encodeValue(mks[j], keyFn, true)
  754. }
  755. if elemsep {
  756. ee.WriteMapElemValue()
  757. }
  758. if useLookupRecognizedTypes && recognizedVtyp {
  759. e.encode(rv2i(rv.MapIndex(mks[j])))
  760. } else {
  761. e.encodeValue(rv.MapIndex(mks[j]), valFn, true)
  762. }
  763. }
  764. ee.WriteMapEnd()
  765. }
  766. func (e *Encoder) kMapCanonical(rtkey reflect.Type, rv reflect.Value, mks []reflect.Value, valFn *codecFn, asSymbols bool) {
  767. ee := e.e
  768. elemsep := e.hh.hasElemSeparators()
  769. // we previously did out-of-band if an extension was registered.
  770. // This is not necessary, as the natural kind is sufficient for ordering.
  771. // WHAT IS THIS? rtkeyid can never be a []uint8, per spec
  772. // if rtkeyid == uint8SliceTypId {
  773. // mksv := make([]bytesRv, len(mks))
  774. // for i, k := range mks {
  775. // v := &mksv[i]
  776. // v.r = k
  777. // v.v = k.Bytes()
  778. // }
  779. // sort.Sort(bytesRvSlice(mksv))
  780. // for i := range mksv {
  781. // if elemsep {
  782. // ee.WriteMapElemKey()
  783. // }
  784. // ee.EncodeStringBytes(c_RAW, mksv[i].v)
  785. // if elemsep {
  786. // ee.WriteMapElemValue()
  787. // }
  788. // e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true)
  789. // }
  790. // return
  791. // }
  792. switch rtkey.Kind() {
  793. case reflect.Bool:
  794. mksv := make([]boolRv, len(mks))
  795. for i, k := range mks {
  796. v := &mksv[i]
  797. v.r = k
  798. v.v = k.Bool()
  799. }
  800. sort.Sort(boolRvSlice(mksv))
  801. for i := range mksv {
  802. if elemsep {
  803. ee.WriteMapElemKey()
  804. }
  805. ee.EncodeBool(mksv[i].v)
  806. if elemsep {
  807. ee.WriteMapElemValue()
  808. }
  809. e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true)
  810. }
  811. case reflect.String:
  812. mksv := make([]stringRv, len(mks))
  813. for i, k := range mks {
  814. v := &mksv[i]
  815. v.r = k
  816. v.v = k.String()
  817. }
  818. sort.Sort(stringRvSlice(mksv))
  819. for i := range mksv {
  820. if elemsep {
  821. ee.WriteMapElemKey()
  822. }
  823. if asSymbols {
  824. ee.EncodeSymbol(mksv[i].v)
  825. } else {
  826. ee.EncodeString(c_UTF8, mksv[i].v)
  827. }
  828. if elemsep {
  829. ee.WriteMapElemValue()
  830. }
  831. e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true)
  832. }
  833. case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint, reflect.Uintptr:
  834. mksv := make([]uintRv, len(mks))
  835. for i, k := range mks {
  836. v := &mksv[i]
  837. v.r = k
  838. v.v = k.Uint()
  839. }
  840. sort.Sort(uintRvSlice(mksv))
  841. for i := range mksv {
  842. if elemsep {
  843. ee.WriteMapElemKey()
  844. }
  845. ee.EncodeUint(mksv[i].v)
  846. if elemsep {
  847. ee.WriteMapElemValue()
  848. }
  849. e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true)
  850. }
  851. case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int:
  852. mksv := make([]intRv, len(mks))
  853. for i, k := range mks {
  854. v := &mksv[i]
  855. v.r = k
  856. v.v = k.Int()
  857. }
  858. sort.Sort(intRvSlice(mksv))
  859. for i := range mksv {
  860. if elemsep {
  861. ee.WriteMapElemKey()
  862. }
  863. ee.EncodeInt(mksv[i].v)
  864. if elemsep {
  865. ee.WriteMapElemValue()
  866. }
  867. e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true)
  868. }
  869. case reflect.Float32:
  870. mksv := make([]floatRv, len(mks))
  871. for i, k := range mks {
  872. v := &mksv[i]
  873. v.r = k
  874. v.v = k.Float()
  875. }
  876. sort.Sort(floatRvSlice(mksv))
  877. for i := range mksv {
  878. if elemsep {
  879. ee.WriteMapElemKey()
  880. }
  881. ee.EncodeFloat32(float32(mksv[i].v))
  882. if elemsep {
  883. ee.WriteMapElemValue()
  884. }
  885. e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true)
  886. }
  887. case reflect.Float64:
  888. mksv := make([]floatRv, len(mks))
  889. for i, k := range mks {
  890. v := &mksv[i]
  891. v.r = k
  892. v.v = k.Float()
  893. }
  894. sort.Sort(floatRvSlice(mksv))
  895. for i := range mksv {
  896. if elemsep {
  897. ee.WriteMapElemKey()
  898. }
  899. ee.EncodeFloat64(mksv[i].v)
  900. if elemsep {
  901. ee.WriteMapElemValue()
  902. }
  903. e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true)
  904. }
  905. default:
  906. // out-of-band
  907. // first encode each key to a []byte first, then sort them, then record
  908. var mksv []byte = make([]byte, 0, len(mks)*16) // temporary byte slice for the encoding
  909. e2 := NewEncoderBytes(&mksv, e.hh)
  910. mksbv := make([]bytesRv, len(mks))
  911. for i, k := range mks {
  912. v := &mksbv[i]
  913. l := len(mksv)
  914. e2.MustEncode(k)
  915. v.r = k
  916. v.v = mksv[l:]
  917. }
  918. sort.Sort(bytesRvSlice(mksbv))
  919. for j := range mksbv {
  920. if elemsep {
  921. ee.WriteMapElemKey()
  922. }
  923. e.asis(mksbv[j].v)
  924. if elemsep {
  925. ee.WriteMapElemValue()
  926. }
  927. e.encodeValue(rv.MapIndex(mksbv[j].r), valFn, true)
  928. }
  929. }
  930. }
  931. // // --------------------------------------------------
  932. // An Encoder writes an object to an output stream in the codec format.
  933. type Encoder struct {
  934. // hopefully, reduce derefencing cost by laying the encWriter inside the Encoder
  935. e encDriver
  936. // NOTE: Encoder shouldn't call it's write methods,
  937. // as the handler MAY need to do some coordination.
  938. w encWriter
  939. hh Handle
  940. h *BasicHandle
  941. // ---- cpu cache line boundary?
  942. wi ioEncWriter
  943. wb bytesEncWriter
  944. bw bufio.Writer
  945. // cr containerStateRecv
  946. as encDriverAsis
  947. // ---- cpu cache line boundary?
  948. ci set
  949. err error
  950. b [scratchByteArrayLen]byte
  951. cf codecFner
  952. }
  953. // NewEncoder returns an Encoder for encoding into an io.Writer.
  954. //
  955. // For efficiency, Users are encouraged to pass in a memory buffered writer
  956. // (eg bufio.Writer, bytes.Buffer).
  957. func NewEncoder(w io.Writer, h Handle) *Encoder {
  958. e := newEncoder(h)
  959. e.Reset(w)
  960. return e
  961. }
  962. // NewEncoderBytes returns an encoder for encoding directly and efficiently
  963. // into a byte slice, using zero-copying to temporary slices.
  964. //
  965. // It will potentially replace the output byte slice pointed to.
  966. // After encoding, the out parameter contains the encoded contents.
  967. func NewEncoderBytes(out *[]byte, h Handle) *Encoder {
  968. e := newEncoder(h)
  969. e.ResetBytes(out)
  970. return e
  971. }
  972. func newEncoder(h Handle) *Encoder {
  973. e := &Encoder{hh: h, h: h.getBasicHandle()}
  974. e.e = h.newEncDriver(e)
  975. e.as, _ = e.e.(encDriverAsis)
  976. // e.cr, _ = e.e.(containerStateRecv)
  977. return e
  978. }
  979. // Reset the Encoder with a new output stream.
  980. //
  981. // This accommodates using the state of the Encoder,
  982. // where it has "cached" information about sub-engines.
  983. func (e *Encoder) Reset(w io.Writer) {
  984. var ok bool
  985. e.wi.w = w
  986. if e.h.WriterBufferSize > 0 {
  987. bw := bufio.NewWriterSize(w, e.h.WriterBufferSize)
  988. e.bw = *bw
  989. e.wi.bw = &e.bw
  990. e.wi.sw = &e.bw
  991. e.wi.fw = &e.bw
  992. e.wi.ww = &e.bw
  993. } else {
  994. if e.wi.bw, ok = w.(io.ByteWriter); !ok {
  995. e.wi.bw = &e.wi
  996. }
  997. if e.wi.sw, ok = w.(ioEncStringWriter); !ok {
  998. e.wi.sw = &e.wi
  999. }
  1000. e.wi.fw, _ = w.(ioEncFlusher)
  1001. e.wi.ww = w
  1002. }
  1003. e.w = &e.wi
  1004. e.e.reset()
  1005. e.cf.reset(e.hh)
  1006. e.err = nil
  1007. }
  1008. func (e *Encoder) ResetBytes(out *[]byte) {
  1009. in := *out
  1010. if in == nil {
  1011. in = make([]byte, defEncByteBufSize)
  1012. }
  1013. e.wb.b, e.wb.out, e.wb.c = in, out, 0
  1014. e.w = &e.wb
  1015. e.e.reset()
  1016. e.cf.reset(e.hh)
  1017. e.err = nil
  1018. }
  1019. // Encode writes an object into a stream.
  1020. //
  1021. // Encoding can be configured via the struct tag for the fields.
  1022. // The "codec" key in struct field's tag value is the key name,
  1023. // followed by an optional comma and options.
  1024. // Note that the "json" key is used in the absence of the "codec" key.
  1025. //
  1026. // To set an option on all fields (e.g. omitempty on all fields), you
  1027. // can create a field called _struct, and set flags on it.
  1028. //
  1029. // Struct values "usually" encode as maps. Each exported struct field is encoded unless:
  1030. // - the field's tag is "-", OR
  1031. // - the field is empty (empty or the zero value) and its tag specifies the "omitempty" option.
  1032. //
  1033. // When encoding as a map, the first string in the tag (before the comma)
  1034. // is the map key string to use when encoding.
  1035. //
  1036. // However, struct values may encode as arrays. This happens when:
  1037. // - StructToArray Encode option is set, OR
  1038. // - the tag on the _struct field sets the "toarray" option
  1039. // Note that omitempty is ignored when encoding struct values as arrays,
  1040. // as an entry must be encoded for each field, to maintain its position.
  1041. //
  1042. // Values with types that implement MapBySlice are encoded as stream maps.
  1043. //
  1044. // The empty values (for omitempty option) are false, 0, any nil pointer
  1045. // or interface value, and any array, slice, map, or string of length zero.
  1046. //
  1047. // Anonymous fields are encoded inline except:
  1048. // - the struct tag specifies a replacement name (first value)
  1049. // - the field is of an interface type
  1050. //
  1051. // Examples:
  1052. //
  1053. // // NOTE: 'json:' can be used as struct tag key, in place 'codec:' below.
  1054. // type MyStruct struct {
  1055. // _struct bool `codec:",omitempty"` //set omitempty for every field
  1056. // Field1 string `codec:"-"` //skip this field
  1057. // Field2 int `codec:"myName"` //Use key "myName" in encode stream
  1058. // Field3 int32 `codec:",omitempty"` //use key "Field3". Omit if empty.
  1059. // Field4 bool `codec:"f4,omitempty"` //use key "f4". Omit if empty.
  1060. // io.Reader //use key "Reader".
  1061. // MyStruct `codec:"my1" //use key "my1".
  1062. // MyStruct //inline it
  1063. // ...
  1064. // }
  1065. //
  1066. // type MyStruct struct {
  1067. // _struct bool `codec:",toarray"` //encode struct as an array
  1068. // }
  1069. //
  1070. // The mode of encoding is based on the type of the value. When a value is seen:
  1071. // - If a Selfer, call its CodecEncodeSelf method
  1072. // - If an extension is registered for it, call that extension function
  1073. // - If it implements encoding.(Binary|Text|JSON)Marshaler, call its Marshal(Binary|Text|JSON) method
  1074. // - Else encode it based on its reflect.Kind
  1075. //
  1076. // Note that struct field names and keys in map[string]XXX will be treated as symbols.
  1077. // Some formats support symbols (e.g. binc) and will properly encode the string
  1078. // only once in the stream, and use a tag to refer to it thereafter.
  1079. func (e *Encoder) Encode(v interface{}) (err error) {
  1080. defer panicToErrs2(&e.err, &err)
  1081. e.MustEncode(v)
  1082. return
  1083. }
  1084. // MustEncode is like Encode, but panics if unable to Encode.
  1085. // This provides insight to the code location that triggered the error.
  1086. func (e *Encoder) MustEncode(v interface{}) {
  1087. if e.err != nil {
  1088. panic(e.err)
  1089. }
  1090. e.encode(v)
  1091. e.e.atEndOfEncode()
  1092. e.w.atEndOfEncode()
  1093. }
  1094. func (e *Encoder) encode(iv interface{}) {
  1095. if iv == nil || definitelyNil(iv) {
  1096. e.e.EncodeNil()
  1097. return
  1098. }
  1099. if v, ok := iv.(Selfer); ok {
  1100. v.CodecEncodeSelf(e)
  1101. return
  1102. }
  1103. switch v := iv.(type) {
  1104. // case nil:
  1105. // e.e.EncodeNil()
  1106. // case Selfer:
  1107. // v.CodecEncodeSelf(e)
  1108. case Raw:
  1109. e.rawBytes(v)
  1110. case reflect.Value:
  1111. e.encodeValue(v, nil, true)
  1112. case string:
  1113. e.e.EncodeString(c_UTF8, v)
  1114. case bool:
  1115. e.e.EncodeBool(v)
  1116. case int:
  1117. e.e.EncodeInt(int64(v))
  1118. case int8:
  1119. e.e.EncodeInt(int64(v))
  1120. case int16:
  1121. e.e.EncodeInt(int64(v))
  1122. case int32:
  1123. e.e.EncodeInt(int64(v))
  1124. case int64:
  1125. e.e.EncodeInt(v)
  1126. case uint:
  1127. e.e.EncodeUint(uint64(v))
  1128. case uint8:
  1129. e.e.EncodeUint(uint64(v))
  1130. case uint16:
  1131. e.e.EncodeUint(uint64(v))
  1132. case uint32:
  1133. e.e.EncodeUint(uint64(v))
  1134. case uint64:
  1135. e.e.EncodeUint(v)
  1136. case uintptr:
  1137. e.e.EncodeUint(uint64(v))
  1138. case float32:
  1139. e.e.EncodeFloat32(v)
  1140. case float64:
  1141. e.e.EncodeFloat64(v)
  1142. case []uint8:
  1143. e.e.EncodeStringBytes(c_RAW, v)
  1144. case *string:
  1145. e.e.EncodeString(c_UTF8, *v)
  1146. case *bool:
  1147. e.e.EncodeBool(*v)
  1148. case *int:
  1149. e.e.EncodeInt(int64(*v))
  1150. case *int8:
  1151. e.e.EncodeInt(int64(*v))
  1152. case *int16:
  1153. e.e.EncodeInt(int64(*v))
  1154. case *int32:
  1155. e.e.EncodeInt(int64(*v))
  1156. case *int64:
  1157. e.e.EncodeInt(*v)
  1158. case *uint:
  1159. e.e.EncodeUint(uint64(*v))
  1160. case *uint8:
  1161. e.e.EncodeUint(uint64(*v))
  1162. case *uint16:
  1163. e.e.EncodeUint(uint64(*v))
  1164. case *uint32:
  1165. e.e.EncodeUint(uint64(*v))
  1166. case *uint64:
  1167. e.e.EncodeUint(*v)
  1168. case *uintptr:
  1169. e.e.EncodeUint(uint64(*v))
  1170. case *float32:
  1171. e.e.EncodeFloat32(*v)
  1172. case *float64:
  1173. e.e.EncodeFloat64(*v)
  1174. case *[]uint8:
  1175. e.e.EncodeStringBytes(c_RAW, *v)
  1176. default:
  1177. if !fastpathEncodeTypeSwitch(iv, e) {
  1178. // checkfastpath=true (not false), as underlying slice/map type may be fast-path
  1179. e.encodeValue(reflect.ValueOf(iv), nil, true)
  1180. }
  1181. }
  1182. }
  1183. func (e *Encoder) encodeValue(rv reflect.Value, fn *codecFn, checkFastpath bool) {
  1184. // if a valid fn is passed, it MUST BE for the dereferenced type of rv
  1185. var sptr uintptr
  1186. TOP:
  1187. switch rv.Kind() {
  1188. case reflect.Ptr:
  1189. if rv.IsNil() {
  1190. e.e.EncodeNil()
  1191. return
  1192. }
  1193. rv = rv.Elem()
  1194. if e.h.CheckCircularRef && rv.Kind() == reflect.Struct {
  1195. // TODO: Movable pointers will be an issue here. Future problem.
  1196. sptr = rv.UnsafeAddr()
  1197. break TOP
  1198. }
  1199. goto TOP
  1200. case reflect.Interface:
  1201. if rv.IsNil() {
  1202. e.e.EncodeNil()
  1203. return
  1204. }
  1205. rv = rv.Elem()
  1206. goto TOP
  1207. case reflect.Slice, reflect.Map:
  1208. if rv.IsNil() {
  1209. e.e.EncodeNil()
  1210. return
  1211. }
  1212. case reflect.Invalid, reflect.Func:
  1213. e.e.EncodeNil()
  1214. return
  1215. }
  1216. if sptr != 0 && (&e.ci).add(sptr) {
  1217. e.errorf("circular reference found: # %d", sptr)
  1218. }
  1219. if fn == nil {
  1220. rt := rv.Type()
  1221. // TODO: calling isRecognizedRtid here is a major slowdown
  1222. if false && useLookupRecognizedTypes && isRecognizedRtidOrPtr(rt2id(rt)) {
  1223. e.encode(rv2i(rv))
  1224. return
  1225. }
  1226. // always pass checkCodecSelfer=true, in case T or ****T is passed, where *T is a Selfer
  1227. fn = e.cf.get(rt, checkFastpath, true)
  1228. }
  1229. fn.fe(e, &fn.i, rv)
  1230. if sptr != 0 {
  1231. (&e.ci).remove(sptr)
  1232. }
  1233. }
  1234. func (e *Encoder) marshal(bs []byte, fnerr error, asis bool, c charEncoding) {
  1235. if fnerr != nil {
  1236. panic(fnerr)
  1237. }
  1238. if bs == nil {
  1239. e.e.EncodeNil()
  1240. } else if asis {
  1241. e.asis(bs)
  1242. } else {
  1243. e.e.EncodeStringBytes(c, bs)
  1244. }
  1245. }
  1246. func (e *Encoder) asis(v []byte) {
  1247. if e.as == nil {
  1248. e.w.writeb(v)
  1249. } else {
  1250. e.as.EncodeAsis(v)
  1251. }
  1252. }
  1253. func (e *Encoder) rawBytes(vv Raw) {
  1254. v := []byte(vv)
  1255. if !e.h.Raw {
  1256. e.errorf("Raw values cannot be encoded: %v", v)
  1257. }
  1258. if e.as == nil {
  1259. e.w.writeb(v)
  1260. } else {
  1261. e.as.EncodeAsis(v)
  1262. }
  1263. }
  1264. func (e *Encoder) errorf(format string, params ...interface{}) {
  1265. err := fmt.Errorf(format, params...)
  1266. panic(err)
  1267. }