encode.go 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380
  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. e.e.EncodeRawExt(rv2i(rv).(*RawExt), e)
  315. }
  316. func (e *Encoder) ext(f *codecFnInfo, rv reflect.Value) {
  317. // if this is a struct|array and it was addressable, then pass the address directly (not the value)
  318. // if k := rv.Kind(); (k == reflect.Struct || k == reflect.Array) && rv.CanAddr() {
  319. // rv = rv.Addr()
  320. // }
  321. e.e.EncodeExt(rv2i(rv), f.xfTag, f.xfFn, e)
  322. }
  323. // func rviptr(rv reflect.Value) (v interface{}) {
  324. // // If a non-pointer was passed to Encode(), then that value is not addressable.
  325. // // Take addr if addressable, else copy value to an addressable value.
  326. // if rv.CanAddr() {
  327. // v = rv2i(rv.Addr())
  328. // } else {
  329. // rv2 := reflect.New(rv.Type())
  330. // rv2.Elem().Set(rv)
  331. // v = rv2i(rv2)
  332. // }
  333. // return v
  334. // }
  335. func (e *Encoder) selferMarshal(f *codecFnInfo, rv reflect.Value) {
  336. rv2i(rv).(Selfer).CodecEncodeSelf(e)
  337. }
  338. func (e *Encoder) binaryMarshal(f *codecFnInfo, rv reflect.Value) {
  339. bs, fnerr := rv2i(rv).(encoding.BinaryMarshaler).MarshalBinary()
  340. e.marshal(bs, fnerr, false, c_RAW)
  341. }
  342. func (e *Encoder) textMarshal(f *codecFnInfo, rv reflect.Value) {
  343. bs, fnerr := rv2i(rv).(encoding.TextMarshaler).MarshalText()
  344. e.marshal(bs, fnerr, false, c_UTF8)
  345. }
  346. func (e *Encoder) jsonMarshal(f *codecFnInfo, rv reflect.Value) {
  347. bs, fnerr := rv2i(rv).(jsonMarshaler).MarshalJSON()
  348. e.marshal(bs, fnerr, true, c_UTF8)
  349. }
  350. func (e *Encoder) kBool(f *codecFnInfo, rv reflect.Value) {
  351. e.e.EncodeBool(rv.Bool())
  352. }
  353. func (e *Encoder) kString(f *codecFnInfo, rv reflect.Value) {
  354. e.e.EncodeString(c_UTF8, rv.String())
  355. }
  356. func (e *Encoder) kFloat64(f *codecFnInfo, rv reflect.Value) {
  357. e.e.EncodeFloat64(rv.Float())
  358. }
  359. func (e *Encoder) kFloat32(f *codecFnInfo, rv reflect.Value) {
  360. e.e.EncodeFloat32(float32(rv.Float()))
  361. }
  362. func (e *Encoder) kInt(f *codecFnInfo, rv reflect.Value) {
  363. e.e.EncodeInt(rv.Int())
  364. }
  365. func (e *Encoder) kUint(f *codecFnInfo, rv reflect.Value) {
  366. e.e.EncodeUint(rv.Uint())
  367. }
  368. func (e *Encoder) kInvalid(f *codecFnInfo, rv reflect.Value) {
  369. e.e.EncodeNil()
  370. }
  371. func (e *Encoder) kErr(f *codecFnInfo, rv reflect.Value) {
  372. e.errorf("unsupported kind %s, for %#v", rv.Kind(), rv)
  373. }
  374. func (e *Encoder) kSlice(f *codecFnInfo, rv reflect.Value) {
  375. ti := f.ti
  376. ee := e.e
  377. // array may be non-addressable, so we have to manage with care
  378. // (don't call rv.Bytes, rv.Slice, etc).
  379. // E.g. type struct S{B [2]byte};
  380. // Encode(S{}) will bomb on "panic: slice of unaddressable array".
  381. if f.seq != seqTypeArray {
  382. if rv.IsNil() {
  383. ee.EncodeNil()
  384. return
  385. }
  386. // If in this method, then there was no extension function defined.
  387. // So it's okay to treat as []byte.
  388. if ti.rtid == uint8SliceTypId {
  389. ee.EncodeStringBytes(c_RAW, rv.Bytes())
  390. return
  391. }
  392. }
  393. elemsep := e.hh.hasElemSeparators()
  394. rtelem := ti.rt.Elem()
  395. l := rv.Len()
  396. if ti.rtid == uint8SliceTypId || rtelem.Kind() == reflect.Uint8 {
  397. switch f.seq {
  398. case seqTypeArray:
  399. if rv.CanAddr() {
  400. ee.EncodeStringBytes(c_RAW, rv.Slice(0, l).Bytes())
  401. } else {
  402. var bs []byte
  403. if l <= cap(e.b) {
  404. bs = e.b[:l]
  405. } else {
  406. bs = make([]byte, l)
  407. }
  408. reflect.Copy(reflect.ValueOf(bs), rv)
  409. ee.EncodeStringBytes(c_RAW, bs)
  410. }
  411. return
  412. case seqTypeSlice:
  413. ee.EncodeStringBytes(c_RAW, rv.Bytes())
  414. return
  415. }
  416. }
  417. if ti.rtid == uint8SliceTypId && f.seq == seqTypeChan {
  418. bs := e.b[:0]
  419. // do not use range, so that the number of elements encoded
  420. // does not change, and encoding does not hang waiting on someone to close chan.
  421. // for b := range rv2i(rv).(<-chan byte) { bs = append(bs, b) }
  422. ch := rv2i(rv).(<-chan byte)
  423. for i := 0; i < l; i++ {
  424. bs = append(bs, <-ch)
  425. }
  426. ee.EncodeStringBytes(c_RAW, bs)
  427. return
  428. }
  429. if ti.mbs {
  430. if l%2 == 1 {
  431. e.errorf("mapBySlice requires even slice length, but got %v", l)
  432. return
  433. }
  434. ee.WriteMapStart(l / 2)
  435. } else {
  436. ee.WriteArrayStart(l)
  437. }
  438. if l > 0 {
  439. var fn *codecFn
  440. var recognizedVtyp = useLookupRecognizedTypes && isRecognizedRtidOrPtr(rt2id(rtelem))
  441. if !recognizedVtyp {
  442. for rtelem.Kind() == reflect.Ptr {
  443. rtelem = rtelem.Elem()
  444. }
  445. // if kind is reflect.Interface, do not pre-determine the
  446. // encoding type, because preEncodeValue may break it down to
  447. // a concrete type and kInterface will bomb.
  448. if rtelem.Kind() != reflect.Interface {
  449. fn = e.cf.get(rtelem, true, true)
  450. }
  451. }
  452. // TODO: Consider perf implication of encoding odd index values as symbols if type is string
  453. for j := 0; j < l; j++ {
  454. if elemsep {
  455. if ti.mbs {
  456. if j%2 == 0 {
  457. ee.WriteMapElemKey()
  458. } else {
  459. ee.WriteMapElemValue()
  460. }
  461. } else {
  462. ee.WriteArrayElem()
  463. }
  464. }
  465. if f.seq == seqTypeChan {
  466. if rv2, ok2 := rv.Recv(); ok2 {
  467. if useLookupRecognizedTypes && recognizedVtyp {
  468. e.encode(rv2i(rv2))
  469. } else {
  470. e.encodeValue(rv2, fn, true)
  471. }
  472. } else {
  473. ee.EncodeNil() // WE HAVE TO DO SOMETHING, so nil if nothing received.
  474. }
  475. } else {
  476. if useLookupRecognizedTypes && recognizedVtyp {
  477. e.encode(rv2i(rv.Index(j)))
  478. } else {
  479. e.encodeValue(rv.Index(j), fn, true)
  480. }
  481. }
  482. }
  483. }
  484. if ti.mbs {
  485. ee.WriteMapEnd()
  486. } else {
  487. ee.WriteArrayEnd()
  488. }
  489. }
  490. func (e *Encoder) kStructNoOmitempty(f *codecFnInfo, rv reflect.Value) {
  491. fti := f.ti
  492. elemsep := e.hh.hasElemSeparators()
  493. tisfi := fti.sfip
  494. toMap := !(fti.toArray || e.h.StructToArray)
  495. if toMap {
  496. tisfi = fti.sfi
  497. }
  498. ee := e.e
  499. sfn := structFieldNode{v: rv, update: false}
  500. if toMap {
  501. ee.WriteMapStart(len(tisfi))
  502. // asSymbols := e.h.AsSymbols&AsSymbolStructFieldNameFlag != 0
  503. asSymbols := e.h.AsSymbols == AsSymbolDefault || e.h.AsSymbols&AsSymbolStructFieldNameFlag != 0
  504. if !elemsep {
  505. for _, si := range tisfi {
  506. if asSymbols {
  507. ee.EncodeSymbol(si.encName)
  508. } else {
  509. ee.EncodeString(c_UTF8, si.encName)
  510. }
  511. e.encodeValue(sfn.field(si), nil, true)
  512. }
  513. } else {
  514. for _, si := range tisfi {
  515. ee.WriteMapElemKey()
  516. if asSymbols {
  517. ee.EncodeSymbol(si.encName)
  518. } else {
  519. ee.EncodeString(c_UTF8, si.encName)
  520. }
  521. ee.WriteMapElemValue()
  522. e.encodeValue(sfn.field(si), nil, true)
  523. }
  524. }
  525. ee.WriteMapEnd()
  526. } else {
  527. ee.WriteArrayStart(len(tisfi))
  528. if !elemsep {
  529. for _, si := range tisfi {
  530. e.encodeValue(sfn.field(si), nil, true)
  531. }
  532. } else {
  533. for _, si := range tisfi {
  534. ee.WriteArrayElem()
  535. e.encodeValue(sfn.field(si), nil, true)
  536. }
  537. }
  538. ee.WriteArrayEnd()
  539. }
  540. }
  541. func (e *Encoder) kStruct(f *codecFnInfo, rv reflect.Value) {
  542. fti := f.ti
  543. elemsep := e.hh.hasElemSeparators()
  544. tisfi := fti.sfip
  545. toMap := !(fti.toArray || e.h.StructToArray)
  546. // if toMap, use the sorted array. If toArray, use unsorted array (to match sequence in struct)
  547. if toMap {
  548. tisfi = fti.sfi
  549. }
  550. newlen := len(fti.sfi)
  551. ee := e.e
  552. // Use sync.Pool to reduce allocating slices unnecessarily.
  553. // The cost of sync.Pool is less than the cost of new allocation.
  554. //
  555. // Each element of the array pools one of encStructPool(8|16|32|64).
  556. // It allows the re-use of slices up to 64 in length.
  557. // A performance cost of encoding structs was collecting
  558. // which values were empty and should be omitted.
  559. // We needed slices of reflect.Value and string to collect them.
  560. // This shared pool reduces the amount of unnecessary creation we do.
  561. // The cost is that of locking sometimes, but sync.Pool is efficient
  562. // enough to reduce thread contention.
  563. var spool *sync.Pool
  564. var poolv interface{}
  565. var fkvs []stringRv
  566. if newlen <= 8 {
  567. spool, poolv = pool.stringRv8()
  568. fkvs = poolv.(*[8]stringRv)[:newlen]
  569. } else if newlen <= 16 {
  570. spool, poolv = pool.stringRv16()
  571. fkvs = poolv.(*[16]stringRv)[:newlen]
  572. } else if newlen <= 32 {
  573. spool, poolv = pool.stringRv32()
  574. fkvs = poolv.(*[32]stringRv)[:newlen]
  575. } else if newlen <= 64 {
  576. spool, poolv = pool.stringRv64()
  577. fkvs = poolv.(*[64]stringRv)[:newlen]
  578. } else if newlen <= 128 {
  579. spool, poolv = pool.stringRv128()
  580. fkvs = poolv.(*[128]stringRv)[:newlen]
  581. } else {
  582. fkvs = make([]stringRv, newlen)
  583. }
  584. newlen = 0
  585. var kv stringRv
  586. recur := e.h.RecursiveEmptyCheck
  587. sfn := structFieldNode{v: rv, update: false}
  588. for _, si := range tisfi {
  589. // kv.r = si.field(rv, false)
  590. kv.r = sfn.field(si)
  591. if toMap {
  592. if si.omitEmpty && isEmptyValue(kv.r, recur, recur) {
  593. continue
  594. }
  595. kv.v = si.encName
  596. } else {
  597. // use the zero value.
  598. // if a reference or struct, set to nil (so you do not output too much)
  599. if si.omitEmpty && isEmptyValue(kv.r, recur, recur) {
  600. switch kv.r.Kind() {
  601. case reflect.Struct, reflect.Interface, reflect.Ptr, reflect.Array, reflect.Map, reflect.Slice:
  602. kv.r = reflect.Value{} //encode as nil
  603. }
  604. }
  605. }
  606. fkvs[newlen] = kv
  607. newlen++
  608. }
  609. if toMap {
  610. ee.WriteMapStart(newlen)
  611. // asSymbols := e.h.AsSymbols&AsSymbolStructFieldNameFlag != 0
  612. asSymbols := e.h.AsSymbols == AsSymbolDefault || e.h.AsSymbols&AsSymbolStructFieldNameFlag != 0
  613. if !elemsep {
  614. for j := 0; j < newlen; j++ {
  615. kv = fkvs[j]
  616. if asSymbols {
  617. ee.EncodeSymbol(kv.v)
  618. } else {
  619. ee.EncodeString(c_UTF8, kv.v)
  620. }
  621. e.encodeValue(kv.r, nil, true)
  622. }
  623. } else {
  624. for j := 0; j < newlen; j++ {
  625. kv = fkvs[j]
  626. ee.WriteMapElemKey()
  627. if asSymbols {
  628. ee.EncodeSymbol(kv.v)
  629. } else {
  630. ee.EncodeString(c_UTF8, kv.v)
  631. }
  632. ee.WriteMapElemValue()
  633. e.encodeValue(kv.r, nil, true)
  634. }
  635. }
  636. ee.WriteMapEnd()
  637. } else {
  638. ee.WriteArrayStart(newlen)
  639. if !elemsep {
  640. for j := 0; j < newlen; j++ {
  641. e.encodeValue(fkvs[j].r, nil, true)
  642. }
  643. } else {
  644. for j := 0; j < newlen; j++ {
  645. ee.WriteArrayElem()
  646. e.encodeValue(fkvs[j].r, nil, true)
  647. }
  648. }
  649. ee.WriteArrayEnd()
  650. }
  651. // do not use defer. Instead, use explicit pool return at end of function.
  652. // defer has a cost we are trying to avoid.
  653. // If there is a panic and these slices are not returned, it is ok.
  654. if spool != nil {
  655. spool.Put(poolv)
  656. }
  657. }
  658. func (e *Encoder) kMap(f *codecFnInfo, rv reflect.Value) {
  659. ee := e.e
  660. if rv.IsNil() {
  661. ee.EncodeNil()
  662. return
  663. }
  664. l := rv.Len()
  665. ee.WriteMapStart(l)
  666. elemsep := e.hh.hasElemSeparators()
  667. if l == 0 {
  668. ee.WriteMapEnd()
  669. return
  670. }
  671. var asSymbols bool
  672. // determine the underlying key and val encFn's for the map.
  673. // This eliminates some work which is done for each loop iteration i.e.
  674. // rv.Type(), ref.ValueOf(rt).Pointer(), then check map/list for fn.
  675. //
  676. // However, if kind is reflect.Interface, do not pre-determine the
  677. // encoding type, because preEncodeValue may break it down to
  678. // a concrete type and kInterface will bomb.
  679. var keyFn, valFn *codecFn
  680. ti := f.ti
  681. rtkey0 := ti.rt.Key()
  682. rtkey := rtkey0
  683. rtval0 := ti.rt.Elem()
  684. rtval := rtval0
  685. rtkeyid := rt2id(rtkey0)
  686. rtvalid := rt2id(rtval0)
  687. for rtval.Kind() == reflect.Ptr {
  688. rtval = rtval.Elem()
  689. }
  690. if rtval.Kind() != reflect.Interface {
  691. valFn = e.cf.get(rtval, true, true)
  692. }
  693. mks := rv.MapKeys()
  694. if e.h.Canonical {
  695. e.kMapCanonical(rtkey, rv, mks, valFn, asSymbols)
  696. ee.WriteMapEnd()
  697. return
  698. }
  699. var recognizedKtyp, recognizedVtyp bool
  700. var keyTypeIsString = rtkeyid == stringTypId
  701. if keyTypeIsString {
  702. asSymbols = e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0
  703. } else {
  704. if useLookupRecognizedTypes {
  705. if recognizedKtyp = isRecognizedRtidOrPtr(rtkeyid); recognizedKtyp {
  706. goto LABEL1
  707. }
  708. }
  709. for rtkey.Kind() == reflect.Ptr {
  710. rtkey = rtkey.Elem()
  711. }
  712. if rtkey.Kind() != reflect.Interface {
  713. rtkeyid = rt2id(rtkey)
  714. keyFn = e.cf.get(rtkey, true, true)
  715. }
  716. }
  717. // for j, lmks := 0, len(mks); j < lmks; j++ {
  718. LABEL1:
  719. recognizedVtyp = useLookupRecognizedTypes && isRecognizedRtidOrPtr(rtvalid)
  720. for j := range mks {
  721. if elemsep {
  722. ee.WriteMapElemKey()
  723. }
  724. if keyTypeIsString {
  725. if asSymbols {
  726. ee.EncodeSymbol(mks[j].String())
  727. } else {
  728. ee.EncodeString(c_UTF8, mks[j].String())
  729. }
  730. } else if useLookupRecognizedTypes && recognizedKtyp {
  731. e.encode(rv2i(mks[j]))
  732. } else {
  733. e.encodeValue(mks[j], keyFn, true)
  734. }
  735. if elemsep {
  736. ee.WriteMapElemValue()
  737. }
  738. if useLookupRecognizedTypes && recognizedVtyp {
  739. e.encode(rv2i(rv.MapIndex(mks[j])))
  740. } else {
  741. e.encodeValue(rv.MapIndex(mks[j]), valFn, true)
  742. }
  743. }
  744. ee.WriteMapEnd()
  745. }
  746. func (e *Encoder) kMapCanonical(rtkey reflect.Type, rv reflect.Value, mks []reflect.Value, valFn *codecFn, asSymbols bool) {
  747. ee := e.e
  748. elemsep := e.hh.hasElemSeparators()
  749. // we previously did out-of-band if an extension was registered.
  750. // This is not necessary, as the natural kind is sufficient for ordering.
  751. // WHAT IS THIS? rtkeyid can never be a []uint8, per spec
  752. // if rtkeyid == uint8SliceTypId {
  753. // mksv := make([]bytesRv, len(mks))
  754. // for i, k := range mks {
  755. // v := &mksv[i]
  756. // v.r = k
  757. // v.v = k.Bytes()
  758. // }
  759. // sort.Sort(bytesRvSlice(mksv))
  760. // for i := range mksv {
  761. // if elemsep {
  762. // ee.WriteMapElemKey()
  763. // }
  764. // ee.EncodeStringBytes(c_RAW, mksv[i].v)
  765. // if elemsep {
  766. // ee.WriteMapElemValue()
  767. // }
  768. // e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true)
  769. // }
  770. // return
  771. // }
  772. switch rtkey.Kind() {
  773. case reflect.Bool:
  774. mksv := make([]boolRv, len(mks))
  775. for i, k := range mks {
  776. v := &mksv[i]
  777. v.r = k
  778. v.v = k.Bool()
  779. }
  780. sort.Sort(boolRvSlice(mksv))
  781. for i := range mksv {
  782. if elemsep {
  783. ee.WriteMapElemKey()
  784. }
  785. ee.EncodeBool(mksv[i].v)
  786. if elemsep {
  787. ee.WriteMapElemValue()
  788. }
  789. e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true)
  790. }
  791. case reflect.String:
  792. mksv := make([]stringRv, len(mks))
  793. for i, k := range mks {
  794. v := &mksv[i]
  795. v.r = k
  796. v.v = k.String()
  797. }
  798. sort.Sort(stringRvSlice(mksv))
  799. for i := range mksv {
  800. if elemsep {
  801. ee.WriteMapElemKey()
  802. }
  803. if asSymbols {
  804. ee.EncodeSymbol(mksv[i].v)
  805. } else {
  806. ee.EncodeString(c_UTF8, mksv[i].v)
  807. }
  808. if elemsep {
  809. ee.WriteMapElemValue()
  810. }
  811. e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true)
  812. }
  813. case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint, reflect.Uintptr:
  814. mksv := make([]uintRv, len(mks))
  815. for i, k := range mks {
  816. v := &mksv[i]
  817. v.r = k
  818. v.v = k.Uint()
  819. }
  820. sort.Sort(uintRvSlice(mksv))
  821. for i := range mksv {
  822. if elemsep {
  823. ee.WriteMapElemKey()
  824. }
  825. ee.EncodeUint(mksv[i].v)
  826. if elemsep {
  827. ee.WriteMapElemValue()
  828. }
  829. e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true)
  830. }
  831. case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int:
  832. mksv := make([]intRv, len(mks))
  833. for i, k := range mks {
  834. v := &mksv[i]
  835. v.r = k
  836. v.v = k.Int()
  837. }
  838. sort.Sort(intRvSlice(mksv))
  839. for i := range mksv {
  840. if elemsep {
  841. ee.WriteMapElemKey()
  842. }
  843. ee.EncodeInt(mksv[i].v)
  844. if elemsep {
  845. ee.WriteMapElemValue()
  846. }
  847. e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true)
  848. }
  849. case reflect.Float32:
  850. mksv := make([]floatRv, len(mks))
  851. for i, k := range mks {
  852. v := &mksv[i]
  853. v.r = k
  854. v.v = k.Float()
  855. }
  856. sort.Sort(floatRvSlice(mksv))
  857. for i := range mksv {
  858. if elemsep {
  859. ee.WriteMapElemKey()
  860. }
  861. ee.EncodeFloat32(float32(mksv[i].v))
  862. if elemsep {
  863. ee.WriteMapElemValue()
  864. }
  865. e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true)
  866. }
  867. case reflect.Float64:
  868. mksv := make([]floatRv, len(mks))
  869. for i, k := range mks {
  870. v := &mksv[i]
  871. v.r = k
  872. v.v = k.Float()
  873. }
  874. sort.Sort(floatRvSlice(mksv))
  875. for i := range mksv {
  876. if elemsep {
  877. ee.WriteMapElemKey()
  878. }
  879. ee.EncodeFloat64(mksv[i].v)
  880. if elemsep {
  881. ee.WriteMapElemValue()
  882. }
  883. e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true)
  884. }
  885. default:
  886. // out-of-band
  887. // first encode each key to a []byte first, then sort them, then record
  888. var mksv []byte = make([]byte, 0, len(mks)*16) // temporary byte slice for the encoding
  889. e2 := NewEncoderBytes(&mksv, e.hh)
  890. mksbv := make([]bytesRv, len(mks))
  891. for i, k := range mks {
  892. v := &mksbv[i]
  893. l := len(mksv)
  894. e2.MustEncode(k)
  895. v.r = k
  896. v.v = mksv[l:]
  897. }
  898. sort.Sort(bytesRvSlice(mksbv))
  899. for j := range mksbv {
  900. if elemsep {
  901. ee.WriteMapElemKey()
  902. }
  903. e.asis(mksbv[j].v)
  904. if elemsep {
  905. ee.WriteMapElemValue()
  906. }
  907. e.encodeValue(rv.MapIndex(mksbv[j].r), valFn, true)
  908. }
  909. }
  910. }
  911. // // --------------------------------------------------
  912. // An Encoder writes an object to an output stream in the codec format.
  913. type Encoder struct {
  914. // hopefully, reduce derefencing cost by laying the encWriter inside the Encoder
  915. e encDriver
  916. // NOTE: Encoder shouldn't call it's write methods,
  917. // as the handler MAY need to do some coordination.
  918. w encWriter
  919. hh Handle
  920. h *BasicHandle
  921. // ---- cpu cache line boundary?
  922. wi ioEncWriter
  923. wb bytesEncWriter
  924. bw bufio.Writer
  925. // cr containerStateRecv
  926. as encDriverAsis
  927. // ---- cpu cache line boundary?
  928. ci set
  929. err error
  930. b [scratchByteArrayLen]byte
  931. cf codecFner
  932. }
  933. // NewEncoder returns an Encoder for encoding into an io.Writer.
  934. //
  935. // For efficiency, Users are encouraged to pass in a memory buffered writer
  936. // (eg bufio.Writer, bytes.Buffer).
  937. func NewEncoder(w io.Writer, h Handle) *Encoder {
  938. e := newEncoder(h)
  939. e.Reset(w)
  940. return e
  941. }
  942. // NewEncoderBytes returns an encoder for encoding directly and efficiently
  943. // into a byte slice, using zero-copying to temporary slices.
  944. //
  945. // It will potentially replace the output byte slice pointed to.
  946. // After encoding, the out parameter contains the encoded contents.
  947. func NewEncoderBytes(out *[]byte, h Handle) *Encoder {
  948. e := newEncoder(h)
  949. e.ResetBytes(out)
  950. return e
  951. }
  952. func newEncoder(h Handle) *Encoder {
  953. e := &Encoder{hh: h, h: h.getBasicHandle()}
  954. e.e = h.newEncDriver(e)
  955. e.as, _ = e.e.(encDriverAsis)
  956. // e.cr, _ = e.e.(containerStateRecv)
  957. return e
  958. }
  959. // Reset the Encoder with a new output stream.
  960. //
  961. // This accommodates using the state of the Encoder,
  962. // where it has "cached" information about sub-engines.
  963. func (e *Encoder) Reset(w io.Writer) {
  964. var ok bool
  965. e.wi.w = w
  966. if e.h.WriterBufferSize > 0 {
  967. bw := bufio.NewWriterSize(w, e.h.WriterBufferSize)
  968. e.bw = *bw
  969. e.wi.bw = &e.bw
  970. e.wi.sw = &e.bw
  971. e.wi.fw = &e.bw
  972. e.wi.ww = &e.bw
  973. } else {
  974. if e.wi.bw, ok = w.(io.ByteWriter); !ok {
  975. e.wi.bw = &e.wi
  976. }
  977. if e.wi.sw, ok = w.(ioEncStringWriter); !ok {
  978. e.wi.sw = &e.wi
  979. }
  980. e.wi.fw, _ = w.(ioEncFlusher)
  981. e.wi.ww = w
  982. }
  983. e.w = &e.wi
  984. e.e.reset()
  985. e.cf.reset(e.hh)
  986. e.err = nil
  987. }
  988. func (e *Encoder) ResetBytes(out *[]byte) {
  989. in := *out
  990. if in == nil {
  991. in = make([]byte, defEncByteBufSize)
  992. }
  993. e.wb.b, e.wb.out, e.wb.c = in, out, 0
  994. e.w = &e.wb
  995. e.e.reset()
  996. e.cf.reset(e.hh)
  997. e.err = nil
  998. }
  999. // Encode writes an object into a stream.
  1000. //
  1001. // Encoding can be configured via the struct tag for the fields.
  1002. // The "codec" key in struct field's tag value is the key name,
  1003. // followed by an optional comma and options.
  1004. // Note that the "json" key is used in the absence of the "codec" key.
  1005. //
  1006. // To set an option on all fields (e.g. omitempty on all fields), you
  1007. // can create a field called _struct, and set flags on it.
  1008. //
  1009. // Struct values "usually" encode as maps. Each exported struct field is encoded unless:
  1010. // - the field's tag is "-", OR
  1011. // - the field is empty (empty or the zero value) and its tag specifies the "omitempty" option.
  1012. //
  1013. // When encoding as a map, the first string in the tag (before the comma)
  1014. // is the map key string to use when encoding.
  1015. //
  1016. // However, struct values may encode as arrays. This happens when:
  1017. // - StructToArray Encode option is set, OR
  1018. // - the tag on the _struct field sets the "toarray" option
  1019. // Note that omitempty is ignored when encoding struct values as arrays,
  1020. // as an entry must be encoded for each field, to maintain its position.
  1021. //
  1022. // Values with types that implement MapBySlice are encoded as stream maps.
  1023. //
  1024. // The empty values (for omitempty option) are false, 0, any nil pointer
  1025. // or interface value, and any array, slice, map, or string of length zero.
  1026. //
  1027. // Anonymous fields are encoded inline except:
  1028. // - the struct tag specifies a replacement name (first value)
  1029. // - the field is of an interface type
  1030. //
  1031. // Examples:
  1032. //
  1033. // // NOTE: 'json:' can be used as struct tag key, in place 'codec:' below.
  1034. // type MyStruct struct {
  1035. // _struct bool `codec:",omitempty"` //set omitempty for every field
  1036. // Field1 string `codec:"-"` //skip this field
  1037. // Field2 int `codec:"myName"` //Use key "myName" in encode stream
  1038. // Field3 int32 `codec:",omitempty"` //use key "Field3". Omit if empty.
  1039. // Field4 bool `codec:"f4,omitempty"` //use key "f4". Omit if empty.
  1040. // io.Reader //use key "Reader".
  1041. // MyStruct `codec:"my1" //use key "my1".
  1042. // MyStruct //inline it
  1043. // ...
  1044. // }
  1045. //
  1046. // type MyStruct struct {
  1047. // _struct bool `codec:",toarray"` //encode struct as an array
  1048. // }
  1049. //
  1050. // The mode of encoding is based on the type of the value. When a value is seen:
  1051. // - If a Selfer, call its CodecEncodeSelf method
  1052. // - If an extension is registered for it, call that extension function
  1053. // - If it implements encoding.(Binary|Text|JSON)Marshaler, call its Marshal(Binary|Text|JSON) method
  1054. // - Else encode it based on its reflect.Kind
  1055. //
  1056. // Note that struct field names and keys in map[string]XXX will be treated as symbols.
  1057. // Some formats support symbols (e.g. binc) and will properly encode the string
  1058. // only once in the stream, and use a tag to refer to it thereafter.
  1059. func (e *Encoder) Encode(v interface{}) (err error) {
  1060. defer panicToErrs2(&e.err, &err)
  1061. e.MustEncode(v)
  1062. return
  1063. }
  1064. // MustEncode is like Encode, but panics if unable to Encode.
  1065. // This provides insight to the code location that triggered the error.
  1066. func (e *Encoder) MustEncode(v interface{}) {
  1067. if e.err != nil {
  1068. panic(e.err)
  1069. }
  1070. e.encode(v)
  1071. e.e.atEndOfEncode()
  1072. e.w.atEndOfEncode()
  1073. }
  1074. func (e *Encoder) encode(iv interface{}) {
  1075. if iv == nil || definitelyNil(iv) {
  1076. e.e.EncodeNil()
  1077. return
  1078. }
  1079. if v, ok := iv.(Selfer); ok {
  1080. v.CodecEncodeSelf(e)
  1081. return
  1082. }
  1083. switch v := iv.(type) {
  1084. // case nil:
  1085. // e.e.EncodeNil()
  1086. // case Selfer:
  1087. // v.CodecEncodeSelf(e)
  1088. case Raw:
  1089. e.rawBytes(v)
  1090. case reflect.Value:
  1091. e.encodeValue(v, nil, true)
  1092. case string:
  1093. e.e.EncodeString(c_UTF8, v)
  1094. case bool:
  1095. e.e.EncodeBool(v)
  1096. case int:
  1097. e.e.EncodeInt(int64(v))
  1098. case int8:
  1099. e.e.EncodeInt(int64(v))
  1100. case int16:
  1101. e.e.EncodeInt(int64(v))
  1102. case int32:
  1103. e.e.EncodeInt(int64(v))
  1104. case int64:
  1105. e.e.EncodeInt(v)
  1106. case uint:
  1107. e.e.EncodeUint(uint64(v))
  1108. case uint8:
  1109. e.e.EncodeUint(uint64(v))
  1110. case uint16:
  1111. e.e.EncodeUint(uint64(v))
  1112. case uint32:
  1113. e.e.EncodeUint(uint64(v))
  1114. case uint64:
  1115. e.e.EncodeUint(v)
  1116. case uintptr:
  1117. e.e.EncodeUint(uint64(v))
  1118. case float32:
  1119. e.e.EncodeFloat32(v)
  1120. case float64:
  1121. e.e.EncodeFloat64(v)
  1122. case []uint8:
  1123. e.e.EncodeStringBytes(c_RAW, v)
  1124. case *string:
  1125. e.e.EncodeString(c_UTF8, *v)
  1126. case *bool:
  1127. e.e.EncodeBool(*v)
  1128. case *int:
  1129. e.e.EncodeInt(int64(*v))
  1130. case *int8:
  1131. e.e.EncodeInt(int64(*v))
  1132. case *int16:
  1133. e.e.EncodeInt(int64(*v))
  1134. case *int32:
  1135. e.e.EncodeInt(int64(*v))
  1136. case *int64:
  1137. e.e.EncodeInt(*v)
  1138. case *uint:
  1139. e.e.EncodeUint(uint64(*v))
  1140. case *uint8:
  1141. e.e.EncodeUint(uint64(*v))
  1142. case *uint16:
  1143. e.e.EncodeUint(uint64(*v))
  1144. case *uint32:
  1145. e.e.EncodeUint(uint64(*v))
  1146. case *uint64:
  1147. e.e.EncodeUint(*v)
  1148. case *uintptr:
  1149. e.e.EncodeUint(uint64(*v))
  1150. case *float32:
  1151. e.e.EncodeFloat32(*v)
  1152. case *float64:
  1153. e.e.EncodeFloat64(*v)
  1154. case *[]uint8:
  1155. e.e.EncodeStringBytes(c_RAW, *v)
  1156. default:
  1157. if !fastpathEncodeTypeSwitch(iv, e) {
  1158. // checkfastpath=true (not false), as underlying slice/map type may be fast-path
  1159. e.encodeValue(reflect.ValueOf(iv), nil, true)
  1160. }
  1161. }
  1162. }
  1163. func (e *Encoder) encodeValue(rv reflect.Value, fn *codecFn, checkFastpath bool) {
  1164. // if a valid fn is passed, it MUST BE for the dereferenced type of rv
  1165. var sptr uintptr
  1166. var rvp reflect.Value
  1167. var rvpValid bool
  1168. TOP:
  1169. switch rv.Kind() {
  1170. case reflect.Ptr:
  1171. if rv.IsNil() {
  1172. e.e.EncodeNil()
  1173. return
  1174. }
  1175. rvpValid = true
  1176. rvp = rv
  1177. rv = rv.Elem()
  1178. if e.h.CheckCircularRef && rv.Kind() == reflect.Struct {
  1179. // TODO: Movable pointers will be an issue here. Future problem.
  1180. sptr = rv.UnsafeAddr()
  1181. break TOP
  1182. }
  1183. goto TOP
  1184. case reflect.Interface:
  1185. if rv.IsNil() {
  1186. e.e.EncodeNil()
  1187. return
  1188. }
  1189. rv = rv.Elem()
  1190. goto TOP
  1191. case reflect.Slice, reflect.Map:
  1192. if rv.IsNil() {
  1193. e.e.EncodeNil()
  1194. return
  1195. }
  1196. case reflect.Invalid, reflect.Func:
  1197. e.e.EncodeNil()
  1198. return
  1199. }
  1200. if sptr != 0 && (&e.ci).add(sptr) {
  1201. e.errorf("circular reference found: # %d", sptr)
  1202. }
  1203. if fn == nil {
  1204. rt := rv.Type()
  1205. // TODO: calling isRecognizedRtid here is a major slowdown
  1206. if false && useLookupRecognizedTypes && isRecognizedRtidOrPtr(rt2id(rt)) {
  1207. e.encode(rv2i(rv))
  1208. return
  1209. }
  1210. // always pass checkCodecSelfer=true, in case T or ****T is passed, where *T is a Selfer
  1211. fn = e.cf.get(rt, checkFastpath, true)
  1212. }
  1213. if fn.i.addrE {
  1214. if rvpValid {
  1215. fn.fe(e, &fn.i, rvp)
  1216. } else if rv.CanAddr() {
  1217. fn.fe(e, &fn.i, rv.Addr())
  1218. } else {
  1219. rv2 := reflect.New(rv.Type())
  1220. rv2.Elem().Set(rv)
  1221. fn.fe(e, &fn.i, rv2)
  1222. }
  1223. } else {
  1224. fn.fe(e, &fn.i, rv)
  1225. }
  1226. if sptr != 0 {
  1227. (&e.ci).remove(sptr)
  1228. }
  1229. }
  1230. func (e *Encoder) marshal(bs []byte, fnerr error, asis bool, c charEncoding) {
  1231. if fnerr != nil {
  1232. panic(fnerr)
  1233. }
  1234. if bs == nil {
  1235. e.e.EncodeNil()
  1236. } else if asis {
  1237. e.asis(bs)
  1238. } else {
  1239. e.e.EncodeStringBytes(c, bs)
  1240. }
  1241. }
  1242. func (e *Encoder) asis(v []byte) {
  1243. if e.as == nil {
  1244. e.w.writeb(v)
  1245. } else {
  1246. e.as.EncodeAsis(v)
  1247. }
  1248. }
  1249. func (e *Encoder) rawBytes(vv Raw) {
  1250. v := []byte(vv)
  1251. if !e.h.Raw {
  1252. e.errorf("Raw values cannot be encoded: %v", v)
  1253. }
  1254. if e.as == nil {
  1255. e.w.writeb(v)
  1256. } else {
  1257. e.as.EncodeAsis(v)
  1258. }
  1259. }
  1260. func (e *Encoder) errorf(format string, params ...interface{}) {
  1261. err := fmt.Errorf(format, params...)
  1262. panic(err)
  1263. }