encode.go 35 KB

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