go-json/encode_vm.go

5478 lines
146 KiB
Go
Raw Normal View History

2020-04-29 18:31:50 +03:00
package json
import (
2020-08-18 07:36:36 +03:00
"bytes"
2020-05-08 14:22:57 +03:00
"encoding"
2020-08-19 04:34:11 +03:00
"encoding/base64"
"fmt"
"math"
2020-04-29 18:31:50 +03:00
"reflect"
"strconv"
2020-04-29 18:31:50 +03:00
"unsafe"
)
2020-09-01 16:26:26 +03:00
const startDetectingCyclesAfter = 1000
2020-08-30 21:14:37 +03:00
func load(base uintptr, idx uintptr) uintptr {
return *(*uintptr)(unsafe.Pointer(base + idx))
}
2020-08-30 21:14:37 +03:00
func store(base uintptr, idx uintptr, p uintptr) {
*(*uintptr)(unsafe.Pointer(base + idx)) = p
}
2020-09-01 16:26:26 +03:00
func (e *Encoder) run(ctx *encodeRuntimeContext, recursiveLevel int, seenPtr map[uintptr]struct{}, code *opcode) error {
2020-09-03 09:36:11 +03:00
ptrOffset := uintptr(0)
ctxptr := ctx.ptr()
2020-04-29 18:31:50 +03:00
for {
switch code.op {
case opPtr:
ptr := load(ctxptr, code.idx)
2020-04-29 18:31:50 +03:00
code = code.next
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-04-29 18:31:50 +03:00
case opInt:
e.encodeInt(e.ptrToInt(load(ctxptr, code.idx)))
2020-04-29 18:31:50 +03:00
code = code.next
case opInt8:
e.encodeInt8(e.ptrToInt8(load(ctxptr, code.idx)))
2020-04-29 18:31:50 +03:00
code = code.next
case opInt16:
e.encodeInt16(e.ptrToInt16(load(ctxptr, code.idx)))
2020-04-29 18:31:50 +03:00
code = code.next
case opInt32:
e.encodeInt32(e.ptrToInt32(load(ctxptr, code.idx)))
2020-04-29 18:31:50 +03:00
code = code.next
case opInt64:
e.encodeInt64(e.ptrToInt64(load(ctxptr, code.idx)))
2020-04-29 18:31:50 +03:00
code = code.next
case opUint:
e.encodeUint(e.ptrToUint(load(ctxptr, code.idx)))
2020-04-29 18:31:50 +03:00
code = code.next
case opUint8:
e.encodeUint8(e.ptrToUint8(load(ctxptr, code.idx)))
2020-04-29 18:31:50 +03:00
code = code.next
case opUint16:
e.encodeUint16(e.ptrToUint16(load(ctxptr, code.idx)))
2020-04-29 18:31:50 +03:00
code = code.next
case opUint32:
e.encodeUint32(e.ptrToUint32(load(ctxptr, code.idx)))
2020-04-29 18:31:50 +03:00
code = code.next
case opUint64:
e.encodeUint64(e.ptrToUint64(load(ctxptr, code.idx)))
2020-04-29 18:31:50 +03:00
code = code.next
case opFloat32:
e.encodeFloat32(e.ptrToFloat32(load(ctxptr, code.idx)))
2020-04-29 18:31:50 +03:00
code = code.next
case opFloat64:
v := e.ptrToFloat64(load(ctxptr, code.idx))
if math.IsInf(v, 0) || math.IsNaN(v) {
return &UnsupportedValueError{
Value: reflect.ValueOf(v),
Str: strconv.FormatFloat(v, 'g', -1, 64),
}
}
e.encodeFloat64(v)
2020-04-29 18:31:50 +03:00
code = code.next
case opString:
e.encodeString(e.ptrToString(load(ctxptr, code.idx)))
2020-04-29 18:31:50 +03:00
code = code.next
case opBool:
e.encodeBool(e.ptrToBool(load(ctxptr, code.idx)))
2020-04-29 18:31:50 +03:00
code = code.next
2020-08-19 04:34:11 +03:00
case opBytes:
ptr := load(ctxptr, code.idx)
2020-08-21 05:51:33 +03:00
header := (*reflect.SliceHeader)(unsafe.Pointer(ptr))
if ptr == 0 || header.Data == 0 {
e.encodeNull()
} else {
b := e.ptrToBytes(ptr)
2020-08-25 11:19:41 +03:00
encodedLen := base64.StdEncoding.EncodedLen(len(b))
2020-08-21 05:51:33 +03:00
e.encodeByte('"')
2020-08-25 11:19:41 +03:00
buf := make([]byte, encodedLen)
base64.StdEncoding.Encode(buf, b)
e.encodeBytes(buf)
2020-08-21 05:51:33 +03:00
e.encodeByte('"')
}
2020-08-19 04:34:11 +03:00
code = code.next
case opInterface:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.idx)
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{
2020-08-31 15:59:22 +03:00
typ: code.typ,
ptr: unsafe.Pointer(ptr),
}))
2020-08-20 19:01:24 +03:00
if _, exists := seenPtr[ptr]; exists {
2020-08-20 17:56:12 +03:00
return &UnsupportedValueError{
Value: reflect.ValueOf(v),
Str: fmt.Sprintf("encountered a cycle via %s", code.typ),
}
}
2020-08-20 19:01:24 +03:00
seenPtr[ptr] = struct{}{}
2020-08-12 10:54:15 +03:00
rv := reflect.ValueOf(v)
if rv.IsNil() {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-12 10:54:15 +03:00
break
}
vv := rv.Interface()
header := (*interfaceHeader)(unsafe.Pointer(&vv))
typ := header.typ
if typ.Kind() == reflect.Ptr {
typ = typ.Elem()
}
2020-08-12 19:21:10 +03:00
var c *opcode
if typ.Kind() == reflect.Map {
2020-08-29 09:11:31 +03:00
code, err := e.compileMap(&encodeCompileContext{
typ: typ,
2020-08-31 15:59:22 +03:00
root: code.root,
2020-08-29 09:11:31 +03:00
withIndent: e.enabledIndent,
2020-08-31 15:59:22 +03:00
indent: code.indent,
2020-08-29 09:11:31 +03:00
}, false)
2020-08-12 19:21:10 +03:00
if err != nil {
return err
}
c = code
} else {
2020-08-29 09:11:31 +03:00
code, err := e.compile(&encodeCompileContext{
typ: typ,
2020-08-31 15:59:22 +03:00
root: code.root,
2020-08-29 09:11:31 +03:00
withIndent: e.enabledIndent,
2020-08-31 15:59:22 +03:00
indent: code.indent,
2020-08-29 09:11:31 +03:00
})
2020-08-12 19:21:10 +03:00
if err != nil {
return err
}
c = code
}
2020-09-03 09:36:11 +03:00
beforeLastCode := c.beforeLastCode()
lastCode := beforeLastCode.next
lastCode.idx = beforeLastCode.idx + uintptrSize
totalLength := uintptr(code.totalLength())
nextTotalLength := uintptr(c.totalLength())
curlen := uintptr(len(ctx.ptrs))
offsetNum := ptrOffset / uintptrSize
oldOffset := ptrOffset
ptrOffset = ptrOffset + totalLength*uintptrSize // curlen * uintptrSize
}
newLen := offsetNum + totalLength + nextTotalLength
if curlen < newLen {
ctx.ptrs = append(ctx.ptrs, make([]uintptr, newLen-curlen)...)
store(ctx.ptr()+ptrOffset, 0, uintptr(header.ptr))
} else {
store(ctx.ptr()+ptrOffset, 0, uintptr(header.ptr))
}
2020-09-03 09:36:11 +03:00
ctxptr = ctx.ptr() + ptrOffset // assign new ctxptr
if load(ctxptr, 0) != uintptr(header.ptr) {
panic(nil)
}
2020-09-03 09:36:11 +03:00
// save current ctxptr
store(ctxptr, lastCode.idx, oldOffset)
// link lastCode ( opInterfaceEnd ) => code.next
lastCode.op = opInterfaceEnd
lastCode.next = code.next
code = c
recursiveLevel++
case opInterfaceEnd:
recursiveLevel--
// restore ctxptr
offset := load(ctxptr, code.idx)
ctxptr = ctx.ptr() + offset
ptrOffset = offset
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-04 12:39:17 +03:00
case opMarshalJSON:
ptr := load(ctxptr, code.idx)
2020-05-04 12:39:17 +03:00
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{
typ: code.typ,
ptr: unsafe.Pointer(ptr),
}))
2020-08-18 07:36:36 +03:00
b, err := v.(Marshaler).MarshalJSON()
2020-05-04 12:39:17 +03:00
if err != nil {
2020-05-08 19:38:00 +03:00
return &MarshalerError{
Type: rtype2type(code.typ),
Err: err,
}
2020-05-04 12:39:17 +03:00
}
if len(b) == 0 {
return errUnexpectedEndOfJSON(
fmt.Sprintf("error calling MarshalJSON for type %s", code.typ),
0,
)
}
2020-08-18 07:36:36 +03:00
var buf bytes.Buffer
2020-08-27 15:01:53 +03:00
if e.enabledIndent {
if err := encodeWithIndent(
&buf,
b,
string(e.prefix)+string(bytes.Repeat(e.indentStr, code.indent)),
string(e.indentStr),
); err != nil {
return err
}
} else {
if err := compact(&buf, b, true); err != nil {
return err
}
2020-08-18 07:36:36 +03:00
}
e.encodeBytes(buf.Bytes())
2020-05-04 12:39:17 +03:00
code = code.next
case opMarshalText:
ptr := load(ctxptr, code.idx)
2020-08-20 11:47:38 +03:00
isPtr := code.typ.Kind() == reflect.Ptr
p := unsafe.Pointer(ptr)
2020-08-21 05:07:55 +03:00
if p == nil {
e.encodeNull()
} else if isPtr && *(*unsafe.Pointer)(p) == nil {
2020-08-20 11:47:38 +03:00
e.encodeBytes([]byte{'"', '"'})
} else {
if isPtr && code.typ.Elem().Implements(marshalTextType) {
p = *(*unsafe.Pointer)(p)
}
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{
typ: code.typ,
ptr: p,
}))
bytes, err := v.(encoding.TextMarshaler).MarshalText()
if err != nil {
return &MarshalerError{
Type: rtype2type(code.typ),
Err: err,
}
2020-05-08 19:38:00 +03:00
}
2020-08-20 11:47:38 +03:00
e.encodeString(*(*string)(unsafe.Pointer(&bytes)))
2020-05-04 12:39:17 +03:00
}
code = code.next
2020-04-29 18:31:50 +03:00
case opSliceHead:
p := load(ctxptr, code.idx)
2020-08-21 05:51:33 +03:00
header := (*reflect.SliceHeader)(unsafe.Pointer(p))
if p == 0 || header.Data == 0 {
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-04-29 18:31:50 +03:00
} else {
e.encodeByte('[')
2020-08-31 15:59:22 +03:00
store(ctxptr, code.elemIdx, 0)
store(ctxptr, code.length, uintptr(header.Len))
store(ctxptr, code.idx, header.Data)
2020-04-29 19:44:48 +03:00
if header.Len > 0 {
code = code.next
store(ctxptr, code.idx, header.Data)
2020-04-29 19:44:48 +03:00
} else {
e.encodeByte(']')
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-04-29 19:44:48 +03:00
}
2020-04-29 18:31:50 +03:00
}
case opSliceElem:
2020-08-31 15:59:22 +03:00
idx := load(ctxptr, code.elemIdx)
length := load(ctxptr, code.length)
idx++
if idx < length {
2020-04-29 18:31:50 +03:00
e.encodeByte(',')
2020-08-31 15:59:22 +03:00
store(ctxptr, code.elemIdx, idx)
data := load(ctxptr, code.headIdx)
2020-09-01 16:26:26 +03:00
size := code.size
code = code.next
store(ctxptr, code.idx, data+idx*size)
2020-04-29 18:31:50 +03:00
} else {
2020-04-29 19:44:48 +03:00
e.encodeByte(']')
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-04-29 18:31:50 +03:00
}
2020-05-02 17:35:41 +03:00
case opSliceHeadIndent:
p := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if p == 0 {
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
} else {
header := (*reflect.SliceHeader)(unsafe.Pointer(p))
2020-08-31 15:59:22 +03:00
store(ctxptr, code.elemIdx, 0)
store(ctxptr, code.length, uintptr(header.Len))
store(ctxptr, code.idx, header.Data)
2020-05-02 17:35:41 +03:00
if header.Len > 0 {
2020-08-12 10:54:15 +03:00
e.encodeBytes([]byte{'[', '\n'})
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent + 1)
code = code.next
store(ctxptr, code.idx, header.Data)
2020-05-02 17:35:41 +03:00
} else {
e.encodeIndent(code.indent)
2020-08-22 18:53:38 +03:00
e.encodeBytes([]byte{'[', ']'})
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-12 10:54:15 +03:00
}
}
case opRootSliceHeadIndent:
p := load(ctxptr, code.idx)
2020-08-12 10:54:15 +03:00
if p == 0 {
e.encodeIndent(code.indent)
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-12 10:54:15 +03:00
} else {
header := (*reflect.SliceHeader)(unsafe.Pointer(p))
2020-08-31 15:59:22 +03:00
store(ctxptr, code.elemIdx, 0)
store(ctxptr, code.length, uintptr(header.Len))
store(ctxptr, code.idx, header.Data)
2020-08-12 10:54:15 +03:00
if header.Len > 0 {
e.encodeBytes([]byte{'[', '\n'})
e.encodeIndent(code.indent + 1)
code = code.next
store(ctxptr, code.idx, header.Data)
2020-08-12 10:54:15 +03:00
} else {
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'[', ']'})
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
}
}
case opSliceElemIndent:
2020-08-31 15:59:22 +03:00
idx := load(ctxptr, code.elemIdx)
length := load(ctxptr, code.length)
idx++
if idx < length {
2020-05-02 17:35:41 +03:00
e.encodeBytes([]byte{',', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
store(ctxptr, code.elemIdx, idx)
data := load(ctxptr, code.headIdx)
2020-09-01 16:26:26 +03:00
size := code.size
code = code.next
store(ctxptr, code.idx, data+idx*size)
2020-05-02 17:35:41 +03:00
} else {
e.encodeByte('\n')
e.encodeIndent(code.indent)
2020-08-22 18:53:38 +03:00
e.encodeByte(']')
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
}
2020-08-12 10:54:15 +03:00
case opRootSliceElemIndent:
2020-08-31 15:59:22 +03:00
idx := load(ctxptr, code.elemIdx)
length := load(ctxptr, code.length)
idx++
if idx < length {
2020-08-12 10:54:15 +03:00
e.encodeBytes([]byte{',', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
store(ctxptr, code.elemIdx, idx)
2020-08-12 10:54:15 +03:00
code = code.next
2020-08-31 15:59:22 +03:00
data := load(ctxptr, code.headIdx)
store(ctxptr, code.idx, data+idx*code.size)
2020-08-12 10:54:15 +03:00
} else {
e.encodeByte('\n')
e.encodeIndent(code.indent)
2020-08-27 15:01:53 +03:00
e.encodeByte(']')
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-12 10:54:15 +03:00
}
case opArrayHead:
p := load(ctxptr, code.idx)
if p == 0 {
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
} else {
e.encodeByte('[')
2020-08-31 15:59:22 +03:00
if code.length > 0 {
2020-09-01 16:26:26 +03:00
store(ctxptr, code.elemIdx, 0)
code = code.next
store(ctxptr, code.idx, p)
} else {
e.encodeByte(']')
2020-08-31 15:59:22 +03:00
code = code.end.next
}
}
case opArrayElem:
2020-08-31 15:59:22 +03:00
idx := load(ctxptr, code.elemIdx)
idx++
if idx < code.length {
e.encodeByte(',')
2020-08-31 15:59:22 +03:00
store(ctxptr, code.elemIdx, idx)
p := load(ctxptr, code.headIdx)
2020-09-01 16:26:26 +03:00
size := code.size
code = code.next
2020-09-01 16:26:26 +03:00
store(ctxptr, code.idx, p+idx*size)
} else {
e.encodeByte(']')
2020-08-31 15:59:22 +03:00
code = code.end.next
}
2020-05-02 17:35:41 +03:00
case opArrayHeadIndent:
p := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if p == 0 {
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
} else {
e.encodeBytes([]byte{'[', '\n'})
2020-08-31 15:59:22 +03:00
if code.length > 0 {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent + 1)
2020-09-01 16:26:26 +03:00
store(ctxptr, code.elemIdx, 0)
2020-05-02 17:35:41 +03:00
code = code.next
store(ctxptr, code.idx, p)
2020-05-02 17:35:41 +03:00
} else {
e.encodeIndent(code.indent)
e.encodeBytes([]byte{']', '\n'})
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
}
}
case opArrayElemIndent:
2020-08-31 15:59:22 +03:00
idx := load(ctxptr, code.elemIdx)
idx++
if idx < code.length {
2020-05-02 17:35:41 +03:00
e.encodeBytes([]byte{',', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
store(ctxptr, code.elemIdx, idx)
p := load(ctxptr, code.headIdx)
2020-09-01 16:26:26 +03:00
size := code.size
2020-05-02 17:35:41 +03:00
code = code.next
2020-09-01 16:26:26 +03:00
store(ctxptr, code.idx, p+idx*size)
2020-05-02 17:35:41 +03:00
} else {
e.encodeByte('\n')
e.encodeIndent(code.indent)
e.encodeBytes([]byte{']', '\n'})
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
}
case opMapHead:
ptr := load(ctxptr, code.idx)
if ptr == 0 {
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
} else {
e.encodeByte('{')
mlen := maplen(unsafe.Pointer(ptr))
if mlen > 0 {
iter := mapiterinit(code.typ, unsafe.Pointer(ptr))
2020-09-01 16:26:26 +03:00
store(ctxptr, code.elemIdx, 0)
store(ctxptr, code.length, uintptr(mlen))
store(ctxptr, code.mapIter, uintptr(iter))
key := mapiterkey(iter)
store(ctxptr, code.next.idx, uintptr(key))
code = code.next
} else {
e.encodeByte('}')
2020-08-31 15:59:22 +03:00
code = code.end.next
}
}
case opMapHeadLoad:
ptr := load(ctxptr, code.idx)
if ptr == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
} else {
// load pointer
ptr = uintptr(*(*unsafe.Pointer)(unsafe.Pointer(ptr)))
e.encodeByte('{')
mlen := maplen(unsafe.Pointer(ptr))
if mlen > 0 {
iter := mapiterinit(code.typ, unsafe.Pointer(ptr))
2020-09-01 16:26:26 +03:00
store(ctxptr, code.elemIdx, 0)
store(ctxptr, code.length, uintptr(mlen))
store(ctxptr, code.mapIter, uintptr(iter))
key := mapiterkey(iter)
store(ctxptr, code.next.idx, uintptr(key))
code = code.next
} else {
e.encodeByte('}')
2020-08-31 15:59:22 +03:00
code = code.end.next
}
}
case opMapKey:
2020-08-31 15:59:22 +03:00
idx := load(ctxptr, code.elemIdx)
length := load(ctxptr, code.length)
idx++
if idx < length {
e.encodeByte(',')
2020-08-31 15:59:22 +03:00
iter := unsafe.Pointer(load(ctxptr, code.mapIter))
store(ctxptr, code.elemIdx, idx)
key := mapiterkey(iter)
store(ctxptr, code.next.idx, uintptr(key))
code = code.next
} else {
e.encodeByte('}')
2020-08-31 15:59:22 +03:00
code = code.end.next
}
case opMapValue:
e.encodeByte(':')
2020-08-31 15:59:22 +03:00
iter := unsafe.Pointer(load(ctxptr, code.mapIter))
value := mapitervalue(iter)
store(ctxptr, code.next.idx, uintptr(value))
mapiternext(iter)
code = code.next
2020-05-02 17:35:41 +03:00
case opMapHeadIndent:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
} else {
mlen := maplen(unsafe.Pointer(ptr))
if mlen > 0 {
2020-08-12 10:54:15 +03:00
e.encodeBytes([]byte{'{', '\n'})
2020-05-02 17:35:41 +03:00
iter := mapiterinit(code.typ, unsafe.Pointer(ptr))
2020-09-01 16:26:26 +03:00
store(ctxptr, code.elemIdx, 0)
store(ctxptr, code.length, uintptr(mlen))
store(ctxptr, code.mapIter, uintptr(iter))
2020-05-02 17:35:41 +03:00
key := mapiterkey(iter)
store(ctxptr, code.next.idx, uintptr(key))
2020-05-02 17:35:41 +03:00
code = code.next
e.encodeIndent(code.indent)
} else {
2020-08-12 10:54:15 +03:00
e.encodeIndent(code.indent)
2020-08-22 18:53:38 +03:00
e.encodeBytes([]byte{'{', '}'})
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-12 10:54:15 +03:00
}
}
case opMapHeadLoadIndent:
ptr := load(ctxptr, code.idx)
2020-08-12 10:54:15 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-12 10:54:15 +03:00
} else {
// load pointer
ptr = uintptr(*(*unsafe.Pointer)(unsafe.Pointer(ptr)))
mlen := maplen(unsafe.Pointer(ptr))
if mlen > 0 {
e.encodeBytes([]byte{'{', '\n'})
iter := mapiterinit(code.typ, unsafe.Pointer(ptr))
2020-09-01 16:26:26 +03:00
store(ctxptr, code.elemIdx, 0)
store(ctxptr, code.length, uintptr(mlen))
store(ctxptr, code.mapIter, uintptr(iter))
2020-08-12 10:54:15 +03:00
key := mapiterkey(iter)
store(ctxptr, code.next.idx, uintptr(key))
2020-08-12 10:54:15 +03:00
code = code.next
e.encodeIndent(code.indent)
} else {
e.encodeIndent(code.indent)
2020-08-22 18:53:38 +03:00
e.encodeBytes([]byte{'{', '}'})
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-12 10:54:15 +03:00
}
}
case opRootMapHeadIndent:
ptr := load(ctxptr, code.idx)
2020-08-12 10:54:15 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-12 10:54:15 +03:00
} else {
mlen := maplen(unsafe.Pointer(ptr))
if mlen > 0 {
e.encodeBytes([]byte{'{', '\n'})
iter := mapiterinit(code.typ, unsafe.Pointer(ptr))
2020-09-01 16:26:26 +03:00
store(ctxptr, code.elemIdx, 0)
store(ctxptr, code.length, uintptr(mlen))
store(ctxptr, code.mapIter, uintptr(iter))
2020-08-12 10:54:15 +03:00
key := mapiterkey(iter)
store(ctxptr, code.next.idx, uintptr(key))
2020-08-12 10:54:15 +03:00
code = code.next
e.encodeIndent(code.indent)
} else {
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '}'})
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
}
}
case opMapKeyIndent:
2020-08-31 15:59:22 +03:00
idx := load(ctxptr, code.elemIdx)
length := load(ctxptr, code.length)
idx++
if idx < length {
2020-05-02 17:35:41 +03:00
e.encodeBytes([]byte{',', '\n'})
e.encodeIndent(code.indent)
2020-08-31 15:59:22 +03:00
store(ctxptr, code.elemIdx, idx)
iter := unsafe.Pointer(load(ctxptr, code.mapIter))
key := mapiterkey(iter)
store(ctxptr, code.next.idx, uintptr(key))
code = code.next
2020-05-02 17:35:41 +03:00
} else {
e.encodeByte('\n')
e.encodeIndent(code.indent - 1)
2020-08-22 18:53:38 +03:00
e.encodeByte('}')
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
}
2020-08-12 10:54:15 +03:00
case opRootMapKeyIndent:
2020-08-31 15:59:22 +03:00
idx := load(ctxptr, code.elemIdx)
length := load(ctxptr, code.length)
idx++
if idx < length {
2020-08-12 10:54:15 +03:00
e.encodeBytes([]byte{',', '\n'})
e.encodeIndent(code.indent)
2020-08-31 15:59:22 +03:00
store(ctxptr, code.elemIdx, idx)
iter := unsafe.Pointer(load(ctxptr, code.mapIter))
key := mapiterkey(iter)
store(ctxptr, code.next.idx, uintptr(key))
code = code.next
2020-08-12 10:54:15 +03:00
} else {
e.encodeByte('\n')
e.encodeIndent(code.indent - 1)
2020-08-22 18:53:38 +03:00
e.encodeByte('}')
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-12 10:54:15 +03:00
}
2020-05-02 17:35:41 +03:00
case opMapValueIndent:
e.encodeBytes([]byte{':', ' '})
2020-08-31 15:59:22 +03:00
iter := unsafe.Pointer(load(ctxptr, code.mapIter))
value := mapitervalue(iter)
store(ctxptr, code.next.idx, uintptr(value))
mapiternext(iter)
code = code.next
2020-08-12 12:42:29 +03:00
case opStructFieldRecursive:
ptr := load(ctxptr, code.idx)
2020-08-31 15:59:22 +03:00
if ptr != 0 {
2020-09-01 16:26:26 +03:00
if recursiveLevel > startDetectingCyclesAfter {
if _, exists := seenPtr[ptr]; exists {
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{
typ: code.typ,
ptr: unsafe.Pointer(ptr),
}))
return &UnsupportedValueError{
Value: reflect.ValueOf(v),
Str: fmt.Sprintf("encountered a cycle via %s", code.typ),
}
2020-08-31 15:59:22 +03:00
}
2020-08-20 17:56:12 +03:00
}
}
2020-09-01 16:26:26 +03:00
seenPtr[ptr] = struct{}{}
2020-08-31 15:59:22 +03:00
c := *(code.jmp.code)
ctx := &encodeRuntimeContext{
2020-08-31 15:59:22 +03:00
ptrs: make([]uintptr, c.totalLength()),
}
ctx.init(ptr)
2020-08-31 15:59:22 +03:00
c.end.next = newEndOp(&encodeCompileContext{})
c.op = c.op.ptrHeadToHead()
2020-09-01 16:26:26 +03:00
if err := e.run(ctx, recursiveLevel+1, seenPtr, &c); err != nil {
2020-08-12 12:42:29 +03:00
return err
}
2020-08-31 15:59:22 +03:00
code = code.next
2020-04-29 19:44:48 +03:00
case opStructFieldPtrHead:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-01 07:12:01 +03:00
}
2020-04-29 19:44:48 +03:00
fallthrough
case opStructFieldHead:
ptr := load(ctxptr, code.idx)
2020-04-29 18:31:50 +03:00
if ptr == 0 {
2020-08-22 12:16:06 +03:00
if code.op == opStructFieldPtrHead {
e.encodeNull()
} else {
e.encodeBytes([]byte{'{', '}'})
}
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-04-29 18:31:50 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
if !code.anonymousKey {
e.encodeBytes(code.key)
2020-08-15 11:41:38 +03:00
}
2020-09-01 16:26:26 +03:00
p := ptr + code.offset
2020-08-31 15:59:22 +03:00
code = code.next
2020-09-01 16:26:26 +03:00
store(ctxptr, code.idx, p)
2020-04-29 19:44:48 +03:00
}
2020-08-22 06:58:34 +03:00
case opStructFieldAnonymousHead:
ptr := load(ctxptr, code.idx)
2020-08-22 06:58:34 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-22 06:58:34 +03:00
} else {
2020-08-31 15:59:22 +03:00
code = code.next
store(ctxptr, code.idx, ptr)
2020-08-22 06:58:34 +03:00
}
2020-04-29 19:44:48 +03:00
case opStructFieldPtrHeadInt:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-04-29 19:44:48 +03:00
fallthrough
case opStructFieldHeadInt:
ptr := load(ctxptr, code.idx)
2020-04-29 19:44:48 +03:00
if ptr == 0 {
2020-08-22 12:28:03 +03:00
if code.op == opStructFieldPtrHeadInt {
e.encodeNull()
} else {
e.encodeBytes([]byte{'{', '}'})
}
2020-08-31 15:59:22 +03:00
code = code.end
2020-04-29 19:44:48 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeInt(e.ptrToInt(ptr + code.offset))
code = code.next
2020-08-15 11:41:38 +03:00
}
case opStructFieldPtrAnonymousHeadInt:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-08-15 11:41:38 +03:00
fallthrough
case opStructFieldAnonymousHeadInt:
ptr := load(ctxptr, code.idx)
2020-08-15 11:41:38 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end
2020-08-15 11:41:38 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeInt(e.ptrToInt(ptr + code.offset))
code = code.next
2020-04-29 19:44:48 +03:00
}
2020-04-30 05:56:56 +03:00
case opStructFieldPtrHeadInt8:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-04-30 05:56:56 +03:00
fallthrough
case opStructFieldHeadInt8:
ptr := load(ctxptr, code.idx)
2020-04-30 05:56:56 +03:00
if ptr == 0 {
2020-08-22 12:28:03 +03:00
if code.op == opStructFieldPtrHeadInt8 {
e.encodeNull()
} else {
e.encodeBytes([]byte{'{', '}'})
}
2020-08-31 15:59:22 +03:00
code = code.end
2020-04-30 05:56:56 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeInt8(e.ptrToInt8(ptr + code.offset))
code = code.next
2020-08-15 11:41:38 +03:00
}
case opStructFieldPtrAnonymousHeadInt8:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-08-15 11:41:38 +03:00
fallthrough
case opStructFieldAnonymousHeadInt8:
ptr := load(ctxptr, code.idx)
2020-08-15 11:41:38 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end
2020-08-15 11:41:38 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeInt8(e.ptrToInt8(ptr + code.offset))
code = code.next
2020-04-30 05:56:56 +03:00
}
case opStructFieldPtrHeadInt16:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-04-30 05:56:56 +03:00
fallthrough
case opStructFieldHeadInt16:
ptr := load(ctxptr, code.idx)
2020-04-30 05:56:56 +03:00
if ptr == 0 {
2020-08-22 12:28:03 +03:00
if code.op == opStructFieldPtrHeadInt16 {
e.encodeNull()
} else {
e.encodeBytes([]byte{'{', '}'})
}
2020-08-31 15:59:22 +03:00
code = code.end
2020-04-30 05:56:56 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeInt16(e.ptrToInt16(ptr + code.offset))
code = code.next
2020-08-15 11:41:38 +03:00
}
case opStructFieldPtrAnonymousHeadInt16:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-08-15 11:41:38 +03:00
fallthrough
case opStructFieldAnonymousHeadInt16:
ptr := load(ctxptr, code.idx)
2020-08-15 11:41:38 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end
2020-08-15 11:41:38 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeInt16(e.ptrToInt16(ptr + code.offset))
code = code.next
2020-04-30 05:56:56 +03:00
}
case opStructFieldPtrHeadInt32:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-04-30 05:56:56 +03:00
fallthrough
case opStructFieldHeadInt32:
ptr := load(ctxptr, code.idx)
2020-04-30 05:56:56 +03:00
if ptr == 0 {
2020-08-22 12:28:03 +03:00
if code.op == opStructFieldPtrHeadInt32 {
e.encodeNull()
} else {
e.encodeBytes([]byte{'{', '}'})
}
2020-08-31 15:59:22 +03:00
code = code.end
2020-04-30 05:56:56 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeInt32(e.ptrToInt32(ptr + code.offset))
code = code.next
2020-08-15 11:41:38 +03:00
}
case opStructFieldPtrAnonymousHeadInt32:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-08-15 11:41:38 +03:00
fallthrough
case opStructFieldAnonymousHeadInt32:
ptr := load(ctxptr, code.idx)
2020-08-15 11:41:38 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end
2020-08-15 11:41:38 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeInt32(e.ptrToInt32(ptr + code.offset))
code = code.next
2020-04-30 05:56:56 +03:00
}
case opStructFieldPtrHeadInt64:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-04-30 05:56:56 +03:00
fallthrough
case opStructFieldHeadInt64:
ptr := load(ctxptr, code.idx)
2020-04-30 05:56:56 +03:00
if ptr == 0 {
2020-08-22 12:28:03 +03:00
if code.op == opStructFieldPtrHeadInt64 {
e.encodeNull()
} else {
e.encodeBytes([]byte{'{', '}'})
}
2020-08-31 15:59:22 +03:00
code = code.end
2020-04-30 05:56:56 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeInt64(e.ptrToInt64(ptr + code.offset))
code = code.next
2020-08-15 11:41:38 +03:00
}
case opStructFieldPtrAnonymousHeadInt64:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-08-15 11:41:38 +03:00
fallthrough
case opStructFieldAnonymousHeadInt64:
ptr := load(ctxptr, code.idx)
2020-08-15 11:41:38 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end
2020-08-15 11:41:38 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeInt64(e.ptrToInt64(ptr + code.offset))
code = code.next
2020-04-30 05:56:56 +03:00
}
case opStructFieldPtrHeadUint:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-04-30 05:56:56 +03:00
fallthrough
case opStructFieldHeadUint:
ptr := load(ctxptr, code.idx)
2020-04-30 05:56:56 +03:00
if ptr == 0 {
2020-08-22 12:28:03 +03:00
if code.op == opStructFieldPtrHeadUint {
e.encodeNull()
} else {
e.encodeBytes([]byte{'{', '}'})
}
2020-08-31 15:59:22 +03:00
code = code.end
2020-04-30 05:56:56 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeUint(e.ptrToUint(ptr + code.offset))
code = code.next
2020-08-15 11:41:38 +03:00
}
case opStructFieldPtrAnonymousHeadUint:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-08-15 11:41:38 +03:00
fallthrough
case opStructFieldAnonymousHeadUint:
ptr := load(ctxptr, code.idx)
2020-08-15 11:41:38 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end
2020-08-15 11:41:38 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeUint(e.ptrToUint(ptr + code.offset))
code = code.next
2020-04-30 05:56:56 +03:00
}
case opStructFieldPtrHeadUint8:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-04-30 05:56:56 +03:00
fallthrough
case opStructFieldHeadUint8:
ptr := load(ctxptr, code.idx)
2020-04-30 05:56:56 +03:00
if ptr == 0 {
2020-08-22 12:28:03 +03:00
if code.op == opStructFieldPtrHeadUint8 {
e.encodeNull()
} else {
e.encodeBytes([]byte{'{', '}'})
}
2020-08-31 15:59:22 +03:00
code = code.end
2020-04-30 05:56:56 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeUint8(e.ptrToUint8(ptr + code.offset))
code = code.next
2020-08-15 11:41:38 +03:00
}
case opStructFieldPtrAnonymousHeadUint8:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-08-15 11:41:38 +03:00
fallthrough
case opStructFieldAnonymousHeadUint8:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.idx)
2020-08-15 11:41:38 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end
2020-08-15 11:41:38 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeUint8(e.ptrToUint8(ptr + code.offset))
code = code.next
2020-04-30 05:56:56 +03:00
}
case opStructFieldPtrHeadUint16:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-04-30 05:56:56 +03:00
fallthrough
case opStructFieldHeadUint16:
ptr := load(ctxptr, code.idx)
2020-04-30 05:56:56 +03:00
if ptr == 0 {
2020-08-22 12:28:03 +03:00
if code.op == opStructFieldPtrHeadUint16 {
e.encodeNull()
} else {
e.encodeBytes([]byte{'{', '}'})
}
2020-08-31 15:59:22 +03:00
code = code.end
2020-04-30 05:56:56 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeUint16(e.ptrToUint16(ptr + code.offset))
code = code.next
2020-08-15 11:41:38 +03:00
}
case opStructFieldPtrAnonymousHeadUint16:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-08-15 11:41:38 +03:00
fallthrough
case opStructFieldAnonymousHeadUint16:
ptr := load(ctxptr, code.idx)
2020-08-15 11:41:38 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end
2020-08-15 11:41:38 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeUint16(e.ptrToUint16(ptr + code.offset))
code = code.next
2020-04-30 05:56:56 +03:00
}
case opStructFieldPtrHeadUint32:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-04-30 05:56:56 +03:00
fallthrough
case opStructFieldHeadUint32:
ptr := load(ctxptr, code.idx)
2020-04-30 05:56:56 +03:00
if ptr == 0 {
2020-08-22 12:28:03 +03:00
if code.op == opStructFieldPtrHeadUint32 {
e.encodeNull()
} else {
e.encodeBytes([]byte{'{', '}'})
}
2020-08-31 15:59:22 +03:00
code = code.end
2020-04-30 05:56:56 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeUint32(e.ptrToUint32(ptr + code.offset))
code = code.next
2020-08-15 11:41:38 +03:00
}
case opStructFieldPtrAnonymousHeadUint32:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-08-15 11:41:38 +03:00
fallthrough
case opStructFieldAnonymousHeadUint32:
ptr := load(ctxptr, code.idx)
2020-08-15 11:41:38 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end
2020-08-15 11:41:38 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeUint32(e.ptrToUint32(ptr + code.offset))
code = code.next
2020-04-30 05:56:56 +03:00
}
case opStructFieldPtrHeadUint64:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-04-30 05:56:56 +03:00
fallthrough
case opStructFieldHeadUint64:
ptr := load(ctxptr, code.idx)
2020-04-30 05:56:56 +03:00
if ptr == 0 {
2020-08-22 12:28:03 +03:00
if code.op == opStructFieldPtrHeadUint64 {
e.encodeNull()
} else {
e.encodeBytes([]byte{'{', '}'})
}
2020-08-31 15:59:22 +03:00
code = code.end
2020-04-30 05:56:56 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeUint64(e.ptrToUint64(ptr + code.offset))
code = code.next
2020-08-15 11:41:38 +03:00
}
case opStructFieldPtrAnonymousHeadUint64:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-08-15 11:41:38 +03:00
fallthrough
case opStructFieldAnonymousHeadUint64:
ptr := load(ctxptr, code.idx)
2020-08-15 11:41:38 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end
2020-08-15 11:41:38 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeUint64(e.ptrToUint64(ptr + code.offset))
code = code.next
2020-04-30 05:56:56 +03:00
}
case opStructFieldPtrHeadFloat32:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-04-30 05:56:56 +03:00
fallthrough
case opStructFieldHeadFloat32:
ptr := load(ctxptr, code.idx)
2020-04-30 05:56:56 +03:00
if ptr == 0 {
2020-08-22 12:28:03 +03:00
if code.op == opStructFieldPtrHeadFloat32 {
e.encodeNull()
} else {
e.encodeBytes([]byte{'{', '}'})
}
2020-08-31 15:59:22 +03:00
code = code.end
2020-04-30 05:56:56 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeFloat32(e.ptrToFloat32(ptr + code.offset))
code = code.next
2020-08-15 11:41:38 +03:00
}
case opStructFieldPtrAnonymousHeadFloat32:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-08-15 11:41:38 +03:00
fallthrough
case opStructFieldAnonymousHeadFloat32:
ptr := load(ctxptr, code.idx)
2020-08-15 11:41:38 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end
2020-08-15 11:41:38 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeFloat32(e.ptrToFloat32(ptr + code.offset))
code = code.next
2020-04-30 05:56:56 +03:00
}
case opStructFieldPtrHeadFloat64:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-04-30 05:56:56 +03:00
fallthrough
case opStructFieldHeadFloat64:
ptr := load(ctxptr, code.idx)
2020-04-30 05:56:56 +03:00
if ptr == 0 {
2020-08-22 12:28:03 +03:00
if code.op == opStructFieldPtrHeadFloat64 {
e.encodeNull()
} else {
e.encodeBytes([]byte{'{', '}'})
}
2020-08-31 15:59:22 +03:00
code = code.end
2020-04-30 05:56:56 +03:00
} else {
2020-08-31 15:59:22 +03:00
v := e.ptrToFloat64(ptr + code.offset)
if math.IsInf(v, 0) || math.IsNaN(v) {
return &UnsupportedValueError{
Value: reflect.ValueOf(v),
Str: strconv.FormatFloat(v, 'g', -1, 64),
}
}
2020-04-30 05:56:56 +03:00
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeFloat64(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-15 11:41:38 +03:00
}
case opStructFieldPtrAnonymousHeadFloat64:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-08-15 11:41:38 +03:00
fallthrough
case opStructFieldAnonymousHeadFloat64:
ptr := load(ctxptr, code.idx)
2020-08-15 11:41:38 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end
2020-08-15 11:41:38 +03:00
} else {
2020-08-31 15:59:22 +03:00
v := e.ptrToFloat64(ptr + code.offset)
2020-08-15 11:41:38 +03:00
if math.IsInf(v, 0) || math.IsNaN(v) {
return &UnsupportedValueError{
Value: reflect.ValueOf(v),
Str: strconv.FormatFloat(v, 'g', -1, 64),
}
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-15 11:41:38 +03:00
e.encodeFloat64(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-04-30 05:56:56 +03:00
}
2020-04-29 19:44:48 +03:00
case opStructFieldPtrHeadString:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-04-29 19:44:48 +03:00
fallthrough
case opStructFieldHeadString:
ptr := load(ctxptr, code.idx)
2020-04-29 19:44:48 +03:00
if ptr == 0 {
2020-08-22 12:28:03 +03:00
if code.op == opStructFieldPtrHeadString {
e.encodeNull()
} else {
e.encodeBytes([]byte{'{', '}'})
}
2020-08-31 15:59:22 +03:00
code = code.end
2020-04-29 19:44:48 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(e.ptrToString(ptr + code.offset))
code = code.next
2020-08-15 11:41:38 +03:00
}
case opStructFieldPtrAnonymousHeadString:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-08-15 11:41:38 +03:00
fallthrough
case opStructFieldAnonymousHeadString:
ptr := load(ctxptr, code.idx)
2020-08-15 11:41:38 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end
2020-08-15 11:41:38 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(e.ptrToString(ptr + code.offset))
code = code.next
2020-04-29 18:31:50 +03:00
}
2020-04-30 05:56:56 +03:00
case opStructFieldPtrHeadBool:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-04-30 05:56:56 +03:00
fallthrough
case opStructFieldHeadBool:
ptr := load(ctxptr, code.idx)
2020-04-30 05:56:56 +03:00
if ptr == 0 {
2020-08-22 12:28:03 +03:00
if code.op == opStructFieldPtrHeadBool {
e.encodeNull()
} else {
e.encodeBytes([]byte{'{', '}'})
}
2020-08-31 15:59:22 +03:00
code = code.end
2020-04-30 05:56:56 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeBool(e.ptrToBool(ptr + code.offset))
code = code.next
2020-08-15 11:41:38 +03:00
}
case opStructFieldPtrAnonymousHeadBool:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-08-15 11:41:38 +03:00
fallthrough
case opStructFieldAnonymousHeadBool:
ptr := load(ctxptr, code.idx)
2020-08-15 11:41:38 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end
2020-08-15 11:41:38 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeBool(e.ptrToBool(ptr + code.offset))
code = code.next
2020-04-30 05:56:56 +03:00
}
2020-08-19 04:34:11 +03:00
case opStructFieldPtrHeadBytes:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-08-19 04:34:11 +03:00
fallthrough
case opStructFieldHeadBytes:
ptr := load(ctxptr, code.idx)
2020-08-19 04:34:11 +03:00
if ptr == 0 {
2020-08-22 12:28:03 +03:00
if code.op == opStructFieldPtrHeadBytes {
e.encodeNull()
} else {
e.encodeBytes([]byte{'{', '}'})
}
2020-08-31 15:59:22 +03:00
code = code.end
2020-08-19 04:34:11 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
s := base64.StdEncoding.EncodeToString(e.ptrToBytes(ptr + code.offset))
2020-08-19 04:34:11 +03:00
e.encodeByte('"')
e.encodeBytes(*(*[]byte)(unsafe.Pointer(&s)))
e.encodeByte('"')
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-19 04:34:11 +03:00
}
case opStructFieldPtrAnonymousHeadBytes:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-08-19 04:34:11 +03:00
fallthrough
case opStructFieldAnonymousHeadBytes:
ptr := load(ctxptr, code.idx)
2020-08-19 04:34:11 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end
2020-08-19 04:34:11 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
s := base64.StdEncoding.EncodeToString(e.ptrToBytes(ptr + code.offset))
2020-08-19 04:34:11 +03:00
e.encodeByte('"')
e.encodeBytes(*(*[]byte)(unsafe.Pointer(&s)))
e.encodeByte('"')
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-19 04:34:11 +03:00
}
case opStructFieldPtrHeadArray:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
fallthrough
case opStructFieldHeadArray:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.idx) + code.offset
if ptr == 0 {
if code.op == opStructFieldPtrHeadArray {
e.encodeNull()
} else {
e.encodeBytes([]byte{'[', ']'})
}
2020-08-31 15:59:22 +03:00
code = code.end
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
if !code.anonymousKey {
e.encodeBytes(code.key)
}
2020-08-31 15:59:22 +03:00
code = code.next
store(ctxptr, code.idx, ptr)
}
case opStructFieldPtrAnonymousHeadArray:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
fallthrough
case opStructFieldAnonymousHeadArray:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.idx) + code.offset
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
store(ctxptr, code.idx, ptr)
2020-08-31 15:59:22 +03:00
code = code.next
}
case opStructFieldPtrHeadSlice:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
fallthrough
case opStructFieldHeadSlice:
ptr := load(ctxptr, code.idx)
2020-08-31 15:59:22 +03:00
p := ptr + code.offset
if p == 0 {
if code.op == opStructFieldPtrHeadSlice {
e.encodeNull()
} else {
e.encodeBytes([]byte{'[', ']'})
}
2020-08-31 15:59:22 +03:00
code = code.end
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
if !code.anonymousKey {
e.encodeBytes(code.key)
}
2020-08-31 15:59:22 +03:00
code = code.next
store(ctxptr, code.idx, p)
}
case opStructFieldPtrAnonymousHeadSlice:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
fallthrough
case opStructFieldAnonymousHeadSlice:
ptr := load(ctxptr, code.idx)
2020-08-31 15:59:22 +03:00
p := ptr + code.offset
if p == 0 {
2020-08-31 15:59:22 +03:00
code = code.end
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
store(ctxptr, code.idx, p)
2020-08-31 15:59:22 +03:00
code = code.next
}
case opStructFieldPtrHeadMarshalJSON:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
fallthrough
case opStructFieldHeadMarshalJSON:
ptr := load(ctxptr, code.idx)
if ptr == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{
typ: code.typ,
2020-08-31 15:59:22 +03:00
ptr: unsafe.Pointer(ptr + code.offset),
}))
2020-08-21 05:51:33 +03:00
rv := reflect.ValueOf(v)
if rv.Type().Kind() == reflect.Interface && rv.IsNil() {
2020-08-21 05:07:55 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end
2020-08-21 05:07:55 +03:00
break
}
2020-08-21 05:51:33 +03:00
b, err := rv.Interface().(Marshaler).MarshalJSON()
if err != nil {
return &MarshalerError{
Type: rtype2type(code.typ),
Err: err,
}
}
if len(b) == 0 {
return errUnexpectedEndOfJSON(
fmt.Sprintf("error calling MarshalJSON for type %s", code.typ),
0,
)
}
var buf bytes.Buffer
if err := compact(&buf, b, true); err != nil {
return err
}
e.encodeBytes(buf.Bytes())
2020-08-31 15:59:22 +03:00
code = code.next
}
case opStructFieldPtrAnonymousHeadMarshalJSON:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
fallthrough
case opStructFieldAnonymousHeadMarshalJSON:
ptr := load(ctxptr, code.idx)
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{
typ: code.typ,
2020-08-31 15:59:22 +03:00
ptr: unsafe.Pointer(ptr + code.offset),
}))
2020-08-21 05:51:33 +03:00
rv := reflect.ValueOf(v)
if rv.Type().Kind() == reflect.Interface && rv.IsNil() {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end
2020-08-21 05:51:33 +03:00
break
}
b, err := rv.Interface().(Marshaler).MarshalJSON()
if err != nil {
return &MarshalerError{
Type: rtype2type(code.typ),
Err: err,
}
}
if len(b) == 0 {
return errUnexpectedEndOfJSON(
fmt.Sprintf("error calling MarshalJSON for type %s", code.typ),
0,
)
}
var buf bytes.Buffer
if err := compact(&buf, b, true); err != nil {
return err
}
e.encodeBytes(buf.Bytes())
2020-08-31 15:59:22 +03:00
code = code.next
}
case opStructFieldPtrHeadMarshalText:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
fallthrough
case opStructFieldHeadMarshalText:
ptr := load(ctxptr, code.idx)
if ptr == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{
typ: code.typ,
2020-08-31 15:59:22 +03:00
ptr: unsafe.Pointer(ptr + code.offset),
}))
2020-08-21 05:51:33 +03:00
rv := reflect.ValueOf(v)
if rv.Type().Kind() == reflect.Interface && rv.IsNil() {
2020-08-21 05:07:55 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end
2020-08-21 05:07:55 +03:00
break
}
2020-08-21 05:51:33 +03:00
bytes, err := rv.Interface().(encoding.TextMarshaler).MarshalText()
if err != nil {
return &MarshalerError{
Type: rtype2type(code.typ),
Err: err,
}
}
e.encodeString(*(*string)(unsafe.Pointer(&bytes)))
2020-08-31 15:59:22 +03:00
code = code.next
}
case opStructFieldPtrAnonymousHeadMarshalText:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
fallthrough
case opStructFieldAnonymousHeadMarshalText:
ptr := load(ctxptr, code.idx)
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{
typ: code.typ,
2020-08-31 15:59:22 +03:00
ptr: unsafe.Pointer(ptr + code.offset),
}))
2020-08-21 05:51:33 +03:00
rv := reflect.ValueOf(v)
if rv.Type().Kind() == reflect.Interface && rv.IsNil() {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end
2020-08-21 05:51:33 +03:00
break
}
bytes, err := rv.Interface().(encoding.TextMarshaler).MarshalText()
if err != nil {
return &MarshalerError{
Type: rtype2type(code.typ),
Err: err,
}
}
e.encodeString(*(*string)(unsafe.Pointer(&bytes)))
2020-08-31 15:59:22 +03:00
code = code.next
}
2020-05-02 17:35:41 +03:00
case opStructFieldPtrHeadIndent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-01 07:12:01 +03:00
}
fallthrough
2020-05-02 17:35:41 +03:00
case opStructFieldHeadIndent:
ptr := load(ctxptr, code.idx)
2020-05-01 07:12:01 +03:00
if ptr == 0 {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
} else if code.next == code.end {
2020-08-22 18:54:43 +03:00
// not exists fields
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '}'})
2020-08-31 15:59:22 +03:00
code = code.next
store(ctxptr, code.idx, ptr)
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
code = code.next
store(ctxptr, code.idx, ptr)
2020-05-01 07:12:01 +03:00
}
2020-05-02 17:35:41 +03:00
case opStructFieldPtrHeadIntIndent:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-05-02 17:35:41 +03:00
fallthrough
case opStructFieldHeadIntIndent:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
2020-08-27 15:01:53 +03:00
if code.op == opStructFieldPtrHeadIntIndent {
e.encodeIndent(code.indent)
e.encodeNull()
} else {
e.encodeBytes([]byte{'{', '}'})
}
2020-08-31 15:59:22 +03:00
code = code.end
2020-05-02 17:35:41 +03:00
} else {
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeInt(e.ptrToInt(ptr + code.offset))
code = code.next
2020-05-01 07:12:01 +03:00
}
2020-05-02 17:35:41 +03:00
case opStructFieldPtrHeadInt8Indent:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-05-01 07:12:01 +03:00
fallthrough
2020-05-02 17:35:41 +03:00
case opStructFieldHeadInt8Indent:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end
2020-05-02 17:35:41 +03:00
} else {
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-08-15 12:36:02 +03:00
e.encodeInt8(e.ptrToInt8(ptr))
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
case opStructFieldPtrHeadInt16Indent:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-05-02 17:35:41 +03:00
fallthrough
case opStructFieldHeadInt16Indent:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end
2020-05-02 17:35:41 +03:00
} else {
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-08-15 12:36:02 +03:00
e.encodeInt16(e.ptrToInt16(ptr))
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
case opStructFieldPtrHeadInt32Indent:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-05-02 17:35:41 +03:00
fallthrough
case opStructFieldHeadInt32Indent:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end
2020-05-02 17:35:41 +03:00
} else {
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-08-15 12:36:02 +03:00
e.encodeInt32(e.ptrToInt32(ptr))
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
case opStructFieldPtrHeadInt64Indent:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-05-02 17:35:41 +03:00
fallthrough
case opStructFieldHeadInt64Indent:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end
2020-05-02 17:35:41 +03:00
} else {
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-08-15 12:36:02 +03:00
e.encodeInt64(e.ptrToInt64(ptr))
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
case opStructFieldPtrHeadUintIndent:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-05-02 17:35:41 +03:00
fallthrough
case opStructFieldHeadUintIndent:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end
2020-05-02 17:35:41 +03:00
} else {
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-08-15 12:36:02 +03:00
e.encodeUint(e.ptrToUint(ptr))
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
case opStructFieldPtrHeadUint8Indent:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-05-02 17:35:41 +03:00
fallthrough
case opStructFieldHeadUint8Indent:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end
2020-05-02 17:35:41 +03:00
} else {
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-08-15 12:36:02 +03:00
e.encodeUint8(e.ptrToUint8(ptr))
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
case opStructFieldPtrHeadUint16Indent:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-05-02 17:35:41 +03:00
fallthrough
case opStructFieldHeadUint16Indent:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end
2020-05-02 17:35:41 +03:00
} else {
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-08-15 12:36:02 +03:00
e.encodeUint16(e.ptrToUint16(ptr))
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
case opStructFieldPtrHeadUint32Indent:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-05-02 17:35:41 +03:00
fallthrough
case opStructFieldHeadUint32Indent:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end
2020-05-02 17:35:41 +03:00
} else {
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-08-15 12:36:02 +03:00
e.encodeUint32(e.ptrToUint32(ptr))
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
case opStructFieldPtrHeadUint64Indent:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-05-02 17:35:41 +03:00
fallthrough
case opStructFieldHeadUint64Indent:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end
2020-05-02 17:35:41 +03:00
} else {
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-08-15 12:36:02 +03:00
e.encodeUint64(e.ptrToUint64(ptr))
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
case opStructFieldPtrHeadFloat32Indent:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-05-02 17:35:41 +03:00
fallthrough
case opStructFieldHeadFloat32Indent:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end
2020-05-02 17:35:41 +03:00
} else {
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-08-15 12:36:02 +03:00
e.encodeFloat32(e.ptrToFloat32(ptr))
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
case opStructFieldPtrHeadFloat64Indent:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-05-02 17:35:41 +03:00
fallthrough
case opStructFieldHeadFloat64Indent:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end
2020-05-02 17:35:41 +03:00
} else {
2020-08-15 12:36:02 +03:00
v := e.ptrToFloat64(ptr)
if math.IsInf(v, 0) || math.IsNaN(v) {
return &UnsupportedValueError{
Value: reflect.ValueOf(v),
Str: strconv.FormatFloat(v, 'g', -1, 64),
}
}
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
e.encodeFloat64(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
case opStructFieldPtrHeadStringIndent:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-05-02 17:35:41 +03:00
fallthrough
case opStructFieldHeadStringIndent:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end
2020-05-02 17:35:41 +03:00
} else {
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-08-15 12:36:02 +03:00
e.encodeString(e.ptrToString(ptr))
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
case opStructFieldPtrHeadBoolIndent:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-05-02 17:35:41 +03:00
fallthrough
case opStructFieldHeadBoolIndent:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end
2020-05-02 17:35:41 +03:00
} else {
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-08-15 12:36:02 +03:00
e.encodeBool(e.ptrToBool(ptr))
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
2020-08-19 04:34:11 +03:00
case opStructFieldPtrHeadBytesIndent:
store(ctxptr, code.idx, e.ptrToPtr(load(ctxptr, code.idx)))
2020-08-19 04:34:11 +03:00
fallthrough
case opStructFieldHeadBytesIndent:
ptr := load(ctxptr, code.idx)
2020-08-19 04:34:11 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end
2020-08-19 04:34:11 +03:00
} else {
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 04:34:11 +03:00
e.encodeByte(' ')
s := base64.StdEncoding.EncodeToString(e.ptrToBytes(ptr))
e.encodeByte('"')
e.encodeBytes(*(*[]byte)(unsafe.Pointer(&s)))
e.encodeByte('"')
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-19 04:34:11 +03:00
}
2020-05-02 17:35:41 +03:00
case opStructFieldPtrHeadOmitEmpty:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
fallthrough
case opStructFieldHeadOmitEmpty:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
p := ptr + code.offset
2020-05-02 17:35:41 +03:00
if p == 0 || *(*uintptr)(unsafe.Pointer(p)) == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-02 17:35:41 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
code = code.next
store(ctxptr, code.idx, p)
2020-05-02 17:35:41 +03:00
}
}
2020-08-15 12:17:48 +03:00
case opStructFieldPtrAnonymousHeadOmitEmpty:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
2020-08-15 12:17:48 +03:00
fallthrough
case opStructFieldAnonymousHeadOmitEmpty:
ptr := load(ctxptr, code.idx)
2020-08-15 12:17:48 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
p := ptr + code.offset
2020-08-15 12:17:48 +03:00
if p == 0 || *(*uintptr)(unsafe.Pointer(p)) == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
code = code.next
store(ctxptr, code.idx, p)
2020-08-15 12:17:48 +03:00
}
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyInt:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyInt:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
v := e.ptrToInt(ptr + code.offset)
2020-05-02 17:35:41 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-02 17:35:41 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeInt(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
}
2020-08-15 12:17:48 +03:00
case opStructFieldPtrAnonymousHeadOmitEmptyInt:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-15 12:17:48 +03:00
}
fallthrough
case opStructFieldAnonymousHeadOmitEmptyInt:
ptr := load(ctxptr, code.idx)
2020-08-15 12:17:48 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
v := e.ptrToInt(ptr + code.offset)
2020-08-15 12:17:48 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-15 12:17:48 +03:00
e.encodeInt(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-15 12:17:48 +03:00
}
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyInt8:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyInt8:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
v := e.ptrToInt8(ptr + code.offset)
2020-05-02 17:35:41 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-02 17:35:41 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeInt8(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
}
2020-08-15 12:17:48 +03:00
case opStructFieldPtrAnonymousHeadOmitEmptyInt8:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
fallthrough
2020-08-15 12:17:48 +03:00
case opStructFieldAnonymousHeadOmitEmptyInt8:
ptr := load(ctxptr, code.idx)
2020-08-15 12:17:48 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
v := e.ptrToInt8(ptr + code.offset)
2020-08-15 12:17:48 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-15 12:17:48 +03:00
e.encodeInt8(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-15 12:17:48 +03:00
}
2020-05-02 17:35:41 +03:00
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyInt16:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyInt16:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
v := e.ptrToInt16(ptr + code.offset)
2020-05-02 17:35:41 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-02 17:35:41 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeInt16(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
}
2020-08-15 12:17:48 +03:00
case opStructFieldPtrAnonymousHeadOmitEmptyInt16:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-15 12:17:48 +03:00
}
fallthrough
case opStructFieldAnonymousHeadOmitEmptyInt16:
ptr := load(ctxptr, code.idx)
2020-08-15 12:17:48 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
v := e.ptrToInt16(ptr + code.offset)
2020-08-15 12:17:48 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-15 12:17:48 +03:00
e.encodeInt16(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-15 12:17:48 +03:00
}
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyInt32:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyInt32:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
v := e.ptrToInt32(ptr + code.offset)
2020-05-02 17:35:41 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-02 17:35:41 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeInt32(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
}
2020-08-15 12:17:48 +03:00
case opStructFieldPtrAnonymousHeadOmitEmptyInt32:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
fallthrough
2020-08-15 12:17:48 +03:00
case opStructFieldAnonymousHeadOmitEmptyInt32:
ptr := load(ctxptr, code.idx)
2020-08-15 12:17:48 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
v := e.ptrToInt32(ptr + code.offset)
2020-08-15 12:17:48 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-15 12:17:48 +03:00
e.encodeInt32(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-15 12:17:48 +03:00
}
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyInt64:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyInt64:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
v := e.ptrToInt64(ptr + code.offset)
2020-05-02 17:35:41 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-02 17:35:41 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeInt64(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
}
2020-08-15 12:17:48 +03:00
case opStructFieldPtrAnonymousHeadOmitEmptyInt64:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
fallthrough
2020-08-15 12:17:48 +03:00
case opStructFieldAnonymousHeadOmitEmptyInt64:
ptr := load(ctxptr, code.idx)
2020-08-15 12:17:48 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
v := e.ptrToInt64(ptr + code.offset)
2020-08-15 12:17:48 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-15 12:17:48 +03:00
e.encodeInt64(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-15 12:17:48 +03:00
}
2020-05-02 17:35:41 +03:00
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyUint:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyUint:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
v := e.ptrToUint(ptr + code.offset)
2020-05-02 17:35:41 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-02 17:35:41 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeUint(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
}
2020-08-15 12:17:48 +03:00
case opStructFieldPtrAnonymousHeadOmitEmptyUint:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
fallthrough
2020-08-15 12:17:48 +03:00
case opStructFieldAnonymousHeadOmitEmptyUint:
ptr := load(ctxptr, code.idx)
2020-08-15 12:17:48 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
v := e.ptrToUint(ptr + code.offset)
2020-08-15 12:17:48 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-15 12:17:48 +03:00
e.encodeUint(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-15 12:17:48 +03:00
}
2020-05-02 17:35:41 +03:00
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyUint8:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyUint8:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
v := e.ptrToUint8(ptr + code.offset)
2020-05-02 17:35:41 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-02 17:35:41 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeUint8(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
2020-08-15 12:17:48 +03:00
}
case opStructFieldPtrAnonymousHeadOmitEmptyUint8:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-15 12:17:48 +03:00
}
fallthrough
case opStructFieldAnonymousHeadOmitEmptyUint8:
ptr := load(ctxptr, code.idx)
2020-08-15 12:17:48 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
v := e.ptrToUint8(ptr + code.offset)
2020-08-15 12:17:48 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-15 12:17:48 +03:00
e.encodeUint8(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-15 12:17:48 +03:00
}
2020-05-02 17:35:41 +03:00
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyUint16:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyUint16:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
v := e.ptrToUint16(ptr + code.offset)
2020-05-02 17:35:41 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-02 17:35:41 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeUint16(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
}
2020-08-15 12:17:48 +03:00
case opStructFieldPtrAnonymousHeadOmitEmptyUint16:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
fallthrough
2020-08-15 12:17:48 +03:00
case opStructFieldAnonymousHeadOmitEmptyUint16:
ptr := load(ctxptr, code.idx)
2020-08-15 12:17:48 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
v := e.ptrToUint16(ptr + code.offset)
2020-08-15 12:17:48 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-15 12:17:48 +03:00
e.encodeUint16(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-15 12:17:48 +03:00
}
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyUint32:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyUint32:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
v := e.ptrToUint32(ptr + code.offset)
2020-05-02 17:35:41 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-02 17:35:41 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeUint32(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
}
2020-08-15 12:17:48 +03:00
case opStructFieldPtrAnonymousHeadOmitEmptyUint32:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
fallthrough
2020-08-15 12:17:48 +03:00
case opStructFieldAnonymousHeadOmitEmptyUint32:
ptr := load(ctxptr, code.idx)
2020-08-15 12:17:48 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
v := e.ptrToUint32(ptr + code.offset)
2020-08-15 12:17:48 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-15 12:17:48 +03:00
e.encodeUint32(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-15 12:17:48 +03:00
}
2020-05-02 17:35:41 +03:00
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyUint64:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyUint64:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
v := e.ptrToUint64(ptr + code.offset)
2020-05-02 17:35:41 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-02 17:35:41 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeUint64(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
}
2020-08-15 12:17:48 +03:00
case opStructFieldPtrAnonymousHeadOmitEmptyUint64:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-15 12:17:48 +03:00
}
fallthrough
case opStructFieldAnonymousHeadOmitEmptyUint64:
ptr := load(ctxptr, code.idx)
2020-08-15 12:17:48 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
v := e.ptrToUint64(ptr + code.offset)
2020-08-15 12:17:48 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-15 12:17:48 +03:00
e.encodeUint64(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-15 12:17:48 +03:00
}
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyFloat32:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyFloat32:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
v := e.ptrToFloat32(ptr + code.offset)
2020-05-02 17:35:41 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-02 17:35:41 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeFloat32(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
}
2020-08-15 12:17:48 +03:00
case opStructFieldPtrAnonymousHeadOmitEmptyFloat32:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
fallthrough
2020-08-15 12:17:48 +03:00
case opStructFieldAnonymousHeadOmitEmptyFloat32:
ptr := load(ctxptr, code.idx)
2020-08-15 12:17:48 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
v := e.ptrToFloat32(ptr + code.offset)
2020-08-15 12:17:48 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-15 12:17:48 +03:00
e.encodeFloat32(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-15 12:17:48 +03:00
}
2020-05-02 17:35:41 +03:00
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyFloat64:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyFloat64:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
v := e.ptrToFloat64(ptr + code.offset)
2020-05-02 17:35:41 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-02 17:35:41 +03:00
} else {
if math.IsInf(v, 0) || math.IsNaN(v) {
return &UnsupportedValueError{
Value: reflect.ValueOf(v),
Str: strconv.FormatFloat(v, 'g', -1, 64),
}
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeFloat64(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
}
2020-08-15 12:17:48 +03:00
case opStructFieldPtrAnonymousHeadOmitEmptyFloat64:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-15 12:17:48 +03:00
}
fallthrough
case opStructFieldAnonymousHeadOmitEmptyFloat64:
ptr := load(ctxptr, code.idx)
2020-08-15 12:17:48 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
v := e.ptrToFloat64(ptr + code.offset)
2020-08-15 12:17:48 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-08-15 12:17:48 +03:00
} else {
if math.IsInf(v, 0) || math.IsNaN(v) {
return &UnsupportedValueError{
Value: reflect.ValueOf(v),
Str: strconv.FormatFloat(v, 'g', -1, 64),
}
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-15 12:17:48 +03:00
e.encodeFloat64(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-15 12:17:48 +03:00
}
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyString:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyString:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
v := e.ptrToString(ptr + code.offset)
2020-05-02 17:35:41 +03:00
if v == "" {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-02 17:35:41 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-03 11:41:33 +03:00
e.encodeString(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
2020-08-15 12:17:48 +03:00
}
case opStructFieldPtrAnonymousHeadOmitEmptyString:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-15 12:17:48 +03:00
}
fallthrough
case opStructFieldAnonymousHeadOmitEmptyString:
ptr := load(ctxptr, code.idx)
2020-08-15 12:17:48 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
v := e.ptrToString(ptr + code.offset)
2020-08-15 12:17:48 +03:00
if v == "" {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-15 12:17:48 +03:00
e.encodeString(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-15 12:17:48 +03:00
}
2020-05-02 17:35:41 +03:00
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyBool:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyBool:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
v := e.ptrToBool(ptr + code.offset)
2020-05-02 17:35:41 +03:00
if !v {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-02 17:35:41 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeBool(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-02 17:35:41 +03:00
}
2020-08-15 12:17:48 +03:00
}
case opStructFieldPtrAnonymousHeadOmitEmptyBool:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-15 12:17:48 +03:00
}
fallthrough
case opStructFieldAnonymousHeadOmitEmptyBool:
ptr := load(ctxptr, code.idx)
2020-08-15 12:17:48 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
v := e.ptrToBool(ptr + code.offset)
2020-08-15 12:17:48 +03:00
if !v {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-08-15 12:17:48 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-15 12:17:48 +03:00
e.encodeBool(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-15 12:17:48 +03:00
}
2020-05-02 17:35:41 +03:00
}
2020-08-19 04:34:11 +03:00
case opStructFieldPtrHeadOmitEmptyBytes:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 04:34:11 +03:00
}
fallthrough
case opStructFieldHeadOmitEmptyBytes:
ptr := load(ctxptr, code.idx)
2020-08-19 04:34:11 +03:00
if ptr == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 04:34:11 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
v := e.ptrToBytes(ptr + code.offset)
2020-08-19 04:34:11 +03:00
if len(v) == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-08-19 04:34:11 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 04:34:11 +03:00
s := base64.StdEncoding.EncodeToString(v)
e.encodeByte('"')
e.encodeBytes(*(*[]byte)(unsafe.Pointer(&s)))
e.encodeByte('"')
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-19 04:34:11 +03:00
}
}
case opStructFieldPtrAnonymousHeadOmitEmptyBytes:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 04:34:11 +03:00
}
fallthrough
case opStructFieldAnonymousHeadOmitEmptyBytes:
ptr := load(ctxptr, code.idx)
2020-08-19 04:34:11 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 04:34:11 +03:00
} else {
2020-08-31 15:59:22 +03:00
v := e.ptrToBytes(ptr + code.offset)
2020-08-19 04:34:11 +03:00
if len(v) == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-08-19 04:34:11 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 04:34:11 +03:00
s := base64.StdEncoding.EncodeToString(v)
e.encodeByte('"')
e.encodeBytes(*(*[]byte)(unsafe.Pointer(&s)))
e.encodeByte('"')
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-19 04:34:11 +03:00
}
}
case opStructFieldPtrHeadOmitEmptyMarshalJSON:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
}
fallthrough
case opStructFieldHeadOmitEmptyMarshalJSON:
ptr := load(ctxptr, code.idx)
if ptr == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
p := unsafe.Pointer(ptr + code.offset)
isPtr := code.typ.Kind() == reflect.Ptr
if p == nil || (!isPtr && *(*unsafe.Pointer)(p) == nil) {
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{typ: code.typ, ptr: p}))
b, err := v.(Marshaler).MarshalJSON()
if err != nil {
return &MarshalerError{
Type: rtype2type(code.typ),
Err: err,
}
}
if len(b) == 0 {
if isPtr {
return errUnexpectedEndOfJSON(
fmt.Sprintf("error calling MarshalJSON for type %s", code.typ),
0,
)
}
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
var buf bytes.Buffer
if err := compact(&buf, b, true); err != nil {
return err
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeBytes(buf.Bytes())
2020-08-31 15:59:22 +03:00
code = code.next
}
}
}
case opStructFieldPtrAnonymousHeadOmitEmptyMarshalJSON:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
}
fallthrough
case opStructFieldAnonymousHeadOmitEmptyMarshalJSON:
ptr := load(ctxptr, code.idx)
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
} else {
2020-08-31 15:59:22 +03:00
p := unsafe.Pointer(ptr + code.offset)
isPtr := code.typ.Kind() == reflect.Ptr
if p == nil || (!isPtr && *(*unsafe.Pointer)(p) == nil) {
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{typ: code.typ, ptr: p}))
b, err := v.(Marshaler).MarshalJSON()
if err != nil {
return &MarshalerError{
Type: rtype2type(code.typ),
Err: err,
}
}
if len(b) == 0 {
if isPtr {
return errUnexpectedEndOfJSON(
fmt.Sprintf("error calling MarshalJSON for type %s", code.typ),
0,
)
}
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
var buf bytes.Buffer
if err := compact(&buf, b, true); err != nil {
return err
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeBytes(buf.Bytes())
2020-08-31 15:59:22 +03:00
code = code.next
}
}
}
case opStructFieldPtrHeadOmitEmptyMarshalText:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
}
fallthrough
case opStructFieldHeadOmitEmptyMarshalText:
ptr := load(ctxptr, code.idx)
if ptr == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
p := unsafe.Pointer(ptr + code.offset)
isPtr := code.typ.Kind() == reflect.Ptr
if p == nil || (!isPtr && *(*unsafe.Pointer)(p) == nil) {
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{typ: code.typ, ptr: p}))
bytes, err := v.(encoding.TextMarshaler).MarshalText()
if err != nil {
return &MarshalerError{
Type: rtype2type(code.typ),
Err: err,
}
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(*(*string)(unsafe.Pointer(&bytes)))
2020-08-31 15:59:22 +03:00
code = code.next
}
}
case opStructFieldPtrAnonymousHeadOmitEmptyMarshalText:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
}
fallthrough
case opStructFieldAnonymousHeadOmitEmptyMarshalText:
ptr := load(ctxptr, code.idx)
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
} else {
2020-08-31 15:59:22 +03:00
p := unsafe.Pointer(ptr + code.offset)
isPtr := code.typ.Kind() == reflect.Ptr
if p == nil || (!isPtr && *(*unsafe.Pointer)(p) == nil) {
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{typ: code.typ, ptr: p}))
bytes, err := v.(encoding.TextMarshaler).MarshalText()
if err != nil {
return &MarshalerError{
Type: rtype2type(code.typ),
Err: err,
}
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(*(*string)(unsafe.Pointer(&bytes)))
2020-08-31 15:59:22 +03:00
code = code.next
}
}
2020-05-02 17:35:41 +03:00
case opStructFieldPtrHeadOmitEmptyIndent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
fallthrough
case opStructFieldHeadOmitEmptyIndent:
ptr := load(ctxptr, code.idx)
2020-05-02 17:35:41 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-02 17:35:41 +03:00
} else {
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
2020-08-31 15:59:22 +03:00
p := ptr + code.offset
2020-05-02 17:35:41 +03:00
if p == 0 || *(*uintptr)(unsafe.Pointer(p)) == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-02 17:35:41 +03:00
} else {
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
code = code.next
store(ctxptr, code.idx, p)
2020-05-02 17:35:41 +03:00
}
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyIntIndent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-02 17:35:41 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyIntIndent:
ptr := load(ctxptr, code.idx)
2020-05-01 07:12:01 +03:00
if ptr == 0 {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
2020-08-31 15:59:22 +03:00
v := e.ptrToInt(ptr + code.offset)
2020-05-01 07:12:01 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-05-01 07:12:01 +03:00
e.encodeInt(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-01 07:12:01 +03:00
}
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyInt8Indent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-01 07:12:01 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyInt8Indent:
ptr := load(ctxptr, code.idx)
2020-05-01 07:12:01 +03:00
if ptr == 0 {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
2020-08-31 15:59:22 +03:00
v := e.ptrToInt8(ptr + code.offset)
2020-05-01 07:12:01 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-05-01 07:12:01 +03:00
e.encodeInt8(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-01 07:12:01 +03:00
}
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyInt16Indent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-01 07:12:01 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyInt16Indent:
ptr := load(ctxptr, code.idx)
2020-05-01 07:12:01 +03:00
if ptr == 0 {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
2020-08-31 15:59:22 +03:00
v := e.ptrToInt16(ptr + code.offset)
2020-05-01 07:12:01 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-05-01 07:12:01 +03:00
e.encodeInt16(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-01 07:12:01 +03:00
}
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyInt32Indent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-01 07:12:01 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyInt32Indent:
ptr := load(ctxptr, code.idx)
2020-05-01 07:12:01 +03:00
if ptr == 0 {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
2020-08-31 15:59:22 +03:00
v := e.ptrToInt32(ptr + code.offset)
2020-05-01 07:12:01 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-05-01 07:12:01 +03:00
e.encodeInt32(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-01 07:12:01 +03:00
}
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyInt64Indent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-01 07:12:01 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyInt64Indent:
ptr := load(ctxptr, code.idx)
2020-05-01 07:12:01 +03:00
if ptr == 0 {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
2020-08-31 15:59:22 +03:00
v := e.ptrToInt64(ptr + code.offset)
2020-05-01 07:12:01 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-05-01 07:12:01 +03:00
e.encodeInt64(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-01 07:12:01 +03:00
}
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyUintIndent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-01 07:12:01 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyUintIndent:
ptr := load(ctxptr, code.idx)
2020-05-01 07:12:01 +03:00
if ptr == 0 {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
2020-08-31 15:59:22 +03:00
v := e.ptrToUint(ptr + code.offset)
2020-05-01 07:12:01 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-05-01 07:12:01 +03:00
e.encodeUint(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-01 07:12:01 +03:00
}
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyUint8Indent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-01 07:12:01 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyUint8Indent:
ptr := load(ctxptr, code.idx)
2020-05-01 07:12:01 +03:00
if ptr == 0 {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
2020-08-31 15:59:22 +03:00
v := e.ptrToUint8(ptr + code.offset)
2020-05-01 07:12:01 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-05-01 07:12:01 +03:00
e.encodeUint8(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-01 07:12:01 +03:00
}
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyUint16Indent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-01 07:12:01 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyUint16Indent:
ptr := load(ctxptr, code.idx)
2020-05-01 07:12:01 +03:00
if ptr == 0 {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
2020-08-31 15:59:22 +03:00
v := e.ptrToUint16(ptr + code.offset)
2020-05-01 07:12:01 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-05-01 07:12:01 +03:00
e.encodeUint16(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-01 07:12:01 +03:00
}
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyUint32Indent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-01 07:12:01 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyUint32Indent:
ptr := load(ctxptr, code.idx)
2020-05-01 07:12:01 +03:00
if ptr == 0 {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
2020-08-31 15:59:22 +03:00
v := e.ptrToUint32(ptr + code.offset)
2020-05-01 07:12:01 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-05-01 07:12:01 +03:00
e.encodeUint32(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-01 07:12:01 +03:00
}
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyUint64Indent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-01 07:12:01 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyUint64Indent:
ptr := load(ctxptr, code.idx)
2020-05-01 07:12:01 +03:00
if ptr == 0 {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
2020-08-31 15:59:22 +03:00
v := e.ptrToUint64(ptr + code.offset)
2020-05-01 07:12:01 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-05-01 07:12:01 +03:00
e.encodeUint64(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-01 07:12:01 +03:00
}
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyFloat32Indent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-01 07:12:01 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyFloat32Indent:
ptr := load(ctxptr, code.idx)
2020-05-01 07:12:01 +03:00
if ptr == 0 {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
2020-08-31 15:59:22 +03:00
v := e.ptrToFloat32(ptr + code.offset)
2020-05-01 07:12:01 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-05-01 07:12:01 +03:00
e.encodeFloat32(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-01 07:12:01 +03:00
}
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyFloat64Indent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-01 07:12:01 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyFloat64Indent:
ptr := load(ctxptr, code.idx)
2020-05-01 07:12:01 +03:00
if ptr == 0 {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
2020-08-31 15:59:22 +03:00
v := e.ptrToFloat64(ptr + code.offset)
2020-05-01 07:12:01 +03:00
if v == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-01 07:12:01 +03:00
} else {
if math.IsInf(v, 0) || math.IsNaN(v) {
return &UnsupportedValueError{
Value: reflect.ValueOf(v),
Str: strconv.FormatFloat(v, 'g', -1, 64),
}
}
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-05-01 07:12:01 +03:00
e.encodeFloat64(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-01 07:12:01 +03:00
}
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyStringIndent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-01 07:12:01 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyStringIndent:
ptr := load(ctxptr, code.idx)
2020-05-01 07:12:01 +03:00
if ptr == 0 {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
2020-08-31 15:59:22 +03:00
v := e.ptrToString(ptr + code.offset)
2020-05-01 07:12:01 +03:00
if v == "" {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-05-03 11:41:33 +03:00
e.encodeString(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-01 07:12:01 +03:00
}
}
2020-08-15 11:41:38 +03:00
case opStructFieldPtrHeadOmitEmptyBoolIndent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-05-01 07:12:01 +03:00
}
fallthrough
2020-08-15 11:41:38 +03:00
case opStructFieldHeadOmitEmptyBoolIndent:
ptr := load(ctxptr, code.idx)
2020-05-01 07:12:01 +03:00
if ptr == 0 {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
2020-05-03 11:41:33 +03:00
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
2020-08-31 15:59:22 +03:00
v := e.ptrToBool(ptr + code.offset)
2020-05-01 07:12:01 +03:00
if !v {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-05-01 07:12:01 +03:00
} else {
2020-05-02 17:35:41 +03:00
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-05-02 17:35:41 +03:00
e.encodeByte(' ')
2020-05-01 07:12:01 +03:00
e.encodeBool(v)
2020-08-31 15:59:22 +03:00
code = code.next
2020-05-01 07:12:01 +03:00
}
}
2020-08-19 04:34:11 +03:00
case opStructFieldPtrHeadOmitEmptyBytesIndent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 04:34:11 +03:00
}
fallthrough
case opStructFieldHeadOmitEmptyBytesIndent:
ptr := load(ctxptr, code.idx)
2020-08-19 04:34:11 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 04:34:11 +03:00
} else {
e.encodeIndent(code.indent)
e.encodeBytes([]byte{'{', '\n'})
2020-08-31 15:59:22 +03:00
v := e.ptrToBytes(ptr + code.offset)
2020-08-19 04:34:11 +03:00
if len(v) == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-08-19 04:34:11 +03:00
} else {
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 04:34:11 +03:00
e.encodeByte(' ')
s := base64.StdEncoding.EncodeToString(v)
e.encodeByte('"')
e.encodeBytes(*(*[]byte)(unsafe.Pointer(&s)))
e.encodeByte('"')
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-19 04:34:11 +03:00
}
}
2020-08-19 13:56:02 +03:00
case opStructFieldPtrHeadStringTag:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTag:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
p := ptr + code.offset
e.encodeBytes(code.key)
code = code.next
store(ctxptr, code.idx, p)
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrAnonymousHeadStringTag:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldAnonymousHeadStringTag:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
code = code.next
store(ctxptr, code.idx, ptr+code.offset)
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagInt:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagInt:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToInt(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrAnonymousHeadStringTagInt:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldAnonymousHeadStringTagInt:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToInt(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagInt8:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagInt8:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToInt8(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrAnonymousHeadStringTagInt8:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldAnonymousHeadStringTagInt8:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToInt8(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagInt16:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagInt16:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToInt16(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrAnonymousHeadStringTagInt16:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldAnonymousHeadStringTagInt16:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToInt16(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagInt32:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagInt32:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToInt32(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrAnonymousHeadStringTagInt32:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldAnonymousHeadStringTagInt32:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToInt32(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagInt64:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagInt64:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToInt64(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrAnonymousHeadStringTagInt64:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldAnonymousHeadStringTagInt64:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToInt64(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagUint:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagUint:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToUint(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrAnonymousHeadStringTagUint:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldAnonymousHeadStringTagUint:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToUint(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagUint8:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagUint8:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToUint8(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrAnonymousHeadStringTagUint8:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldAnonymousHeadStringTagUint8:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToUint8(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagUint16:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagUint16:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToUint16(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrAnonymousHeadStringTagUint16:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldAnonymousHeadStringTagUint16:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToUint16(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagUint32:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagUint32:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToUint32(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrAnonymousHeadStringTagUint32:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldAnonymousHeadStringTagUint32:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToUint32(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagUint64:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagUint64:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToUint64(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrAnonymousHeadStringTagUint64:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldAnonymousHeadStringTagUint64:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToUint64(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagFloat32:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagFloat32:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToFloat32(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrAnonymousHeadStringTagFloat32:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldAnonymousHeadStringTagFloat32:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToFloat32(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagFloat64:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagFloat64:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
v := e.ptrToFloat64(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if math.IsInf(v, 0) || math.IsNaN(v) {
return &UnsupportedValueError{
Value: reflect.ValueOf(v),
Str: strconv.FormatFloat(v, 'g', -1, 64),
}
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeString(fmt.Sprint(v))
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrAnonymousHeadStringTagFloat64:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldAnonymousHeadStringTagFloat64:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
2020-08-31 15:59:22 +03:00
v := e.ptrToFloat64(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if math.IsInf(v, 0) || math.IsNaN(v) {
return &UnsupportedValueError{
Value: reflect.ValueOf(v),
Str: strconv.FormatFloat(v, 'g', -1, 64),
}
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeString(fmt.Sprint(v))
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagString:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagString:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(strconv.Quote(e.ptrToString(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrAnonymousHeadStringTagString:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldAnonymousHeadStringTagString:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(strconv.Quote(e.ptrToString(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagBool:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagBool:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToBool(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrAnonymousHeadStringTagBool:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldAnonymousHeadStringTagBool:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToBool(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagBytes:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagBytes:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
s := base64.StdEncoding.EncodeToString(
2020-08-31 15:59:22 +03:00
e.ptrToBytes(ptr + code.offset),
2020-08-19 13:56:02 +03:00
)
e.encodeByte('"')
e.encodeBytes(*(*[]byte)(unsafe.Pointer(&s)))
e.encodeByte('"')
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrAnonymousHeadStringTagBytes:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldAnonymousHeadStringTagBytes:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
s := base64.StdEncoding.EncodeToString(
2020-08-31 15:59:22 +03:00
e.ptrToBytes(ptr + code.offset),
2020-08-19 13:56:02 +03:00
)
e.encodeByte('"')
e.encodeBytes(*(*[]byte)(unsafe.Pointer(&s)))
e.encodeByte('"')
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagMarshalJSON:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagMarshalJSON:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
p := unsafe.Pointer(ptr + code.offset)
2020-08-19 13:56:02 +03:00
isPtr := code.typ.Kind() == reflect.Ptr
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{typ: code.typ, ptr: p}))
b, err := v.(Marshaler).MarshalJSON()
if err != nil {
return &MarshalerError{
Type: rtype2type(code.typ),
Err: err,
}
}
if len(b) == 0 {
if isPtr {
return errUnexpectedEndOfJSON(
fmt.Sprintf("error calling MarshalJSON for type %s", code.typ),
0,
)
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{'"', '"'})
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-08-19 13:56:02 +03:00
} else {
var buf bytes.Buffer
if err := compact(&buf, b, true); err != nil {
return err
}
e.encodeString(buf.String())
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
}
}
case opStructFieldPtrAnonymousHeadStringTagMarshalJSON:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldAnonymousHeadStringTagMarshalJSON:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
2020-08-31 15:59:22 +03:00
p := unsafe.Pointer(ptr + code.offset)
2020-08-19 13:56:02 +03:00
isPtr := code.typ.Kind() == reflect.Ptr
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{typ: code.typ, ptr: p}))
b, err := v.(Marshaler).MarshalJSON()
if err != nil {
return &MarshalerError{
Type: rtype2type(code.typ),
Err: err,
}
}
if len(b) == 0 {
if isPtr {
return errUnexpectedEndOfJSON(
fmt.Sprintf("error calling MarshalJSON for type %s", code.typ),
0,
)
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{'"', '"'})
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-08-19 13:56:02 +03:00
} else {
var buf bytes.Buffer
if err := compact(&buf, b, true); err != nil {
return err
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeString(buf.String())
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
}
}
case opStructFieldPtrHeadStringTagMarshalText:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagMarshalText:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeByte('{')
2020-08-31 15:59:22 +03:00
p := unsafe.Pointer(ptr + code.offset)
2020-08-19 13:56:02 +03:00
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{typ: code.typ, ptr: p}))
bytes, err := v.(encoding.TextMarshaler).MarshalText()
if err != nil {
return &MarshalerError{
Type: rtype2type(code.typ),
Err: err,
}
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeString(*(*string)(unsafe.Pointer(&bytes)))
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrAnonymousHeadStringTagMarshalText:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldAnonymousHeadStringTagMarshalText:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
2020-08-31 15:59:22 +03:00
p := unsafe.Pointer(ptr + code.offset)
2020-08-19 13:56:02 +03:00
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{typ: code.typ, ptr: p}))
bytes, err := v.(encoding.TextMarshaler).MarshalText()
if err != nil {
return &MarshalerError{
Type: rtype2type(code.typ),
Err: err,
}
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeString(*(*string)(unsafe.Pointer(&bytes)))
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagIndent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagIndent:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeBytes([]byte{'{', '\n'})
2020-08-31 15:59:22 +03:00
p := ptr + code.offset
2020-08-19 13:56:02 +03:00
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
code = code.next
store(ctxptr, code.idx, p)
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagIntIndent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagIntIndent:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(fmt.Sprint(e.ptrToInt(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagInt8Indent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagInt8Indent:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(fmt.Sprint(e.ptrToInt8(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagInt16Indent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagInt16Indent:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(fmt.Sprint(e.ptrToInt16(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagInt32Indent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagInt32Indent:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(fmt.Sprint(e.ptrToInt32(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagInt64Indent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagInt64Indent:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(fmt.Sprint(e.ptrToInt64(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagUintIndent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagUintIndent:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(fmt.Sprint(e.ptrToUint(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagUint8Indent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagUint8Indent:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(fmt.Sprint(e.ptrToUint8(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagUint16Indent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagUint16Indent:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(fmt.Sprint(e.ptrToUint16(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagUint32Indent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagUint32Indent:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(fmt.Sprint(e.ptrToUint32(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagUint64Indent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagUint64Indent:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(fmt.Sprint(e.ptrToUint64(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagFloat32Indent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagFloat32Indent:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(fmt.Sprint(e.ptrToFloat32(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagFloat64Indent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagFloat64Indent:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeBytes([]byte{'{', '\n'})
2020-08-31 15:59:22 +03:00
v := e.ptrToFloat64(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if math.IsInf(v, 0) || math.IsNaN(v) {
return &UnsupportedValueError{
Value: reflect.ValueOf(v),
Str: strconv.FormatFloat(v, 'g', -1, 64),
}
}
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
e.encodeString(fmt.Sprint(v))
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagStringIndent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagStringIndent:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(strconv.Quote(e.ptrToString(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagBoolIndent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagBoolIndent:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(fmt.Sprint(e.ptrToBool(ptr + code.offset)))
code = code.next
2020-08-19 13:56:02 +03:00
}
case opStructFieldPtrHeadStringTagBytesIndent:
ptr := load(ctxptr, code.idx)
if ptr != 0 {
store(ctxptr, code.idx, e.ptrToPtr(ptr))
2020-08-19 13:56:02 +03:00
}
fallthrough
case opStructFieldHeadStringTagBytesIndent:
ptr := load(ctxptr, code.idx)
2020-08-19 13:56:02 +03:00
if ptr == 0 {
e.encodeIndent(code.indent)
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.end.next
2020-08-19 13:56:02 +03:00
} else {
e.encodeBytes([]byte{'{', '\n'})
e.encodeIndent(code.indent + 1)
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
s := base64.StdEncoding.EncodeToString(
2020-08-31 15:59:22 +03:00
e.ptrToBytes(ptr + code.offset),
2020-08-19 13:56:02 +03:00
)
e.encodeByte('"')
e.encodeBytes(*(*[]byte)(unsafe.Pointer(&s)))
e.encodeByte('"')
2020-08-31 15:59:22 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
}
2020-04-29 18:31:50 +03:00
case opStructField:
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
if !code.anonymousKey {
e.encodeBytes(code.key)
2020-08-22 06:58:34 +03:00
}
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx) + code.offset
2020-04-29 18:31:50 +03:00
code = code.next
2020-08-31 15:59:22 +03:00
store(ctxptr, code.idx, ptr)
2020-08-19 13:56:02 +03:00
case opStructFieldInt:
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeBytes(code.key)
e.encodeInt(e.ptrToInt(ptr + code.offset))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldInt8:
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeBytes(code.key)
e.encodeInt8(e.ptrToInt8(ptr + code.offset))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldInt16:
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeBytes(code.key)
e.encodeInt16(e.ptrToInt16(ptr + code.offset))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldInt32:
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeBytes(code.key)
e.encodeInt32(e.ptrToInt32(ptr + code.offset))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldInt64:
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeBytes(code.key)
e.encodeInt64(e.ptrToInt64(ptr + code.offset))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldUint:
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeBytes(code.key)
e.encodeUint(e.ptrToUint(ptr + code.offset))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldUint8:
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeBytes(code.key)
e.encodeUint8(e.ptrToUint8(ptr + code.offset))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldUint16:
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeBytes(code.key)
e.encodeUint16(e.ptrToUint16(ptr + code.offset))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldUint32:
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeBytes(code.key)
e.encodeUint32(e.ptrToUint32(ptr + code.offset))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldUint64:
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeBytes(code.key)
e.encodeUint64(e.ptrToUint64(ptr + code.offset))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldFloat32:
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeBytes(code.key)
e.encodeFloat32(e.ptrToFloat32(ptr + code.offset))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldFloat64:
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeBytes(code.key)
v := e.ptrToFloat64(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if math.IsInf(v, 0) || math.IsNaN(v) {
return &UnsupportedValueError{
Value: reflect.ValueOf(v),
Str: strconv.FormatFloat(v, 'g', -1, 64),
}
}
e.encodeFloat64(v)
code = code.next
case opStructFieldString:
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeBytes(code.key)
e.encodeString(e.ptrToString(ptr + code.offset))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldBool:
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeBytes(code.key)
e.encodeBool(e.ptrToBool(ptr + code.offset))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldBytes:
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeBytes(code.key)
s := base64.StdEncoding.EncodeToString(e.ptrToBytes(ptr + code.offset))
2020-08-19 13:56:02 +03:00
e.encodeByte('"')
e.encodeBytes(*(*[]byte)(unsafe.Pointer(&s)))
e.encodeByte('"')
code = code.next
case opStructFieldMarshalJSON:
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeBytes(code.key)
p := ptr + code.offset
2020-08-19 13:56:02 +03:00
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{
typ: code.typ,
ptr: unsafe.Pointer(p),
2020-08-19 13:56:02 +03:00
}))
b, err := v.(Marshaler).MarshalJSON()
if err != nil {
return &MarshalerError{
Type: rtype2type(code.typ),
Err: err,
}
}
var buf bytes.Buffer
if err := compact(&buf, b, true); err != nil {
return err
}
e.encodeBytes(buf.Bytes())
code = code.next
case opStructFieldMarshalText:
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeBytes(code.key)
p := ptr + code.offset
2020-08-19 13:56:02 +03:00
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{
typ: code.typ,
ptr: unsafe.Pointer(p),
2020-08-19 13:56:02 +03:00
}))
bytes, err := v.(encoding.TextMarshaler).MarshalText()
if err != nil {
return &MarshalerError{
Type: rtype2type(code.typ),
Err: err,
}
}
e.encodeString(*(*string)(unsafe.Pointer(&bytes)))
code = code.next
case opStructFieldArray:
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
ptr := load(ctxptr, code.headIdx)
2020-09-01 16:26:26 +03:00
p := ptr + code.offset
code = code.next
2020-09-01 16:26:26 +03:00
store(ctxptr, code.idx, p)
case opStructFieldSlice:
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
ptr := load(ctxptr, code.headIdx)
2020-09-01 16:26:26 +03:00
p := ptr + code.offset
code = code.next
2020-09-01 16:26:26 +03:00
store(ctxptr, code.idx, p)
case opStructFieldMap:
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
ptr := load(ctxptr, code.headIdx)
2020-09-01 16:26:26 +03:00
p := ptr + code.offset
code = code.next
2020-09-01 16:26:26 +03:00
store(ctxptr, code.idx, p)
case opStructFieldMapLoad:
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
ptr := load(ctxptr, code.headIdx)
2020-09-01 16:26:26 +03:00
p := ptr + code.offset
code = code.next
2020-09-01 16:26:26 +03:00
store(ctxptr, code.idx, p)
case opStructFieldStruct:
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
ptr := load(ctxptr, code.headIdx)
2020-09-01 16:26:26 +03:00
p := ptr + code.offset
code = code.next
2020-09-01 16:26:26 +03:00
store(ctxptr, code.idx, p)
2020-08-19 13:56:02 +03:00
case opStructFieldIndent:
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-09-01 16:26:26 +03:00
p := ptr + code.offset
2020-08-19 13:56:02 +03:00
code = code.next
2020-09-01 16:26:26 +03:00
store(ctxptr, code.idx, p)
2020-08-19 13:56:02 +03:00
case opStructFieldIntIndent:
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeInt(e.ptrToInt(ptr + code.offset))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldInt8Indent:
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeInt8(e.ptrToInt8(ptr + code.offset))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldInt16Indent:
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeInt16(e.ptrToInt16(ptr + code.offset))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldInt32Indent:
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeInt32(e.ptrToInt32(ptr + code.offset))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldInt64Indent:
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeInt64(e.ptrToInt64(ptr + code.offset))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldUintIndent:
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeUint(e.ptrToUint(ptr + code.offset))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldUint8Indent:
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeUint8(e.ptrToUint8(ptr + code.offset))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldUint16Indent:
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeUint16(e.ptrToUint16(ptr + code.offset))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldUint32Indent:
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeUint32(e.ptrToUint32(ptr + code.offset))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldUint64Indent:
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeUint64(e.ptrToUint64(ptr + code.offset))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldFloat32Indent:
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeFloat32(e.ptrToFloat32(ptr + code.offset))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldFloat64Indent:
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToFloat64(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if math.IsInf(v, 0) || math.IsNaN(v) {
return &UnsupportedValueError{
Value: reflect.ValueOf(v),
Str: strconv.FormatFloat(v, 'g', -1, 64),
}
}
2020-08-19 13:56:02 +03:00
e.encodeFloat64(v)
code = code.next
case opStructFieldStringIndent:
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeString(e.ptrToString(ptr + code.offset))
2020-04-30 05:56:56 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldBoolIndent:
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
e.encodeBool(e.ptrToBool(ptr + code.offset))
2020-04-30 05:56:56 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldBytesIndent:
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
s := base64.StdEncoding.EncodeToString(e.ptrToBytes(ptr + code.offset))
2020-08-19 13:56:02 +03:00
e.encodeByte('"')
e.encodeBytes(*(*[]byte)(unsafe.Pointer(&s)))
e.encodeByte('"')
2020-04-30 05:56:56 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldMarshalJSONIndent:
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
p := ptr + code.offset
2020-08-19 13:56:02 +03:00
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{
typ: code.typ,
ptr: unsafe.Pointer(p),
2020-08-19 13:56:02 +03:00
}))
b, err := v.(Marshaler).MarshalJSON()
if err != nil {
return &MarshalerError{
Type: rtype2type(code.typ),
Err: err,
}
}
var buf bytes.Buffer
if err := compact(&buf, b, true); err != nil {
return err
}
2020-08-19 13:56:02 +03:00
e.encodeBytes(buf.Bytes())
code = code.next
case opStructFieldArrayIndent:
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
p := ptr + code.offset
header := (*reflect.SliceHeader)(unsafe.Pointer(p))
if p == 0 || header.Data == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
code = code.next
}
case opStructFieldSliceIndent:
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
p := ptr + code.offset
header := (*reflect.SliceHeader)(unsafe.Pointer(p))
if p == 0 || header.Data == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
code = code.next
}
case opStructFieldMapIndent:
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
p := ptr + code.offset
if p == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
mlen := maplen(unsafe.Pointer(p))
if mlen == 0 {
e.encodeBytes([]byte{'{', '}'})
mapCode := code.next
2020-08-31 15:59:22 +03:00
code = mapCode.end.next
} else {
code = code.next
}
}
case opStructFieldMapLoadIndent:
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
p := ptr + code.offset
if p == 0 {
e.encodeNull()
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
p = uintptr(*(*unsafe.Pointer)(unsafe.Pointer(p)))
mlen := maplen(unsafe.Pointer(p))
if mlen == 0 {
e.encodeBytes([]byte{'{', '}'})
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
code = code.next
}
}
case opStructFieldStructIndent:
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
p := ptr + code.offset
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
e.encodeByte(' ')
if p == 0 {
e.encodeBytes([]byte{'{', '}'})
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
2020-08-31 15:59:22 +03:00
headCode := code.next
if headCode.next == headCode.end {
// not exists fields
e.encodeBytes([]byte{'{', '}'})
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
code = code.next
store(ctxptr, code.idx, p)
}
}
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmpty:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
p := ptr + code.offset
2020-08-19 13:56:02 +03:00
if p == 0 || *(*uintptr)(unsafe.Pointer(p)) == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-08-19 13:56:02 +03:00
} else {
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
code = code.next
store(ctxptr, code.idx, p)
2020-08-19 13:56:02 +03:00
}
case opStructFieldOmitEmptyInt:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToInt(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != 0 {
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeInt(v)
}
2020-04-30 05:56:56 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyInt8:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToInt8(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != 0 {
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeInt8(v)
}
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldOmitEmptyInt16:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToInt16(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != 0 {
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeInt16(v)
}
2020-04-30 05:56:56 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyInt32:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToInt32(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != 0 {
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeInt32(v)
}
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldOmitEmptyInt64:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToInt64(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != 0 {
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeInt64(v)
}
2020-04-30 05:56:56 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyUint:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToUint(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != 0 {
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeUint(v)
}
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldOmitEmptyUint8:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToUint8(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != 0 {
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeUint8(v)
}
2020-04-30 05:56:56 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyUint16:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToUint16(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != 0 {
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeUint16(v)
}
code = code.next
case opStructFieldOmitEmptyUint32:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToUint32(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != 0 {
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeUint32(v)
}
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldOmitEmptyUint64:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToUint64(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != 0 {
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeUint64(v)
}
2020-04-30 05:56:56 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyFloat32:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToFloat32(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != 0 {
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeFloat32(v)
}
2020-04-30 05:56:56 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyFloat64:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToFloat64(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != 0 {
if math.IsInf(v, 0) || math.IsNaN(v) {
return &UnsupportedValueError{
Value: reflect.ValueOf(v),
Str: strconv.FormatFloat(v, 'g', -1, 64),
}
}
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeFloat64(v)
}
2020-04-30 05:56:56 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyString:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToString(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != "" {
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeString(v)
}
2020-04-30 05:56:56 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyBool:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToBool(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v {
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeBool(v)
}
2020-08-19 04:34:11 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyBytes:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToBytes(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if len(v) > 0 {
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
s := base64.StdEncoding.EncodeToString(v)
e.encodeByte('"')
e.encodeBytes(*(*[]byte)(unsafe.Pointer(&s)))
e.encodeByte('"')
}
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldOmitEmptyMarshalJSON:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
p := ptr + code.offset
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{
typ: code.typ,
ptr: unsafe.Pointer(p),
}))
2020-08-19 13:56:02 +03:00
if v != nil {
b, err := v.(Marshaler).MarshalJSON()
if err != nil {
return &MarshalerError{
Type: rtype2type(code.typ),
Err: err,
}
}
2020-08-19 13:56:02 +03:00
var buf bytes.Buffer
if err := compact(&buf, b, true); err != nil {
return err
}
e.encodeBytes(buf.Bytes())
}
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyMarshalText:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
p := ptr + code.offset
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{
typ: code.typ,
ptr: unsafe.Pointer(p),
}))
2020-08-19 13:56:02 +03:00
if v != nil {
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{
typ: code.typ,
ptr: unsafe.Pointer(p),
2020-08-19 13:56:02 +03:00
}))
bytes, err := v.(encoding.TextMarshaler).MarshalText()
if err != nil {
return &MarshalerError{
Type: rtype2type(code.typ),
Err: err,
}
}
2020-08-19 13:56:02 +03:00
e.encodeString(*(*string)(unsafe.Pointer(&bytes)))
}
2020-05-02 17:35:41 +03:00
code = code.next
case opStructFieldOmitEmptyArray:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
p := ptr + code.offset
header := (*reflect.SliceHeader)(unsafe.Pointer(p))
if p == 0 || header.Data == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
code = code.next
}
case opStructFieldOmitEmptySlice:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
p := ptr + code.offset
header := (*reflect.SliceHeader)(unsafe.Pointer(p))
if p == 0 || header.Data == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
code = code.next
}
case opStructFieldOmitEmptyMap:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
p := ptr + code.offset
if p == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
mlen := maplen(unsafe.Pointer(p))
if mlen == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
code = code.next
}
}
case opStructFieldOmitEmptyMapLoad:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
p := ptr + code.offset
if p == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
p = uintptr(*(*unsafe.Pointer)(unsafe.Pointer(p)))
mlen := maplen(unsafe.Pointer(p))
if mlen == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
code = code.next
}
}
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyIndent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
p := ptr + code.offset
2020-08-19 13:56:02 +03:00
if p == 0 || *(*uintptr)(unsafe.Pointer(p)) == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
2020-08-19 13:56:02 +03:00
} else {
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
code = code.next
store(ctxptr, code.idx, p)
}
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyIntIndent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToInt(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != 0 {
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
e.encodeInt(v)
}
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyInt8Indent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToInt8(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != 0 {
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
e.encodeInt8(v)
}
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyInt16Indent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToInt16(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != 0 {
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
e.encodeInt16(v)
}
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyInt32Indent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToInt32(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != 0 {
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
e.encodeInt32(v)
}
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyInt64Indent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToInt64(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != 0 {
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
e.encodeInt64(v)
}
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyUintIndent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToUint(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != 0 {
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
e.encodeUint(v)
}
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyUint8Indent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToUint8(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != 0 {
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
e.encodeUint8(v)
}
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyUint16Indent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToUint16(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != 0 {
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
e.encodeUint16(v)
}
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyUint32Indent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToUint32(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != 0 {
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
e.encodeUint32(v)
}
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyUint64Indent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToUint64(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != 0 {
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
e.encodeUint64(v)
}
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyFloat32Indent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToFloat32(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != 0 {
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
e.encodeFloat32(v)
}
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyFloat64Indent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToFloat64(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != 0 {
if math.IsInf(v, 0) || math.IsNaN(v) {
return &UnsupportedValueError{
Value: reflect.ValueOf(v),
Str: strconv.FormatFloat(v, 'g', -1, 64),
}
}
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
e.encodeFloat64(v)
2020-08-19 04:34:11 +03:00
}
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyStringIndent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToString(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v != "" {
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
2020-05-01 07:12:01 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
e.encodeString(v)
2020-05-01 07:12:01 +03:00
}
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldOmitEmptyBoolIndent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToBool(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if v {
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
2020-05-01 07:12:01 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
e.encodeBool(v)
2020-05-01 07:12:01 +03:00
}
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldOmitEmptyBytesIndent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToBytes(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if len(v) > 0 {
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
2020-05-01 07:12:01 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
s := base64.StdEncoding.EncodeToString(v)
e.encodeByte('"')
e.encodeBytes(*(*[]byte)(unsafe.Pointer(&s)))
e.encodeByte('"')
}
code = code.next
case opStructFieldOmitEmptyArrayIndent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
p := ptr + code.offset
header := (*reflect.SliceHeader)(unsafe.Pointer(p))
if p == 0 || header.Data == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
e.encodeByte(' ')
code = code.next
}
case opStructFieldOmitEmptySliceIndent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
p := ptr + code.offset
header := (*reflect.SliceHeader)(unsafe.Pointer(p))
if p == 0 || header.Data == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
e.encodeByte(' ')
code = code.next
}
case opStructFieldOmitEmptyMapIndent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
p := ptr + code.offset
if p == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
mlen := maplen(unsafe.Pointer(p))
if mlen == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
e.encodeByte(' ')
code = code.next
}
}
case opStructFieldOmitEmptyMapLoadIndent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
p := ptr + code.offset
if p == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
p = uintptr(*(*unsafe.Pointer)(unsafe.Pointer(p)))
mlen := maplen(unsafe.Pointer(p))
if mlen == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
e.encodeByte(' ')
code = code.next
}
}
case opStructFieldOmitEmptyStructIndent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
p := ptr + code.offset
if p == 0 {
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
headCode := code.next
if headCode.next == headCode.end {
// not exists fields
e.encodeBytes([]byte{'{', '}'})
2020-08-31 15:59:22 +03:00
code = code.nextField
} else {
code = code.next
store(ctxptr, code.idx, p)
}
}
2020-08-19 13:56:02 +03:00
case opStructFieldStringTag:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
p := ptr + code.offset
2020-08-19 13:56:02 +03:00
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
code = code.next
store(ctxptr, code.idx, p)
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagInt:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-19 13:56:02 +03:00
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToInt(ptr + code.offset)))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldStringTagInt8:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-19 13:56:02 +03:00
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
2020-05-01 07:12:01 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToInt8(ptr + code.offset)))
2020-05-01 07:12:01 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagInt16:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-19 13:56:02 +03:00
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
2020-05-01 07:12:01 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToInt16(ptr + code.offset)))
2020-05-01 07:12:01 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagInt32:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-19 13:56:02 +03:00
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
2020-05-01 07:12:01 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToInt32(ptr + code.offset)))
2020-05-01 07:12:01 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagInt64:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-19 13:56:02 +03:00
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
2020-05-01 07:12:01 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToInt64(ptr + code.offset)))
2020-05-01 07:12:01 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagUint:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-19 13:56:02 +03:00
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
2020-05-01 07:12:01 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToUint(ptr + code.offset)))
2020-05-01 07:12:01 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagUint8:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-19 13:56:02 +03:00
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
2020-05-01 07:12:01 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToUint8(ptr + code.offset)))
2020-05-01 07:12:01 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagUint16:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-19 13:56:02 +03:00
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
2020-05-01 07:12:01 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToUint16(ptr + code.offset)))
2020-05-01 07:12:01 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagUint32:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-19 13:56:02 +03:00
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
2020-05-01 07:12:01 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToUint32(ptr + code.offset)))
2020-05-01 07:12:01 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagUint64:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-19 13:56:02 +03:00
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
2020-05-01 07:12:01 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToUint64(ptr + code.offset)))
2020-05-01 07:12:01 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagFloat32:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-19 13:56:02 +03:00
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
2020-05-01 07:12:01 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToFloat32(ptr + code.offset)))
2020-05-01 07:12:01 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagFloat64:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToFloat64(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if math.IsInf(v, 0) || math.IsNaN(v) {
return &UnsupportedValueError{
Value: reflect.ValueOf(v),
Str: strconv.FormatFloat(v, 'g', -1, 64),
2020-05-01 07:12:01 +03:00
}
}
2020-08-19 13:56:02 +03:00
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeString(fmt.Sprint(v))
2020-05-01 07:12:01 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagString:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-19 13:56:02 +03:00
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
2020-05-01 07:12:01 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(strconv.Quote(e.ptrToString(ptr + code.offset)))
2020-05-01 07:12:01 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagBool:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-19 13:56:02 +03:00
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
2020-05-01 07:12:01 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
e.encodeString(fmt.Sprint(e.ptrToBool(ptr + code.offset)))
2020-05-01 07:12:01 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagBytes:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToBytes(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if e.buf[len(e.buf)-1] != '{' {
e.encodeByte(',')
2020-08-19 04:34:11 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
s := base64.StdEncoding.EncodeToString(v)
e.encodeByte('"')
e.encodeBytes(*(*[]byte)(unsafe.Pointer(&s)))
e.encodeByte('"')
2020-08-19 04:34:11 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagMarshalJSON:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
p := ptr + code.offset
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{
typ: code.typ,
ptr: unsafe.Pointer(p),
}))
2020-08-19 13:56:02 +03:00
b, err := v.(Marshaler).MarshalJSON()
if err != nil {
return &MarshalerError{
Type: rtype2type(code.typ),
Err: err,
}
}
2020-08-19 13:56:02 +03:00
var buf bytes.Buffer
if err := compact(&buf, b, true); err != nil {
return err
}
e.encodeString(buf.String())
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagMarshalText:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
p := ptr + code.offset
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{
typ: code.typ,
ptr: unsafe.Pointer(p),
}))
2020-08-19 13:56:02 +03:00
bytes, err := v.(encoding.TextMarshaler).MarshalText()
if err != nil {
return &MarshalerError{
Type: rtype2type(code.typ),
Err: err,
}
}
2020-08-19 13:56:02 +03:00
e.encodeString(*(*string)(unsafe.Pointer(&bytes)))
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagIndent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
p := ptr + code.offset
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
2020-05-02 17:35:41 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
code = code.next
store(ctxptr, code.idx, p)
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagIntIndent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
2020-05-02 17:35:41 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(fmt.Sprint(e.ptrToInt(ptr + code.offset)))
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagInt8Indent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(fmt.Sprint(e.ptrToInt8(ptr + code.offset)))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldStringTagInt16Indent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(fmt.Sprint(e.ptrToInt16(ptr + code.offset)))
2020-08-19 13:56:02 +03:00
code = code.next
case opStructFieldStringTagInt32Indent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
2020-05-02 17:35:41 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(fmt.Sprint(e.ptrToInt32(ptr + code.offset)))
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagInt64Indent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
2020-05-02 17:35:41 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(fmt.Sprint(e.ptrToInt64(ptr + code.offset)))
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagUintIndent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
2020-05-02 17:35:41 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(fmt.Sprint(e.ptrToUint(ptr + code.offset)))
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagUint8Indent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
2020-05-02 17:35:41 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(fmt.Sprint(e.ptrToUint8(ptr + code.offset)))
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagUint16Indent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
2020-05-02 17:35:41 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(fmt.Sprint(e.ptrToUint16(ptr + code.offset)))
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagUint32Indent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
2020-05-02 17:35:41 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(fmt.Sprint(e.ptrToUint32(ptr + code.offset)))
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagUint64Indent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
2020-05-02 17:35:41 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(fmt.Sprint(e.ptrToUint64(ptr + code.offset)))
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagFloat32Indent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
2020-05-02 17:35:41 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(fmt.Sprint(e.ptrToFloat32(ptr + code.offset)))
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagFloat64Indent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
v := e.ptrToFloat64(ptr + code.offset)
2020-08-19 13:56:02 +03:00
if math.IsInf(v, 0) || math.IsNaN(v) {
return &UnsupportedValueError{
Value: reflect.ValueOf(v),
Str: strconv.FormatFloat(v, 'g', -1, 64),
2020-05-02 17:35:41 +03:00
}
}
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
e.encodeString(fmt.Sprint(v))
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagStringIndent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
2020-05-02 17:35:41 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
var b bytes.Buffer
enc := NewEncoder(&b)
2020-08-31 15:59:22 +03:00
enc.encodeString(e.ptrToString(ptr + code.offset))
2020-08-19 13:56:02 +03:00
e.encodeString(string(enc.buf))
enc.release()
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagBoolIndent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
2020-05-02 17:35:41 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
e.encodeString(fmt.Sprint(e.ptrToBool(ptr + code.offset)))
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagBytesIndent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
2020-05-02 17:35:41 +03:00
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
s := base64.StdEncoding.EncodeToString(
2020-08-31 15:59:22 +03:00
e.ptrToBytes(ptr + code.offset),
2020-08-19 13:56:02 +03:00
)
e.encodeByte('"')
e.encodeBytes(*(*[]byte)(unsafe.Pointer(&s)))
e.encodeByte('"')
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagMarshalJSONIndent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
p := ptr + code.offset
2020-08-19 13:56:02 +03:00
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{
typ: code.typ,
ptr: unsafe.Pointer(p),
2020-08-19 13:56:02 +03:00
}))
b, err := v.(Marshaler).MarshalJSON()
if err != nil {
return &MarshalerError{
Type: rtype2type(code.typ),
Err: err,
2020-05-02 17:35:41 +03:00
}
}
2020-08-19 13:56:02 +03:00
var buf bytes.Buffer
if err := compact(&buf, b, true); err != nil {
return err
}
e.encodeString(buf.String())
2020-05-02 17:35:41 +03:00
code = code.next
2020-08-19 13:56:02 +03:00
case opStructFieldStringTagMarshalTextIndent:
2020-08-31 15:59:22 +03:00
ptr := load(ctxptr, code.headIdx)
2020-08-22 18:54:19 +03:00
if e.buf[len(e.buf)-2] != '{' || e.buf[len(e.buf)-1] == '}' {
2020-08-19 13:56:02 +03:00
e.encodeBytes([]byte{',', '\n'})
}
2020-08-31 15:59:22 +03:00
e.encodeIndent(code.indent)
e.encodeBytes(code.key)
2020-08-19 13:56:02 +03:00
e.encodeByte(' ')
2020-08-31 15:59:22 +03:00
p := ptr + code.offset
2020-08-19 13:56:02 +03:00
v := *(*interface{})(unsafe.Pointer(&interfaceHeader{
typ: code.typ,
ptr: unsafe.Pointer(p),
2020-08-19 13:56:02 +03:00
}))
bytes, err := v.(encoding.TextMarshaler).MarshalText()
if err != nil {
return &MarshalerError{
Type: rtype2type(code.typ),
Err: err,
2020-08-19 04:34:11 +03:00
}
}
2020-08-19 13:56:02 +03:00
e.encodeString(*(*string)(unsafe.Pointer(&bytes)))
2020-08-19 04:34:11 +03:00
code = code.next
2020-04-29 18:31:50 +03:00
case opStructEnd:
e.encodeByte('}')
code = code.next
2020-08-15 11:41:38 +03:00
case opStructAnonymousEnd:
code = code.next
2020-05-02 17:35:41 +03:00
case opStructEndIndent:
e.encodeByte('\n')
e.encodeIndent(code.indent)
e.encodeByte('}')
code = code.next
2020-04-29 18:31:50 +03:00
case opEnd:
goto END
}
}
END:
return nil
}
2020-04-30 07:52:24 +03:00
func (e *Encoder) ptrToPtr(p uintptr) uintptr { return *(*uintptr)(unsafe.Pointer(p)) }
func (e *Encoder) ptrToInt(p uintptr) int { return *(*int)(unsafe.Pointer(p)) }
func (e *Encoder) ptrToInt8(p uintptr) int8 { return *(*int8)(unsafe.Pointer(p)) }
func (e *Encoder) ptrToInt16(p uintptr) int16 { return *(*int16)(unsafe.Pointer(p)) }
func (e *Encoder) ptrToInt32(p uintptr) int32 { return *(*int32)(unsafe.Pointer(p)) }
func (e *Encoder) ptrToInt64(p uintptr) int64 { return *(*int64)(unsafe.Pointer(p)) }
func (e *Encoder) ptrToUint(p uintptr) uint { return *(*uint)(unsafe.Pointer(p)) }
func (e *Encoder) ptrToUint8(p uintptr) uint8 { return *(*uint8)(unsafe.Pointer(p)) }
func (e *Encoder) ptrToUint16(p uintptr) uint16 { return *(*uint16)(unsafe.Pointer(p)) }
func (e *Encoder) ptrToUint32(p uintptr) uint32 { return *(*uint32)(unsafe.Pointer(p)) }
func (e *Encoder) ptrToUint64(p uintptr) uint64 { return *(*uint64)(unsafe.Pointer(p)) }
func (e *Encoder) ptrToFloat32(p uintptr) float32 { return *(*float32)(unsafe.Pointer(p)) }
func (e *Encoder) ptrToFloat64(p uintptr) float64 { return *(*float64)(unsafe.Pointer(p)) }
func (e *Encoder) ptrToBool(p uintptr) bool { return *(*bool)(unsafe.Pointer(p)) }
func (e *Encoder) ptrToByte(p uintptr) byte { return *(*byte)(unsafe.Pointer(p)) }
func (e *Encoder) ptrToBytes(p uintptr) []byte { return *(*[]byte)(unsafe.Pointer(p)) }
func (e *Encoder) ptrToString(p uintptr) string { return *(*string)(unsafe.Pointer(p)) }