encode.go 29 KB

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