encode.go 34 KB

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