|
|
@@ -61,8 +61,13 @@ type encDriver interface {
|
|
|
// encodeExtPreamble(xtag byte, length int)
|
|
|
EncodeRawExt(re *RawExt, e *Encoder)
|
|
|
EncodeExt(v interface{}, xtag uint64, ext Ext, e *Encoder)
|
|
|
- EncodeArrayStart(length int)
|
|
|
- EncodeMapStart(length int)
|
|
|
+ WriteArrayStart(length int)
|
|
|
+ WriteArrayElem()
|
|
|
+ WriteArrayEnd()
|
|
|
+ WriteMapStart(length int)
|
|
|
+ WriteMapElemKey()
|
|
|
+ WriteMapElemValue()
|
|
|
+ WriteMapEnd()
|
|
|
EncodeString(c charEncoding, v string)
|
|
|
EncodeSymbol(v string)
|
|
|
EncodeStringBytes(c charEncoding, v []byte)
|
|
|
@@ -73,14 +78,6 @@ type encDriver interface {
|
|
|
reset()
|
|
|
}
|
|
|
|
|
|
-type encDriverAsis interface {
|
|
|
- EncodeAsis(v []byte)
|
|
|
-}
|
|
|
-
|
|
|
-type encNoSeparator struct{}
|
|
|
-
|
|
|
-func (_ encNoSeparator) EncodeEnd() {}
|
|
|
-
|
|
|
type ioEncStringWriter interface {
|
|
|
WriteString(s string) (n int, err error)
|
|
|
}
|
|
|
@@ -89,6 +86,23 @@ type ioEncFlusher interface {
|
|
|
Flush() error
|
|
|
}
|
|
|
|
|
|
+type encDriverAsis interface {
|
|
|
+ EncodeAsis(v []byte)
|
|
|
+}
|
|
|
+
|
|
|
+// type encNoSeparator struct{}
|
|
|
+// func (_ encNoSeparator) EncodeEnd() {}
|
|
|
+
|
|
|
+type encDriverNoopContainerWriter struct{}
|
|
|
+
|
|
|
+func (_ encDriverNoopContainerWriter) WriteArrayStart(length int) {}
|
|
|
+func (_ encDriverNoopContainerWriter) WriteArrayElem() {}
|
|
|
+func (_ encDriverNoopContainerWriter) WriteArrayEnd() {}
|
|
|
+func (_ encDriverNoopContainerWriter) WriteMapStart(length int) {}
|
|
|
+func (_ encDriverNoopContainerWriter) WriteMapElemKey() {}
|
|
|
+func (_ encDriverNoopContainerWriter) WriteMapElemValue() {}
|
|
|
+func (_ encDriverNoopContainerWriter) WriteMapEnd() {}
|
|
|
+
|
|
|
// type ioEncWriterWriter interface {
|
|
|
// WriteByte(c byte) error
|
|
|
// WriteString(s string) (n int, err error)
|
|
|
@@ -198,16 +212,16 @@ type ioEncWriter struct {
|
|
|
b [8]byte
|
|
|
}
|
|
|
|
|
|
-func (x *ioEncWriter) WriteByte(b byte) (err error) {
|
|
|
+func (z *ioEncWriter) WriteByte(b byte) (err error) {
|
|
|
// x.bs[0] = b
|
|
|
// _, err = x.ww.Write(x.bs[:])
|
|
|
- var ba = [1]byte{b}
|
|
|
- _, err = x.w.Write(ba[:])
|
|
|
+ z.b[0] = b
|
|
|
+ _, err = z.w.Write(z.b[:1])
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func (x *ioEncWriter) WriteString(s string) (n int, err error) {
|
|
|
- return x.w.Write(bytesView(s))
|
|
|
+func (z *ioEncWriter) WriteString(s string) (n int, err error) {
|
|
|
+ return z.w.Write(bytesView(s))
|
|
|
}
|
|
|
|
|
|
func (z *ioEncWriter) writeb(bs []byte) {
|
|
|
@@ -477,30 +491,31 @@ func (e *Encoder) kErr(f *codecFnInfo, rv reflect.Value) {
|
|
|
|
|
|
func (e *Encoder) kSlice(f *codecFnInfo, rv reflect.Value) {
|
|
|
ti := f.ti
|
|
|
+ ee := e.e
|
|
|
// array may be non-addressable, so we have to manage with care
|
|
|
// (don't call rv.Bytes, rv.Slice, etc).
|
|
|
// E.g. type struct S{B [2]byte};
|
|
|
// Encode(S{}) will bomb on "panic: slice of unaddressable array".
|
|
|
if f.seq != seqTypeArray {
|
|
|
if rv.IsNil() {
|
|
|
- e.e.EncodeNil()
|
|
|
+ ee.EncodeNil()
|
|
|
return
|
|
|
}
|
|
|
// If in this method, then there was no extension function defined.
|
|
|
// So it's okay to treat as []byte.
|
|
|
if ti.rtid == uint8SliceTypId {
|
|
|
- e.e.EncodeStringBytes(c_RAW, rv.Bytes())
|
|
|
+ ee.EncodeStringBytes(c_RAW, rv.Bytes())
|
|
|
return
|
|
|
}
|
|
|
}
|
|
|
- cr := e.cr
|
|
|
+ elemsep := e.hh.hasElemSeparators()
|
|
|
rtelem := ti.rt.Elem()
|
|
|
l := rv.Len()
|
|
|
if ti.rtid == uint8SliceTypId || rtelem.Kind() == reflect.Uint8 {
|
|
|
switch f.seq {
|
|
|
case seqTypeArray:
|
|
|
if rv.CanAddr() {
|
|
|
- e.e.EncodeStringBytes(c_RAW, rv.Slice(0, l).Bytes())
|
|
|
+ ee.EncodeStringBytes(c_RAW, rv.Slice(0, l).Bytes())
|
|
|
} else {
|
|
|
var bs []byte
|
|
|
if l <= cap(e.b) {
|
|
|
@@ -509,11 +524,11 @@ func (e *Encoder) kSlice(f *codecFnInfo, rv reflect.Value) {
|
|
|
bs = make([]byte, l)
|
|
|
}
|
|
|
reflect.Copy(reflect.ValueOf(bs), rv)
|
|
|
- e.e.EncodeStringBytes(c_RAW, bs)
|
|
|
+ ee.EncodeStringBytes(c_RAW, bs)
|
|
|
}
|
|
|
return
|
|
|
case seqTypeSlice:
|
|
|
- e.e.EncodeStringBytes(c_RAW, rv.Bytes())
|
|
|
+ ee.EncodeStringBytes(c_RAW, rv.Bytes())
|
|
|
return
|
|
|
}
|
|
|
}
|
|
|
@@ -526,7 +541,7 @@ func (e *Encoder) kSlice(f *codecFnInfo, rv reflect.Value) {
|
|
|
for i := 0; i < l; i++ {
|
|
|
bs = append(bs, <-ch)
|
|
|
}
|
|
|
- e.e.EncodeStringBytes(c_RAW, bs)
|
|
|
+ ee.EncodeStringBytes(c_RAW, bs)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
@@ -535,9 +550,9 @@ func (e *Encoder) kSlice(f *codecFnInfo, rv reflect.Value) {
|
|
|
e.errorf("mapBySlice requires even slice length, but got %v", l)
|
|
|
return
|
|
|
}
|
|
|
- e.e.EncodeMapStart(l / 2)
|
|
|
+ ee.WriteMapStart(l / 2)
|
|
|
} else {
|
|
|
- e.e.EncodeArrayStart(l)
|
|
|
+ ee.WriteArrayStart(l)
|
|
|
}
|
|
|
|
|
|
if l > 0 {
|
|
|
@@ -556,15 +571,15 @@ func (e *Encoder) kSlice(f *codecFnInfo, rv reflect.Value) {
|
|
|
}
|
|
|
// TODO: Consider perf implication of encoding odd index values as symbols if type is string
|
|
|
for j := 0; j < l; j++ {
|
|
|
- if cr != nil {
|
|
|
+ if elemsep {
|
|
|
if ti.mbs {
|
|
|
if j%2 == 0 {
|
|
|
- cr.sendContainerState(containerMapKey)
|
|
|
+ ee.WriteMapElemKey()
|
|
|
} else {
|
|
|
- cr.sendContainerState(containerMapValue)
|
|
|
+ ee.WriteMapElemValue()
|
|
|
}
|
|
|
} else {
|
|
|
- cr.sendContainerState(containerArrayElem)
|
|
|
+ ee.WriteArrayElem()
|
|
|
}
|
|
|
}
|
|
|
if f.seq == seqTypeChan {
|
|
|
@@ -575,7 +590,7 @@ func (e *Encoder) kSlice(f *codecFnInfo, rv reflect.Value) {
|
|
|
e.encodeValue(rv2, fn, true)
|
|
|
}
|
|
|
} else {
|
|
|
- e.e.EncodeNil() // WE HAVE TO DO SOMETHING, so nil if nothing received.
|
|
|
+ ee.EncodeNil() // WE HAVE TO DO SOMETHING, so nil if nothing received.
|
|
|
}
|
|
|
} else {
|
|
|
if useLookupRecognizedTypes && recognizedVtyp {
|
|
|
@@ -587,18 +602,16 @@ func (e *Encoder) kSlice(f *codecFnInfo, rv reflect.Value) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if cr != nil {
|
|
|
- if ti.mbs {
|
|
|
- cr.sendContainerState(containerMapEnd)
|
|
|
- } else {
|
|
|
- cr.sendContainerState(containerArrayEnd)
|
|
|
- }
|
|
|
+ if ti.mbs {
|
|
|
+ ee.WriteMapEnd()
|
|
|
+ } else {
|
|
|
+ ee.WriteArrayEnd()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
func (e *Encoder) kStructNoOmitempty(f *codecFnInfo, rv reflect.Value) {
|
|
|
fti := f.ti
|
|
|
- cr := e.cr
|
|
|
+ elemsep := e.hh.hasElemSeparators()
|
|
|
tisfi := fti.sfip
|
|
|
toMap := !(fti.toArray || e.h.StructToArray)
|
|
|
if toMap {
|
|
|
@@ -608,10 +621,10 @@ func (e *Encoder) kStructNoOmitempty(f *codecFnInfo, rv reflect.Value) {
|
|
|
|
|
|
sfn := structFieldNode{v: rv, update: false}
|
|
|
if toMap {
|
|
|
- ee.EncodeMapStart(len(tisfi))
|
|
|
+ ee.WriteMapStart(len(tisfi))
|
|
|
// asSymbols := e.h.AsSymbols&AsSymbolStructFieldNameFlag != 0
|
|
|
asSymbols := e.h.AsSymbols == AsSymbolDefault || e.h.AsSymbols&AsSymbolStructFieldNameFlag != 0
|
|
|
- if cr == nil {
|
|
|
+ if !elemsep {
|
|
|
for _, si := range tisfi {
|
|
|
if asSymbols {
|
|
|
ee.EncodeSymbol(si.encName)
|
|
|
@@ -622,36 +635,36 @@ func (e *Encoder) kStructNoOmitempty(f *codecFnInfo, rv reflect.Value) {
|
|
|
}
|
|
|
} else {
|
|
|
for _, si := range tisfi {
|
|
|
- cr.sendContainerState(containerMapKey)
|
|
|
+ ee.WriteMapElemKey()
|
|
|
if asSymbols {
|
|
|
ee.EncodeSymbol(si.encName)
|
|
|
} else {
|
|
|
ee.EncodeString(c_UTF8, si.encName)
|
|
|
}
|
|
|
- cr.sendContainerState(containerMapValue)
|
|
|
+ ee.WriteMapElemValue()
|
|
|
e.encodeValue(sfn.field(si), nil, true)
|
|
|
}
|
|
|
- cr.sendContainerState(containerMapEnd)
|
|
|
}
|
|
|
+ ee.WriteMapEnd()
|
|
|
} else {
|
|
|
- ee.EncodeArrayStart(len(tisfi))
|
|
|
- if cr == nil {
|
|
|
+ ee.WriteArrayStart(len(tisfi))
|
|
|
+ if !elemsep {
|
|
|
for _, si := range tisfi {
|
|
|
e.encodeValue(sfn.field(si), nil, true)
|
|
|
}
|
|
|
} else {
|
|
|
for _, si := range tisfi {
|
|
|
- cr.sendContainerState(containerArrayElem)
|
|
|
+ ee.WriteArrayElem()
|
|
|
e.encodeValue(sfn.field(si), nil, true)
|
|
|
}
|
|
|
- cr.sendContainerState(containerArrayEnd)
|
|
|
}
|
|
|
+ ee.WriteArrayEnd()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
func (e *Encoder) kStruct(f *codecFnInfo, rv reflect.Value) {
|
|
|
fti := f.ti
|
|
|
- cr := e.cr
|
|
|
+ elemsep := e.hh.hasElemSeparators()
|
|
|
tisfi := fti.sfip
|
|
|
toMap := !(fti.toArray || e.h.StructToArray)
|
|
|
// if toMap, use the sorted array. If toArray, use unsorted array (to match sequence in struct)
|
|
|
@@ -722,10 +735,10 @@ func (e *Encoder) kStruct(f *codecFnInfo, rv reflect.Value) {
|
|
|
}
|
|
|
|
|
|
if toMap {
|
|
|
- ee.EncodeMapStart(newlen)
|
|
|
+ ee.WriteMapStart(newlen)
|
|
|
// asSymbols := e.h.AsSymbols&AsSymbolStructFieldNameFlag != 0
|
|
|
asSymbols := e.h.AsSymbols == AsSymbolDefault || e.h.AsSymbols&AsSymbolStructFieldNameFlag != 0
|
|
|
- if cr == nil {
|
|
|
+ if !elemsep {
|
|
|
for j := 0; j < newlen; j++ {
|
|
|
kv = fkvs[j]
|
|
|
if asSymbols {
|
|
|
@@ -738,30 +751,30 @@ func (e *Encoder) kStruct(f *codecFnInfo, rv reflect.Value) {
|
|
|
} else {
|
|
|
for j := 0; j < newlen; j++ {
|
|
|
kv = fkvs[j]
|
|
|
- cr.sendContainerState(containerMapKey)
|
|
|
+ ee.WriteMapElemKey()
|
|
|
if asSymbols {
|
|
|
ee.EncodeSymbol(kv.v)
|
|
|
} else {
|
|
|
ee.EncodeString(c_UTF8, kv.v)
|
|
|
}
|
|
|
- cr.sendContainerState(containerMapValue)
|
|
|
+ ee.WriteMapElemValue()
|
|
|
e.encodeValue(kv.r, nil, true)
|
|
|
}
|
|
|
- cr.sendContainerState(containerMapEnd)
|
|
|
}
|
|
|
+ ee.WriteMapEnd()
|
|
|
} else {
|
|
|
- ee.EncodeArrayStart(newlen)
|
|
|
- if cr == nil {
|
|
|
+ ee.WriteArrayStart(newlen)
|
|
|
+ if !elemsep {
|
|
|
for j := 0; j < newlen; j++ {
|
|
|
e.encodeValue(fkvs[j].r, nil, true)
|
|
|
}
|
|
|
} else {
|
|
|
for j := 0; j < newlen; j++ {
|
|
|
- cr.sendContainerState(containerArrayElem)
|
|
|
+ ee.WriteArrayElem()
|
|
|
e.encodeValue(fkvs[j].r, nil, true)
|
|
|
}
|
|
|
- cr.sendContainerState(containerArrayEnd)
|
|
|
}
|
|
|
+ ee.WriteArrayEnd()
|
|
|
}
|
|
|
|
|
|
// do not use defer. Instead, use explicit pool return at end of function.
|
|
|
@@ -780,12 +793,10 @@ func (e *Encoder) kMap(f *codecFnInfo, rv reflect.Value) {
|
|
|
}
|
|
|
|
|
|
l := rv.Len()
|
|
|
- ee.EncodeMapStart(l)
|
|
|
- cr := e.cr
|
|
|
+ ee.WriteMapStart(l)
|
|
|
+ elemsep := e.hh.hasElemSeparators()
|
|
|
if l == 0 {
|
|
|
- if cr != nil {
|
|
|
- cr.sendContainerState(containerMapEnd)
|
|
|
- }
|
|
|
+ ee.WriteMapEnd()
|
|
|
return
|
|
|
}
|
|
|
var asSymbols bool
|
|
|
@@ -814,9 +825,7 @@ func (e *Encoder) kMap(f *codecFnInfo, rv reflect.Value) {
|
|
|
|
|
|
if e.h.Canonical {
|
|
|
e.kMapCanonical(rtkey, rv, mks, valFn, asSymbols)
|
|
|
- if cr != nil {
|
|
|
- cr.sendContainerState(containerMapEnd)
|
|
|
- }
|
|
|
+ ee.WriteMapEnd()
|
|
|
return
|
|
|
}
|
|
|
|
|
|
@@ -843,8 +852,8 @@ func (e *Encoder) kMap(f *codecFnInfo, rv reflect.Value) {
|
|
|
LABEL1:
|
|
|
recognizedVtyp = useLookupRecognizedTypes && isRecognizedRtidOrPtr(rtvalid)
|
|
|
for j := range mks {
|
|
|
- if cr != nil {
|
|
|
- cr.sendContainerState(containerMapKey)
|
|
|
+ if elemsep {
|
|
|
+ ee.WriteMapElemKey()
|
|
|
}
|
|
|
if keyTypeIsString {
|
|
|
if asSymbols {
|
|
|
@@ -857,8 +866,8 @@ LABEL1:
|
|
|
} else {
|
|
|
e.encodeValue(mks[j], keyFn, true)
|
|
|
}
|
|
|
- if cr != nil {
|
|
|
- cr.sendContainerState(containerMapValue)
|
|
|
+ if elemsep {
|
|
|
+ ee.WriteMapElemValue()
|
|
|
}
|
|
|
if useLookupRecognizedTypes && recognizedVtyp {
|
|
|
e.encode(rv2i(rv.MapIndex(mks[j])))
|
|
|
@@ -866,14 +875,12 @@ LABEL1:
|
|
|
e.encodeValue(rv.MapIndex(mks[j]), valFn, true)
|
|
|
}
|
|
|
}
|
|
|
- if cr != nil {
|
|
|
- cr.sendContainerState(containerMapEnd)
|
|
|
- }
|
|
|
+ ee.WriteMapEnd()
|
|
|
}
|
|
|
|
|
|
func (e *Encoder) kMapCanonical(rtkey reflect.Type, rv reflect.Value, mks []reflect.Value, valFn *codecFn, asSymbols bool) {
|
|
|
ee := e.e
|
|
|
- cr := e.cr
|
|
|
+ elemsep := e.hh.hasElemSeparators()
|
|
|
// we previously did out-of-band if an extension was registered.
|
|
|
// This is not necessary, as the natural kind is sufficient for ordering.
|
|
|
|
|
|
@@ -887,12 +894,12 @@ func (e *Encoder) kMapCanonical(rtkey reflect.Type, rv reflect.Value, mks []refl
|
|
|
// }
|
|
|
// sort.Sort(bytesRvSlice(mksv))
|
|
|
// for i := range mksv {
|
|
|
- // if cr != nil {
|
|
|
- // cr.sendContainerState(containerMapKey)
|
|
|
+ // if elemsep {
|
|
|
+ // ee.WriteMapElemKey()
|
|
|
// }
|
|
|
// ee.EncodeStringBytes(c_RAW, mksv[i].v)
|
|
|
- // if cr != nil {
|
|
|
- // cr.sendContainerState(containerMapValue)
|
|
|
+ // if elemsep {
|
|
|
+ // ee.WriteMapElemValue()
|
|
|
// }
|
|
|
// e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true)
|
|
|
// }
|
|
|
@@ -909,12 +916,12 @@ func (e *Encoder) kMapCanonical(rtkey reflect.Type, rv reflect.Value, mks []refl
|
|
|
}
|
|
|
sort.Sort(boolRvSlice(mksv))
|
|
|
for i := range mksv {
|
|
|
- if cr != nil {
|
|
|
- cr.sendContainerState(containerMapKey)
|
|
|
+ if elemsep {
|
|
|
+ ee.WriteMapElemKey()
|
|
|
}
|
|
|
ee.EncodeBool(mksv[i].v)
|
|
|
- if cr != nil {
|
|
|
- cr.sendContainerState(containerMapValue)
|
|
|
+ if elemsep {
|
|
|
+ ee.WriteMapElemValue()
|
|
|
}
|
|
|
e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true)
|
|
|
}
|
|
|
@@ -927,16 +934,16 @@ func (e *Encoder) kMapCanonical(rtkey reflect.Type, rv reflect.Value, mks []refl
|
|
|
}
|
|
|
sort.Sort(stringRvSlice(mksv))
|
|
|
for i := range mksv {
|
|
|
- if cr != nil {
|
|
|
- cr.sendContainerState(containerMapKey)
|
|
|
+ if elemsep {
|
|
|
+ ee.WriteMapElemKey()
|
|
|
}
|
|
|
if asSymbols {
|
|
|
ee.EncodeSymbol(mksv[i].v)
|
|
|
} else {
|
|
|
ee.EncodeString(c_UTF8, mksv[i].v)
|
|
|
}
|
|
|
- if cr != nil {
|
|
|
- cr.sendContainerState(containerMapValue)
|
|
|
+ if elemsep {
|
|
|
+ ee.WriteMapElemValue()
|
|
|
}
|
|
|
e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true)
|
|
|
}
|
|
|
@@ -949,12 +956,12 @@ func (e *Encoder) kMapCanonical(rtkey reflect.Type, rv reflect.Value, mks []refl
|
|
|
}
|
|
|
sort.Sort(uintRvSlice(mksv))
|
|
|
for i := range mksv {
|
|
|
- if cr != nil {
|
|
|
- cr.sendContainerState(containerMapKey)
|
|
|
+ if elemsep {
|
|
|
+ ee.WriteMapElemKey()
|
|
|
}
|
|
|
ee.EncodeUint(mksv[i].v)
|
|
|
- if cr != nil {
|
|
|
- cr.sendContainerState(containerMapValue)
|
|
|
+ if elemsep {
|
|
|
+ ee.WriteMapElemValue()
|
|
|
}
|
|
|
e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true)
|
|
|
}
|
|
|
@@ -967,12 +974,12 @@ func (e *Encoder) kMapCanonical(rtkey reflect.Type, rv reflect.Value, mks []refl
|
|
|
}
|
|
|
sort.Sort(intRvSlice(mksv))
|
|
|
for i := range mksv {
|
|
|
- if cr != nil {
|
|
|
- cr.sendContainerState(containerMapKey)
|
|
|
+ if elemsep {
|
|
|
+ ee.WriteMapElemKey()
|
|
|
}
|
|
|
ee.EncodeInt(mksv[i].v)
|
|
|
- if cr != nil {
|
|
|
- cr.sendContainerState(containerMapValue)
|
|
|
+ if elemsep {
|
|
|
+ ee.WriteMapElemValue()
|
|
|
}
|
|
|
e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true)
|
|
|
}
|
|
|
@@ -985,12 +992,12 @@ func (e *Encoder) kMapCanonical(rtkey reflect.Type, rv reflect.Value, mks []refl
|
|
|
}
|
|
|
sort.Sort(floatRvSlice(mksv))
|
|
|
for i := range mksv {
|
|
|
- if cr != nil {
|
|
|
- cr.sendContainerState(containerMapKey)
|
|
|
+ if elemsep {
|
|
|
+ ee.WriteMapElemKey()
|
|
|
}
|
|
|
ee.EncodeFloat32(float32(mksv[i].v))
|
|
|
- if cr != nil {
|
|
|
- cr.sendContainerState(containerMapValue)
|
|
|
+ if elemsep {
|
|
|
+ ee.WriteMapElemValue()
|
|
|
}
|
|
|
e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true)
|
|
|
}
|
|
|
@@ -1003,12 +1010,12 @@ func (e *Encoder) kMapCanonical(rtkey reflect.Type, rv reflect.Value, mks []refl
|
|
|
}
|
|
|
sort.Sort(floatRvSlice(mksv))
|
|
|
for i := range mksv {
|
|
|
- if cr != nil {
|
|
|
- cr.sendContainerState(containerMapKey)
|
|
|
+ if elemsep {
|
|
|
+ ee.WriteMapElemKey()
|
|
|
}
|
|
|
ee.EncodeFloat64(mksv[i].v)
|
|
|
- if cr != nil {
|
|
|
- cr.sendContainerState(containerMapValue)
|
|
|
+ if elemsep {
|
|
|
+ ee.WriteMapElemValue()
|
|
|
}
|
|
|
e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true)
|
|
|
}
|
|
|
@@ -1027,12 +1034,12 @@ func (e *Encoder) kMapCanonical(rtkey reflect.Type, rv reflect.Value, mks []refl
|
|
|
}
|
|
|
sort.Sort(bytesRvSlice(mksbv))
|
|
|
for j := range mksbv {
|
|
|
- if cr != nil {
|
|
|
- cr.sendContainerState(containerMapKey)
|
|
|
+ if elemsep {
|
|
|
+ ee.WriteMapElemKey()
|
|
|
}
|
|
|
e.asis(mksbv[j].v)
|
|
|
- if cr != nil {
|
|
|
- cr.sendContainerState(containerMapValue)
|
|
|
+ if elemsep {
|
|
|
+ ee.WriteMapElemValue()
|
|
|
}
|
|
|
e.encodeValue(rv.MapIndex(mksbv[j].r), valFn, true)
|
|
|
}
|
|
|
@@ -1058,7 +1065,7 @@ type Encoder struct {
|
|
|
wb bytesEncWriter
|
|
|
bw bufio.Writer
|
|
|
|
|
|
- cr containerStateRecv
|
|
|
+ // cr containerStateRecv
|
|
|
as encDriverAsis
|
|
|
// ---- cpu cache line boundary?
|
|
|
|
|
|
@@ -1094,7 +1101,7 @@ func newEncoder(h Handle) *Encoder {
|
|
|
e := &Encoder{hh: h, h: h.getBasicHandle()}
|
|
|
e.e = h.newEncDriver(e)
|
|
|
e.as, _ = e.e.(encDriverAsis)
|
|
|
- e.cr, _ = e.e.(containerStateRecv)
|
|
|
+ // e.cr, _ = e.e.(containerStateRecv)
|
|
|
return e
|
|
|
}
|
|
|
|