summaryrefslogtreecommitdiff
path: root/vendor/github.com/goccy/go-json/internal/encoder
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/goccy/go-json/internal/encoder')
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/compact.go286
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/compiler.go1510
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/compiler_norace.go39
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/compiler_race.go47
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/context.go135
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/encoder.go533
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/indent.go211
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/int.go124
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/map112.go8
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/map113.go8
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/opcode.go743
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/optype.go932
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/string.go637
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/vm/debug_vm.go27
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/vm/hack.go9
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/vm/util.go215
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/vm/vm.go4993
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/vm_escaped/debug_vm.go27
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/vm_escaped/hack.go9
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/vm_escaped/util.go215
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/vm_escaped/vm.go4993
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/vm_escaped_indent/debug_vm.go27
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/vm_escaped_indent/hack.go6
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/vm_escaped_indent/util.go241
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/vm_escaped_indent/vm.go4993
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/vm_indent/debug_vm.go27
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/vm_indent/hack.go9
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/vm_indent/util.go241
-rw-r--r--vendor/github.com/goccy/go-json/internal/encoder/vm_indent/vm.go4993
29 files changed, 26238 insertions, 0 deletions
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/compact.go b/vendor/github.com/goccy/go-json/internal/encoder/compact.go
new file mode 100644
index 000000000..0eb9545d8
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/compact.go
@@ -0,0 +1,286 @@
+package encoder
+
+import (
+ "bytes"
+ "fmt"
+ "strconv"
+ "unsafe"
+
+ "github.com/goccy/go-json/internal/errors"
+)
+
+var (
+ isWhiteSpace = [256]bool{
+ ' ': true,
+ '\n': true,
+ '\t': true,
+ '\r': true,
+ }
+ isHTMLEscapeChar = [256]bool{
+ '<': true,
+ '>': true,
+ '&': true,
+ }
+ nul = byte('\000')
+)
+
+func Compact(buf *bytes.Buffer, src []byte, escape bool) error {
+ if len(src) == 0 {
+ return errors.ErrUnexpectedEndOfJSON("", 0)
+ }
+ buf.Grow(len(src))
+ dst := buf.Bytes()
+
+ ctx := TakeRuntimeContext()
+ ctxBuf := ctx.Buf[:0]
+ ctxBuf = append(append(ctxBuf, src...), nul)
+ ctx.Buf = ctxBuf
+
+ if err := compactAndWrite(buf, dst, ctxBuf, escape); err != nil {
+ ReleaseRuntimeContext(ctx)
+ return err
+ }
+ ReleaseRuntimeContext(ctx)
+ return nil
+}
+
+func compactAndWrite(buf *bytes.Buffer, dst []byte, src []byte, escape bool) error {
+ dst, err := compact(dst, src, escape)
+ if err != nil {
+ return err
+ }
+ if _, err := buf.Write(dst); err != nil {
+ return err
+ }
+ return nil
+}
+
+func compact(dst, src []byte, escape bool) ([]byte, error) {
+ buf, cursor, err := compactValue(dst, src, 0, escape)
+ if err != nil {
+ return nil, err
+ }
+ if err := validateEndBuf(src, cursor); err != nil {
+ return nil, err
+ }
+ return buf, nil
+}
+
+func validateEndBuf(src []byte, cursor int64) error {
+ for {
+ switch src[cursor] {
+ case ' ', '\t', '\n', '\r':
+ cursor++
+ continue
+ case nul:
+ return nil
+ }
+ return errors.ErrSyntax(
+ fmt.Sprintf("invalid character '%c' after top-level value", src[cursor]),
+ cursor+1,
+ )
+ }
+}
+
+func skipWhiteSpace(buf []byte, cursor int64) int64 {
+LOOP:
+ if isWhiteSpace[buf[cursor]] {
+ cursor++
+ goto LOOP
+ }
+ return cursor
+}
+
+func compactValue(dst, src []byte, cursor int64, escape bool) ([]byte, int64, error) {
+ for {
+ switch src[cursor] {
+ case ' ', '\t', '\n', '\r':
+ cursor++
+ continue
+ case '{':
+ return compactObject(dst, src, cursor, escape)
+ case '}':
+ return nil, 0, errors.ErrSyntax("unexpected character '}'", cursor)
+ case '[':
+ return compactArray(dst, src, cursor, escape)
+ case ']':
+ return nil, 0, errors.ErrSyntax("unexpected character ']'", cursor)
+ case '"':
+ return compactString(dst, src, cursor, escape)
+ case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
+ return compactNumber(dst, src, cursor)
+ case 't':
+ return compactTrue(dst, src, cursor)
+ case 'f':
+ return compactFalse(dst, src, cursor)
+ case 'n':
+ return compactNull(dst, src, cursor)
+ default:
+ return nil, 0, errors.ErrSyntax(fmt.Sprintf("unexpected character '%c'", src[cursor]), cursor)
+ }
+ }
+}
+
+func compactObject(dst, src []byte, cursor int64, escape bool) ([]byte, int64, error) {
+ if src[cursor] == '{' {
+ dst = append(dst, '{')
+ } else {
+ return nil, 0, errors.ErrExpected("expected { character for object value", cursor)
+ }
+ cursor = skipWhiteSpace(src, cursor+1)
+ if src[cursor] == '}' {
+ dst = append(dst, '}')
+ return dst, cursor + 1, nil
+ }
+ var err error
+ for {
+ cursor = skipWhiteSpace(src, cursor)
+ dst, cursor, err = compactString(dst, src, cursor, escape)
+ if err != nil {
+ return nil, 0, err
+ }
+ cursor = skipWhiteSpace(src, cursor)
+ if src[cursor] != ':' {
+ return nil, 0, errors.ErrExpected("colon after object key", cursor)
+ }
+ dst = append(dst, ':')
+ dst, cursor, err = compactValue(dst, src, cursor+1, escape)
+ if err != nil {
+ return nil, 0, err
+ }
+ cursor = skipWhiteSpace(src, cursor)
+ switch src[cursor] {
+ case '}':
+ dst = append(dst, '}')
+ cursor++
+ return dst, cursor, nil
+ case ',':
+ dst = append(dst, ',')
+ default:
+ return nil, 0, errors.ErrExpected("comma after object value", cursor)
+ }
+ cursor++
+ }
+}
+
+func compactArray(dst, src []byte, cursor int64, escape bool) ([]byte, int64, error) {
+ if src[cursor] == '[' {
+ dst = append(dst, '[')
+ } else {
+ return nil, 0, errors.ErrExpected("expected [ character for array value", cursor)
+ }
+ cursor = skipWhiteSpace(src, cursor+1)
+ if src[cursor] == ']' {
+ dst = append(dst, ']')
+ return dst, cursor + 1, nil
+ }
+ var err error
+ for {
+ dst, cursor, err = compactValue(dst, src, cursor, escape)
+ if err != nil {
+ return nil, 0, err
+ }
+ cursor = skipWhiteSpace(src, cursor)
+ switch src[cursor] {
+ case ']':
+ dst = append(dst, ']')
+ cursor++
+ return dst, cursor, nil
+ case ',':
+ dst = append(dst, ',')
+ default:
+ return nil, 0, errors.ErrExpected("comma after array value", cursor)
+ }
+ cursor++
+ }
+}
+
+func compactString(dst, src []byte, cursor int64, escape bool) ([]byte, int64, error) {
+ if src[cursor] != '"' {
+ return nil, 0, errors.ErrInvalidCharacter(src[cursor], "string", cursor)
+ }
+ start := cursor
+ for {
+ cursor++
+ c := src[cursor]
+ if escape {
+ if isHTMLEscapeChar[c] {
+ dst = append(dst, src[start:cursor]...)
+ dst = append(dst, `\u00`...)
+ dst = append(dst, hex[c>>4], hex[c&0xF])
+ start = cursor + 1
+ } else if c == 0xE2 && cursor+2 < int64(len(src)) && src[cursor+1] == 0x80 && src[cursor+2]&^1 == 0xA8 {
+ dst = append(dst, src[start:cursor]...)
+ dst = append(dst, `\u202`...)
+ dst = append(dst, hex[src[cursor+2]&0xF])
+ cursor += 2
+ start = cursor + 3
+ }
+ }
+ switch c {
+ case '\\':
+ cursor++
+ if src[cursor] == nul {
+ return nil, 0, errors.ErrUnexpectedEndOfJSON("string", int64(len(src)))
+ }
+ case '"':
+ cursor++
+ return append(dst, src[start:cursor]...), cursor, nil
+ case nul:
+ return nil, 0, errors.ErrUnexpectedEndOfJSON("string", int64(len(src)))
+ }
+ }
+}
+
+func compactNumber(dst, src []byte, cursor int64) ([]byte, int64, error) {
+ start := cursor
+ for {
+ cursor++
+ if floatTable[src[cursor]] {
+ continue
+ }
+ break
+ }
+ num := src[start:cursor]
+ if _, err := strconv.ParseFloat(*(*string)(unsafe.Pointer(&num)), 64); err != nil {
+ return nil, 0, err
+ }
+ dst = append(dst, num...)
+ return dst, cursor, nil
+}
+
+func compactTrue(dst, src []byte, cursor int64) ([]byte, int64, error) {
+ if cursor+3 >= int64(len(src)) {
+ return nil, 0, errors.ErrUnexpectedEndOfJSON("true", cursor)
+ }
+ if !bytes.Equal(src[cursor:cursor+4], []byte(`true`)) {
+ return nil, 0, errors.ErrInvalidCharacter(src[cursor], "true", cursor)
+ }
+ dst = append(dst, "true"...)
+ cursor += 4
+ return dst, cursor, nil
+}
+
+func compactFalse(dst, src []byte, cursor int64) ([]byte, int64, error) {
+ if cursor+4 >= int64(len(src)) {
+ return nil, 0, errors.ErrUnexpectedEndOfJSON("false", cursor)
+ }
+ if !bytes.Equal(src[cursor:cursor+5], []byte(`false`)) {
+ return nil, 0, errors.ErrInvalidCharacter(src[cursor], "false", cursor)
+ }
+ dst = append(dst, "false"...)
+ cursor += 5
+ return dst, cursor, nil
+}
+
+func compactNull(dst, src []byte, cursor int64) ([]byte, int64, error) {
+ if cursor+3 >= int64(len(src)) {
+ return nil, 0, errors.ErrUnexpectedEndOfJSON("null", cursor)
+ }
+ if !bytes.Equal(src[cursor:cursor+4], []byte(`null`)) {
+ return nil, 0, errors.ErrInvalidCharacter(src[cursor], "null", cursor)
+ }
+ dst = append(dst, "null"...)
+ cursor += 4
+ return dst, cursor, nil
+}
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/compiler.go b/vendor/github.com/goccy/go-json/internal/encoder/compiler.go
new file mode 100644
index 000000000..486c80f18
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/compiler.go
@@ -0,0 +1,1510 @@
+package encoder
+
+import (
+ "encoding"
+ "encoding/json"
+ "fmt"
+ "reflect"
+ "strings"
+ "sync/atomic"
+ "unsafe"
+
+ "github.com/goccy/go-json/internal/errors"
+ "github.com/goccy/go-json/internal/runtime"
+)
+
+var (
+ marshalJSONType = reflect.TypeOf((*json.Marshaler)(nil)).Elem()
+ marshalTextType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem()
+ jsonNumberType = reflect.TypeOf(json.Number(""))
+ cachedOpcodeSets []*OpcodeSet
+ cachedOpcodeMap unsafe.Pointer // map[uintptr]*OpcodeSet
+ typeAddr *runtime.TypeAddr
+)
+
+func init() {
+ typeAddr = runtime.AnalyzeTypeAddr()
+ if typeAddr == nil {
+ typeAddr = &runtime.TypeAddr{}
+ }
+ cachedOpcodeSets = make([]*OpcodeSet, typeAddr.AddrRange>>typeAddr.AddrShift)
+}
+
+func loadOpcodeMap() map[uintptr]*OpcodeSet {
+ p := atomic.LoadPointer(&cachedOpcodeMap)
+ return *(*map[uintptr]*OpcodeSet)(unsafe.Pointer(&p))
+}
+
+func storeOpcodeSet(typ uintptr, set *OpcodeSet, m map[uintptr]*OpcodeSet) {
+ newOpcodeMap := make(map[uintptr]*OpcodeSet, len(m)+1)
+ newOpcodeMap[typ] = set
+
+ for k, v := range m {
+ newOpcodeMap[k] = v
+ }
+
+ atomic.StorePointer(&cachedOpcodeMap, *(*unsafe.Pointer)(unsafe.Pointer(&newOpcodeMap)))
+}
+
+func compileToGetCodeSetSlowPath(typeptr uintptr) (*OpcodeSet, error) {
+ opcodeMap := loadOpcodeMap()
+ if codeSet, exists := opcodeMap[typeptr]; exists {
+ return codeSet, nil
+ }
+
+ // noescape trick for header.typ ( reflect.*rtype )
+ copiedType := *(**runtime.Type)(unsafe.Pointer(&typeptr))
+
+ code, err := compileHead(&compileContext{
+ typ: copiedType,
+ structTypeToCompiledCode: map[uintptr]*CompiledCode{},
+ })
+ if err != nil {
+ return nil, err
+ }
+ code = copyOpcode(code)
+ codeLength := code.TotalLength()
+ codeSet := &OpcodeSet{
+ Type: copiedType,
+ Code: code,
+ CodeLength: codeLength,
+ }
+ storeOpcodeSet(typeptr, codeSet, opcodeMap)
+ return codeSet, nil
+}
+
+func compileHead(ctx *compileContext) (*Opcode, error) {
+ typ := ctx.typ
+ switch {
+ case implementsMarshalJSON(typ):
+ return compileMarshalJSON(ctx)
+ case implementsMarshalText(typ):
+ return compileMarshalText(ctx)
+ }
+
+ isPtr := false
+ orgType := typ
+ if typ.Kind() == reflect.Ptr {
+ typ = typ.Elem()
+ isPtr = true
+ }
+ switch {
+ case implementsMarshalJSON(typ):
+ return compileMarshalJSON(ctx)
+ case implementsMarshalText(typ):
+ return compileMarshalText(ctx)
+ }
+ switch typ.Kind() {
+ case reflect.Slice:
+ ctx := ctx.withType(typ)
+ elem := typ.Elem()
+ if elem.Kind() == reflect.Uint8 {
+ p := runtime.PtrTo(elem)
+ if !p.Implements(marshalJSONType) && !p.Implements(marshalTextType) {
+ if isPtr {
+ return compileBytesPtr(ctx)
+ }
+ return compileBytes(ctx)
+ }
+ }
+ code, err := compileSlice(ctx)
+ if err != nil {
+ return nil, err
+ }
+ optimizeStructEnd(code)
+ linkRecursiveCode(code)
+ return code, nil
+ case reflect.Map:
+ if isPtr {
+ return compilePtr(ctx.withType(runtime.PtrTo(typ)))
+ }
+ code, err := compileMap(ctx.withType(typ))
+ if err != nil {
+ return nil, err
+ }
+ optimizeStructEnd(code)
+ linkRecursiveCode(code)
+ return code, nil
+ case reflect.Struct:
+ code, err := compileStruct(ctx.withType(typ), isPtr)
+ if err != nil {
+ return nil, err
+ }
+ optimizeStructEnd(code)
+ linkRecursiveCode(code)
+ return code, nil
+ case reflect.Int:
+ ctx := ctx.withType(typ)
+ if isPtr {
+ return compileIntPtr(ctx)
+ }
+ return compileInt(ctx)
+ case reflect.Int8:
+ ctx := ctx.withType(typ)
+ if isPtr {
+ return compileInt8Ptr(ctx)
+ }
+ return compileInt8(ctx)
+ case reflect.Int16:
+ ctx := ctx.withType(typ)
+ if isPtr {
+ return compileInt16Ptr(ctx)
+ }
+ return compileInt16(ctx)
+ case reflect.Int32:
+ ctx := ctx.withType(typ)
+ if isPtr {
+ return compileInt32Ptr(ctx)
+ }
+ return compileInt32(ctx)
+ case reflect.Int64:
+ ctx := ctx.withType(typ)
+ if isPtr {
+ return compileInt64Ptr(ctx)
+ }
+ return compileInt64(ctx)
+ case reflect.Uint, reflect.Uintptr:
+ ctx := ctx.withType(typ)
+ if isPtr {
+ return compileUintPtr(ctx)
+ }
+ return compileUint(ctx)
+ case reflect.Uint8:
+ ctx := ctx.withType(typ)
+ if isPtr {
+ return compileUint8Ptr(ctx)
+ }
+ return compileUint8(ctx)
+ case reflect.Uint16:
+ ctx := ctx.withType(typ)
+ if isPtr {
+ return compileUint16Ptr(ctx)
+ }
+ return compileUint16(ctx)
+ case reflect.Uint32:
+ ctx := ctx.withType(typ)
+ if isPtr {
+ return compileUint32Ptr(ctx)
+ }
+ return compileUint32(ctx)
+ case reflect.Uint64:
+ ctx := ctx.withType(typ)
+ if isPtr {
+ return compileUint64Ptr(ctx)
+ }
+ return compileUint64(ctx)
+ case reflect.Float32:
+ ctx := ctx.withType(typ)
+ if isPtr {
+ return compileFloat32Ptr(ctx)
+ }
+ return compileFloat32(ctx)
+ case reflect.Float64:
+ ctx := ctx.withType(typ)
+ if isPtr {
+ return compileFloat64Ptr(ctx)
+ }
+ return compileFloat64(ctx)
+ case reflect.String:
+ ctx := ctx.withType(typ)
+ if isPtr {
+ return compileStringPtr(ctx)
+ }
+ return compileString(ctx)
+ case reflect.Bool:
+ ctx := ctx.withType(typ)
+ if isPtr {
+ return compileBoolPtr(ctx)
+ }
+ return compileBool(ctx)
+ case reflect.Interface:
+ ctx := ctx.withType(typ)
+ if isPtr {
+ return compileInterfacePtr(ctx)
+ }
+ return compileInterface(ctx)
+ default:
+ if isPtr && typ.Implements(marshalTextType) {
+ typ = orgType
+ }
+ code, err := compile(ctx.withType(typ), isPtr)
+ if err != nil {
+ return nil, err
+ }
+ optimizeStructEnd(code)
+ linkRecursiveCode(code)
+ return code, nil
+ }
+}
+
+func linkRecursiveCode(c *Opcode) {
+ for code := c; code.Op != OpEnd && code.Op != OpRecursiveEnd; {
+ switch code.Op {
+ case OpRecursive, OpRecursivePtr:
+ if code.Jmp.Linked {
+ code = code.Next
+ continue
+ }
+ code.Jmp.Code = copyOpcode(code.Jmp.Code)
+ c := code.Jmp.Code
+ c.End.Next = newEndOp(&compileContext{})
+ c.Op = c.Op.PtrHeadToHead()
+
+ beforeLastCode := c.End
+ lastCode := beforeLastCode.Next
+
+ lastCode.Idx = beforeLastCode.Idx + uintptrSize
+ lastCode.ElemIdx = lastCode.Idx + uintptrSize
+ lastCode.Length = lastCode.Idx + 2*uintptrSize
+
+ // extend length to alloc slot for elemIdx + length
+ totalLength := uintptr(code.TotalLength() + 2)
+ nextTotalLength := uintptr(c.TotalLength() + 2)
+
+ c.End.Next.Op = OpRecursiveEnd
+
+ code.Jmp.CurLen = totalLength
+ code.Jmp.NextLen = nextTotalLength
+ code.Jmp.Linked = true
+
+ linkRecursiveCode(code.Jmp.Code)
+ code = code.Next
+ continue
+ }
+ switch code.Op.CodeType() {
+ case CodeArrayElem, CodeSliceElem, CodeMapKey:
+ code = code.End
+ default:
+ code = code.Next
+ }
+ }
+}
+
+func optimizeStructEnd(c *Opcode) {
+ for code := c; code.Op != OpEnd; {
+ if code.Op == OpRecursive || code.Op == OpRecursivePtr {
+ // ignore if exists recursive operation
+ return
+ }
+ switch code.Op.CodeType() {
+ case CodeArrayElem, CodeSliceElem, CodeMapKey:
+ code = code.End
+ default:
+ code = code.Next
+ }
+ }
+
+ for code := c; code.Op != OpEnd; {
+ switch code.Op.CodeType() {
+ case CodeArrayElem, CodeSliceElem, CodeMapKey:
+ code = code.End
+ case CodeStructEnd:
+ switch code.Op {
+ case OpStructEnd:
+ prev := code.PrevField
+ prevOp := prev.Op.String()
+ if strings.Contains(prevOp, "Head") ||
+ strings.Contains(prevOp, "Slice") ||
+ strings.Contains(prevOp, "Array") ||
+ strings.Contains(prevOp, "Map") ||
+ strings.Contains(prevOp, "MarshalJSON") ||
+ strings.Contains(prevOp, "MarshalText") {
+ // not exists field
+ code = code.Next
+ break
+ }
+ if prev.Op != prev.Op.FieldToEnd() {
+ prev.Op = prev.Op.FieldToEnd()
+ prev.Next = code.Next
+ }
+ code = code.Next
+ default:
+ code = code.Next
+ }
+ default:
+ code = code.Next
+ }
+ }
+}
+
+func implementsMarshalJSON(typ *runtime.Type) bool {
+ if !typ.Implements(marshalJSONType) {
+ return false
+ }
+ if typ.Kind() != reflect.Ptr {
+ return true
+ }
+ // type kind is reflect.Ptr
+ if !typ.Elem().Implements(marshalJSONType) {
+ return true
+ }
+ // needs to dereference
+ return false
+}
+
+func implementsMarshalText(typ *runtime.Type) bool {
+ if !typ.Implements(marshalTextType) {
+ return false
+ }
+ if typ.Kind() != reflect.Ptr {
+ return true
+ }
+ // type kind is reflect.Ptr
+ if !typ.Elem().Implements(marshalTextType) {
+ return true
+ }
+ // needs to dereference
+ return false
+}
+
+func compile(ctx *compileContext, isPtr bool) (*Opcode, error) {
+ typ := ctx.typ
+ switch {
+ case implementsMarshalJSON(typ):
+ return compileMarshalJSON(ctx)
+ case implementsMarshalText(typ):
+ return compileMarshalText(ctx)
+ }
+ switch typ.Kind() {
+ case reflect.Ptr:
+ return compilePtr(ctx)
+ case reflect.Slice:
+ elem := typ.Elem()
+ if elem.Kind() == reflect.Uint8 {
+ p := runtime.PtrTo(elem)
+ if !p.Implements(marshalJSONType) && !p.Implements(marshalTextType) {
+ return compileBytes(ctx)
+ }
+ }
+ return compileSlice(ctx)
+ case reflect.Array:
+ return compileArray(ctx)
+ case reflect.Map:
+ return compileMap(ctx)
+ case reflect.Struct:
+ return compileStruct(ctx, isPtr)
+ case reflect.Interface:
+ return compileInterface(ctx)
+ case reflect.Int:
+ return compileInt(ctx)
+ case reflect.Int8:
+ return compileInt8(ctx)
+ case reflect.Int16:
+ return compileInt16(ctx)
+ case reflect.Int32:
+ return compileInt32(ctx)
+ case reflect.Int64:
+ return compileInt64(ctx)
+ case reflect.Uint:
+ return compileUint(ctx)
+ case reflect.Uint8:
+ return compileUint8(ctx)
+ case reflect.Uint16:
+ return compileUint16(ctx)
+ case reflect.Uint32:
+ return compileUint32(ctx)
+ case reflect.Uint64:
+ return compileUint64(ctx)
+ case reflect.Uintptr:
+ return compileUint(ctx)
+ case reflect.Float32:
+ return compileFloat32(ctx)
+ case reflect.Float64:
+ return compileFloat64(ctx)
+ case reflect.String:
+ return compileString(ctx)
+ case reflect.Bool:
+ return compileBool(ctx)
+ }
+ return nil, &errors.UnsupportedTypeError{Type: runtime.RType2Type(typ)}
+}
+
+func convertPtrOp(code *Opcode) OpType {
+ ptrHeadOp := code.Op.HeadToPtrHead()
+ if code.Op != ptrHeadOp {
+ if code.PtrNum > 0 {
+ // ptr field and ptr head
+ code.PtrNum--
+ }
+ return ptrHeadOp
+ }
+ switch code.Op {
+ case OpInt:
+ return OpIntPtr
+ case OpUint:
+ return OpUintPtr
+ case OpFloat32:
+ return OpFloat32Ptr
+ case OpFloat64:
+ return OpFloat64Ptr
+ case OpString:
+ return OpStringPtr
+ case OpBool:
+ return OpBoolPtr
+ case OpBytes:
+ return OpBytesPtr
+ case OpNumber:
+ return OpNumberPtr
+ case OpArray:
+ return OpArrayPtr
+ case OpSlice:
+ return OpSlicePtr
+ case OpMap:
+ return OpMapPtr
+ case OpMarshalJSON:
+ return OpMarshalJSONPtr
+ case OpMarshalText:
+ return OpMarshalTextPtr
+ case OpInterface:
+ return OpInterfacePtr
+ case OpRecursive:
+ return OpRecursivePtr
+ }
+ return code.Op
+}
+
+func compileKey(ctx *compileContext) (*Opcode, error) {
+ typ := ctx.typ
+ switch {
+ case implementsMarshalJSON(typ):
+ return compileMarshalJSON(ctx)
+ case implementsMarshalText(typ):
+ return compileMarshalText(ctx)
+ }
+ switch typ.Kind() {
+ case reflect.Ptr:
+ return compilePtr(ctx)
+ case reflect.Interface:
+ return compileInterface(ctx)
+ case reflect.String:
+ return compileString(ctx)
+ case reflect.Int:
+ return compileIntString(ctx)
+ case reflect.Int8:
+ return compileInt8String(ctx)
+ case reflect.Int16:
+ return compileInt16String(ctx)
+ case reflect.Int32:
+ return compileInt32String(ctx)
+ case reflect.Int64:
+ return compileInt64String(ctx)
+ case reflect.Uint:
+ return compileUintString(ctx)
+ case reflect.Uint8:
+ return compileUint8String(ctx)
+ case reflect.Uint16:
+ return compileUint16String(ctx)
+ case reflect.Uint32:
+ return compileUint32String(ctx)
+ case reflect.Uint64:
+ return compileUint64String(ctx)
+ case reflect.Uintptr:
+ return compileUintString(ctx)
+ }
+ return nil, &errors.UnsupportedTypeError{Type: runtime.RType2Type(typ)}
+}
+
+func compilePtr(ctx *compileContext) (*Opcode, error) {
+ code, err := compile(ctx.withType(ctx.typ.Elem()), true)
+ if err != nil {
+ return nil, err
+ }
+ code.Op = convertPtrOp(code)
+ code.PtrNum++
+ return code, nil
+}
+
+func compileMarshalJSON(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpMarshalJSON)
+ typ := ctx.typ
+ if !typ.Implements(marshalJSONType) && runtime.PtrTo(typ).Implements(marshalJSONType) {
+ code.AddrForMarshaler = true
+ }
+ code.IsNilableType = isNilableType(typ)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileMarshalText(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpMarshalText)
+ typ := ctx.typ
+ if !typ.Implements(marshalTextType) && runtime.PtrTo(typ).Implements(marshalTextType) {
+ code.AddrForMarshaler = true
+ }
+ code.IsNilableType = isNilableType(typ)
+ ctx.incIndex()
+ return code, nil
+}
+
+const intSize = 32 << (^uint(0) >> 63)
+
+func compileInt(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpInt)
+ code.setMaskAndRshiftNum(intSize)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileIntPtr(ctx *compileContext) (*Opcode, error) {
+ code, err := compileInt(ctx)
+ if err != nil {
+ return nil, err
+ }
+ code.Op = OpIntPtr
+ return code, nil
+}
+
+func compileInt8(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpInt)
+ code.setMaskAndRshiftNum(8)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileInt8Ptr(ctx *compileContext) (*Opcode, error) {
+ code, err := compileInt8(ctx)
+ if err != nil {
+ return nil, err
+ }
+ code.Op = OpIntPtr
+ return code, nil
+}
+
+func compileInt16(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpInt)
+ code.setMaskAndRshiftNum(16)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileInt16Ptr(ctx *compileContext) (*Opcode, error) {
+ code, err := compileInt16(ctx)
+ if err != nil {
+ return nil, err
+ }
+ code.Op = OpIntPtr
+ return code, nil
+}
+
+func compileInt32(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpInt)
+ code.setMaskAndRshiftNum(32)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileInt32Ptr(ctx *compileContext) (*Opcode, error) {
+ code, err := compileInt32(ctx)
+ if err != nil {
+ return nil, err
+ }
+ code.Op = OpIntPtr
+ return code, nil
+}
+
+func compileInt64(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpInt)
+ code.setMaskAndRshiftNum(64)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileInt64Ptr(ctx *compileContext) (*Opcode, error) {
+ code, err := compileInt64(ctx)
+ if err != nil {
+ return nil, err
+ }
+ code.Op = OpIntPtr
+ return code, nil
+}
+
+func compileUint(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpUint)
+ code.setMaskAndRshiftNum(intSize)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileUintPtr(ctx *compileContext) (*Opcode, error) {
+ code, err := compileUint(ctx)
+ if err != nil {
+ return nil, err
+ }
+ code.Op = OpUintPtr
+ return code, nil
+}
+
+func compileUint8(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpUint)
+ code.setMaskAndRshiftNum(8)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileUint8Ptr(ctx *compileContext) (*Opcode, error) {
+ code, err := compileUint8(ctx)
+ if err != nil {
+ return nil, err
+ }
+ code.Op = OpUintPtr
+ return code, nil
+}
+
+func compileUint16(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpUint)
+ code.setMaskAndRshiftNum(16)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileUint16Ptr(ctx *compileContext) (*Opcode, error) {
+ code, err := compileUint16(ctx)
+ if err != nil {
+ return nil, err
+ }
+ code.Op = OpUintPtr
+ return code, nil
+}
+
+func compileUint32(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpUint)
+ code.setMaskAndRshiftNum(32)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileUint32Ptr(ctx *compileContext) (*Opcode, error) {
+ code, err := compileUint32(ctx)
+ if err != nil {
+ return nil, err
+ }
+ code.Op = OpUintPtr
+ return code, nil
+}
+
+func compileUint64(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpUint)
+ code.setMaskAndRshiftNum(64)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileUint64Ptr(ctx *compileContext) (*Opcode, error) {
+ code, err := compileUint64(ctx)
+ if err != nil {
+ return nil, err
+ }
+ code.Op = OpUintPtr
+ return code, nil
+}
+
+func compileIntString(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpIntString)
+ code.setMaskAndRshiftNum(intSize)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileInt8String(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpIntString)
+ code.setMaskAndRshiftNum(8)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileInt16String(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpIntString)
+ code.setMaskAndRshiftNum(16)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileInt32String(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpIntString)
+ code.setMaskAndRshiftNum(32)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileInt64String(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpIntString)
+ code.setMaskAndRshiftNum(64)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileUintString(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpUintString)
+ code.setMaskAndRshiftNum(intSize)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileUint8String(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpUintString)
+ code.setMaskAndRshiftNum(8)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileUint16String(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpUintString)
+ code.setMaskAndRshiftNum(16)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileUint32String(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpUintString)
+ code.setMaskAndRshiftNum(32)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileUint64String(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpUintString)
+ code.setMaskAndRshiftNum(64)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileFloat32(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpFloat32)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileFloat32Ptr(ctx *compileContext) (*Opcode, error) {
+ code, err := compileFloat32(ctx)
+ if err != nil {
+ return nil, err
+ }
+ code.Op = OpFloat32Ptr
+ return code, nil
+}
+
+func compileFloat64(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpFloat64)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileFloat64Ptr(ctx *compileContext) (*Opcode, error) {
+ code, err := compileFloat64(ctx)
+ if err != nil {
+ return nil, err
+ }
+ code.Op = OpFloat64Ptr
+ return code, nil
+}
+
+func compileString(ctx *compileContext) (*Opcode, error) {
+ var op OpType
+ if ctx.typ == runtime.Type2RType(jsonNumberType) {
+ op = OpNumber
+ } else {
+ op = OpString
+ }
+ code := newOpCode(ctx, op)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileStringPtr(ctx *compileContext) (*Opcode, error) {
+ code, err := compileString(ctx)
+ if err != nil {
+ return nil, err
+ }
+ if code.Op == OpNumber {
+ code.Op = OpNumberPtr
+ } else {
+ code.Op = OpStringPtr
+ }
+ return code, nil
+}
+
+func compileBool(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpBool)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileBoolPtr(ctx *compileContext) (*Opcode, error) {
+ code, err := compileBool(ctx)
+ if err != nil {
+ return nil, err
+ }
+ code.Op = OpBoolPtr
+ return code, nil
+}
+
+func compileBytes(ctx *compileContext) (*Opcode, error) {
+ code := newOpCode(ctx, OpBytes)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileBytesPtr(ctx *compileContext) (*Opcode, error) {
+ code, err := compileBytes(ctx)
+ if err != nil {
+ return nil, err
+ }
+ code.Op = OpBytesPtr
+ return code, nil
+}
+
+func compileInterface(ctx *compileContext) (*Opcode, error) {
+ code := newInterfaceCode(ctx)
+ ctx.incIndex()
+ return code, nil
+}
+
+func compileInterfacePtr(ctx *compileContext) (*Opcode, error) {
+ code, err := compileInterface(ctx)
+ if err != nil {
+ return nil, err
+ }
+ code.Op = OpInterfacePtr
+ return code, nil
+}
+
+func compileSlice(ctx *compileContext) (*Opcode, error) {
+ elem := ctx.typ.Elem()
+ size := elem.Size()
+
+ header := newSliceHeaderCode(ctx)
+ ctx.incIndex()
+
+ code, err := compileListElem(ctx.withType(elem).incIndent())
+ if err != nil {
+ return nil, err
+ }
+ code.Indirect = true
+
+ // header => opcode => elem => end
+ // ^ |
+ // |________|
+
+ elemCode := newSliceElemCode(ctx, header, size)
+ ctx.incIndex()
+
+ end := newOpCode(ctx, OpSliceEnd)
+ ctx.incIndex()
+
+ header.Elem = elemCode
+ header.End = end
+ header.Next = code
+ code.BeforeLastCode().Next = (*Opcode)(unsafe.Pointer(elemCode))
+ elemCode.Next = code
+ elemCode.End = end
+ return (*Opcode)(unsafe.Pointer(header)), nil
+}
+
+func compileListElem(ctx *compileContext) (*Opcode, error) {
+ typ := ctx.typ
+ switch {
+ case !typ.Implements(marshalJSONType) && runtime.PtrTo(typ).Implements(marshalJSONType):
+ return compileMarshalJSON(ctx)
+ case !typ.Implements(marshalTextType) && runtime.PtrTo(typ).Implements(marshalTextType):
+ return compileMarshalText(ctx)
+ case typ.Kind() == reflect.Map:
+ return compilePtr(ctx.withType(runtime.PtrTo(typ)))
+ default:
+ code, err := compile(ctx, false)
+ if err != nil {
+ return nil, err
+ }
+ if code.Op == OpMapPtr {
+ code.PtrNum++
+ }
+ return code, nil
+ }
+}
+
+func compileArray(ctx *compileContext) (*Opcode, error) {
+ typ := ctx.typ
+ elem := typ.Elem()
+ alen := typ.Len()
+ size := elem.Size()
+
+ header := newArrayHeaderCode(ctx, alen)
+ ctx.incIndex()
+
+ code, err := compileListElem(ctx.withType(elem).incIndent())
+ if err != nil {
+ return nil, err
+ }
+ code.Indirect = true
+ // header => opcode => elem => end
+ // ^ |
+ // |________|
+
+ elemCode := newArrayElemCode(ctx, header, alen, size)
+ ctx.incIndex()
+
+ end := newOpCode(ctx, OpArrayEnd)
+ ctx.incIndex()
+
+ header.Elem = elemCode
+ header.End = end
+ header.Next = code
+ code.BeforeLastCode().Next = (*Opcode)(unsafe.Pointer(elemCode))
+ elemCode.Next = code
+ elemCode.End = end
+ return (*Opcode)(unsafe.Pointer(header)), nil
+}
+
+func compileMap(ctx *compileContext) (*Opcode, error) {
+ // header => code => value => code => key => code => value => code => end
+ // ^ |
+ // |_______________________|
+ ctx = ctx.incIndent()
+ header := newMapHeaderCode(ctx)
+ ctx.incIndex()
+
+ typ := ctx.typ
+ keyType := ctx.typ.Key()
+ keyCode, err := compileKey(ctx.withType(keyType))
+ if err != nil {
+ return nil, err
+ }
+
+ value := newMapValueCode(ctx, header)
+ ctx.incIndex()
+
+ valueCode, err := compileMapValue(ctx.withType(typ.Elem()))
+ if err != nil {
+ return nil, err
+ }
+ valueCode.Indirect = true
+
+ key := newMapKeyCode(ctx, header)
+ ctx.incIndex()
+
+ ctx = ctx.decIndent()
+
+ header.MapKey = key
+ header.MapValue = value
+
+ end := newMapEndCode(ctx, header)
+ ctx.incIndex()
+
+ header.Next = keyCode
+ keyCode.BeforeLastCode().Next = (*Opcode)(unsafe.Pointer(value))
+ value.Next = valueCode
+ valueCode.BeforeLastCode().Next = (*Opcode)(unsafe.Pointer(key))
+ key.Next = keyCode
+
+ header.End = end
+ key.End = end
+ value.End = end
+
+ return (*Opcode)(unsafe.Pointer(header)), nil
+}
+
+func compileMapValue(ctx *compileContext) (*Opcode, error) {
+ switch ctx.typ.Kind() {
+ case reflect.Map:
+ return compilePtr(ctx.withType(runtime.PtrTo(ctx.typ)))
+ default:
+ code, err := compile(ctx, false)
+ if err != nil {
+ return nil, err
+ }
+ if code.Op == OpMapPtr {
+ code.PtrNum++
+ }
+ return code, nil
+ }
+}
+
+func optimizeStructHeader(code *Opcode, tag *runtime.StructTag) OpType {
+ headType := code.ToHeaderType(tag.IsString)
+ if tag.IsOmitEmpty {
+ headType = headType.HeadToOmitEmptyHead()
+ }
+ return headType
+}
+
+func optimizeStructField(code *Opcode, tag *runtime.StructTag) OpType {
+ fieldType := code.ToFieldType(tag.IsString)
+ if tag.IsOmitEmpty {
+ fieldType = fieldType.FieldToOmitEmptyField()
+ }
+ return fieldType
+}
+
+func recursiveCode(ctx *compileContext, jmp *CompiledCode) *Opcode {
+ code := newRecursiveCode(ctx, jmp)
+ ctx.incIndex()
+ return code
+}
+
+func compiledCode(ctx *compileContext) *Opcode {
+ typ := ctx.typ
+ typeptr := uintptr(unsafe.Pointer(typ))
+ if cc, exists := ctx.structTypeToCompiledCode[typeptr]; exists {
+ return recursiveCode(ctx, cc)
+ }
+ return nil
+}
+
+func structHeader(ctx *compileContext, fieldCode *Opcode, valueCode *Opcode, tag *runtime.StructTag) *Opcode {
+ op := optimizeStructHeader(valueCode, tag)
+ fieldCode.Op = op
+ fieldCode.Mask = valueCode.Mask
+ fieldCode.RshiftNum = valueCode.RshiftNum
+ fieldCode.PtrNum = valueCode.PtrNum
+ if op.IsMultipleOpHead() {
+ return valueCode.BeforeLastCode()
+ }
+ ctx.decOpcodeIndex()
+ return fieldCode
+}
+
+func structField(ctx *compileContext, fieldCode *Opcode, valueCode *Opcode, tag *runtime.StructTag) *Opcode {
+ op := optimizeStructField(valueCode, tag)
+ fieldCode.Op = op
+ fieldCode.PtrNum = valueCode.PtrNum
+ fieldCode.Mask = valueCode.Mask
+ fieldCode.RshiftNum = valueCode.RshiftNum
+ if op.IsMultipleOpField() {
+ return valueCode.BeforeLastCode()
+ }
+ ctx.decIndex()
+ return fieldCode
+}
+
+func isNotExistsField(head *Opcode) bool {
+ if head == nil {
+ return false
+ }
+ if head.Op != OpStructHead {
+ return false
+ }
+ if !head.AnonymousHead {
+ return false
+ }
+ if head.Next == nil {
+ return false
+ }
+ if head.NextField == nil {
+ return false
+ }
+ if head.NextField.Op != OpStructAnonymousEnd {
+ return false
+ }
+ if head.Next.Op == OpStructAnonymousEnd {
+ return true
+ }
+ if head.Next.Op.CodeType() != CodeStructField {
+ return false
+ }
+ return isNotExistsField(head.Next)
+}
+
+func optimizeAnonymousFields(head *Opcode) {
+ code := head
+ var prev *Opcode
+ removedFields := map[*Opcode]struct{}{}
+ for {
+ if code.Op == OpStructEnd {
+ break
+ }
+ if code.Op == OpStructField {
+ codeType := code.Next.Op.CodeType()
+ if codeType == CodeStructField {
+ if isNotExistsField(code.Next) {
+ code.Next = code.NextField
+ diff := code.Next.DisplayIdx - code.DisplayIdx
+ for i := 0; i < diff; i++ {
+ code.Next.decOpcodeIndex()
+ }
+ linkPrevToNextField(code, removedFields)
+ code = prev
+ }
+ }
+ }
+ prev = code
+ code = code.NextField
+ }
+}
+
+type structFieldPair struct {
+ prevField *Opcode
+ curField *Opcode
+ isTaggedKey bool
+ linked bool
+}
+
+func anonymousStructFieldPairMap(tags runtime.StructTags, named string, valueCode *Opcode) map[string][]structFieldPair {
+ anonymousFields := map[string][]structFieldPair{}
+ f := valueCode
+ var prevAnonymousField *Opcode
+ removedFields := map[*Opcode]struct{}{}
+ for {
+ existsKey := tags.ExistsKey(f.DisplayKey)
+ isHeadOp := strings.Contains(f.Op.String(), "Head")
+ if existsKey && f.Next != nil && strings.Contains(f.Next.Op.String(), "Recursive") {
+ // through
+ } else if isHeadOp && !f.AnonymousHead {
+ if existsKey {
+ // TODO: need to remove this head
+ f.Op = OpStructHead
+ f.AnonymousKey = true
+ f.AnonymousHead = true
+ } else if named == "" {
+ f.AnonymousHead = true
+ }
+ } else if named == "" && f.Op == OpStructEnd {
+ f.Op = OpStructAnonymousEnd
+ } else if existsKey {
+ diff := f.NextField.DisplayIdx - f.DisplayIdx
+ for i := 0; i < diff; i++ {
+ f.NextField.decOpcodeIndex()
+ }
+ linkPrevToNextField(f, removedFields)
+ }
+
+ if f.DisplayKey == "" {
+ if f.NextField == nil {
+ break
+ }
+ prevAnonymousField = f
+ f = f.NextField
+ continue
+ }
+
+ key := fmt.Sprintf("%s.%s", named, f.DisplayKey)
+ anonymousFields[key] = append(anonymousFields[key], structFieldPair{
+ prevField: prevAnonymousField,
+ curField: f,
+ isTaggedKey: f.IsTaggedKey,
+ })
+ if f.Next != nil && f.NextField != f.Next && f.Next.Op.CodeType() == CodeStructField {
+ for k, v := range anonymousFieldPairRecursively(named, f.Next) {
+ anonymousFields[k] = append(anonymousFields[k], v...)
+ }
+ }
+ if f.NextField == nil {
+ break
+ }
+ prevAnonymousField = f
+ f = f.NextField
+ }
+ return anonymousFields
+}
+
+func anonymousFieldPairRecursively(named string, valueCode *Opcode) map[string][]structFieldPair {
+ anonymousFields := map[string][]structFieldPair{}
+ f := valueCode
+ var prevAnonymousField *Opcode
+ for {
+ if f.DisplayKey != "" && f.AnonymousHead {
+ key := fmt.Sprintf("%s.%s", named, f.DisplayKey)
+ anonymousFields[key] = append(anonymousFields[key], structFieldPair{
+ prevField: prevAnonymousField,
+ curField: f,
+ isTaggedKey: f.IsTaggedKey,
+ })
+ if f.Next != nil && f.NextField != f.Next && f.Next.Op.CodeType() == CodeStructField {
+ for k, v := range anonymousFieldPairRecursively(named, f.Next) {
+ anonymousFields[k] = append(anonymousFields[k], v...)
+ }
+ }
+ }
+ if f.NextField == nil {
+ break
+ }
+ prevAnonymousField = f
+ f = f.NextField
+ }
+ return anonymousFields
+}
+
+func optimizeConflictAnonymousFields(anonymousFields map[string][]structFieldPair) {
+ removedFields := map[*Opcode]struct{}{}
+ for _, fieldPairs := range anonymousFields {
+ if len(fieldPairs) == 1 {
+ continue
+ }
+ // conflict anonymous fields
+ taggedPairs := []structFieldPair{}
+ for _, fieldPair := range fieldPairs {
+ if fieldPair.isTaggedKey {
+ taggedPairs = append(taggedPairs, fieldPair)
+ } else {
+ if !fieldPair.linked {
+ if fieldPair.prevField == nil {
+ // head operation
+ fieldPair.curField.Op = OpStructHead
+ fieldPair.curField.AnonymousHead = true
+ fieldPair.curField.AnonymousKey = true
+ } else {
+ diff := fieldPair.curField.NextField.DisplayIdx - fieldPair.curField.DisplayIdx
+ for i := 0; i < diff; i++ {
+ fieldPair.curField.NextField.decOpcodeIndex()
+ }
+ removedFields[fieldPair.curField] = struct{}{}
+ linkPrevToNextField(fieldPair.curField, removedFields)
+ }
+ fieldPair.linked = true
+ }
+ }
+ }
+ if len(taggedPairs) > 1 {
+ for _, fieldPair := range taggedPairs {
+ if !fieldPair.linked {
+ if fieldPair.prevField == nil {
+ // head operation
+ fieldPair.curField.Op = OpStructHead
+ fieldPair.curField.AnonymousHead = true
+ fieldPair.curField.AnonymousKey = true
+ } else {
+ diff := fieldPair.curField.NextField.DisplayIdx - fieldPair.curField.DisplayIdx
+ removedFields[fieldPair.curField] = struct{}{}
+ for i := 0; i < diff; i++ {
+ fieldPair.curField.NextField.decOpcodeIndex()
+ }
+ linkPrevToNextField(fieldPair.curField, removedFields)
+ }
+ fieldPair.linked = true
+ }
+ }
+ } else {
+ for _, fieldPair := range taggedPairs {
+ fieldPair.curField.IsTaggedKey = false
+ }
+ }
+ }
+}
+
+func isNilableType(typ *runtime.Type) bool {
+ switch typ.Kind() {
+ case reflect.Ptr:
+ return true
+ case reflect.Map:
+ return true
+ case reflect.Func:
+ return true
+ default:
+ return false
+ }
+}
+
+func compileStruct(ctx *compileContext, isPtr bool) (*Opcode, error) {
+ if code := compiledCode(ctx); code != nil {
+ return code, nil
+ }
+ typ := ctx.typ
+ typeptr := uintptr(unsafe.Pointer(typ))
+ compiled := &CompiledCode{}
+ ctx.structTypeToCompiledCode[typeptr] = compiled
+ // header => code => structField => code => end
+ // ^ |
+ // |__________|
+ fieldNum := typ.NumField()
+ indirect := runtime.IfaceIndir(typ)
+ fieldIdx := 0
+ disableIndirectConversion := false
+ var (
+ head *Opcode
+ code *Opcode
+ prevField *Opcode
+ )
+ ctx = ctx.incIndent()
+ tags := runtime.StructTags{}
+ anonymousFields := map[string][]structFieldPair{}
+ for i := 0; i < fieldNum; i++ {
+ field := typ.Field(i)
+ if runtime.IsIgnoredStructField(field) {
+ continue
+ }
+ tags = append(tags, runtime.StructTagFromField(field))
+ }
+ for i, tag := range tags {
+ field := tag.Field
+ fieldType := runtime.Type2RType(field.Type)
+ fieldOpcodeIndex := ctx.opcodeIndex
+ fieldPtrIndex := ctx.ptrIndex
+ ctx.incIndex()
+
+ nilcheck := true
+ addrForMarshaler := false
+ isIndirectSpecialCase := isPtr && i == 0 && fieldNum == 1
+ isNilableType := isNilableType(fieldType)
+
+ var valueCode *Opcode
+ switch {
+ case isIndirectSpecialCase && !isNilableType && isPtrMarshalJSONType(fieldType):
+ // *struct{ field T } => struct { field *T }
+ // func (*T) MarshalJSON() ([]byte, error)
+ // move pointer position from head to first field
+ code, err := compileMarshalJSON(ctx.withType(fieldType))
+ if err != nil {
+ return nil, err
+ }
+ addrForMarshaler = true
+ valueCode = code
+ nilcheck = false
+ indirect = false
+ disableIndirectConversion = true
+ case isIndirectSpecialCase && !isNilableType && isPtrMarshalTextType(fieldType):
+ // *struct{ field T } => struct { field *T }
+ // func (*T) MarshalText() ([]byte, error)
+ // move pointer position from head to first field
+ code, err := compileMarshalText(ctx.withType(fieldType))
+ if err != nil {
+ return nil, err
+ }
+ addrForMarshaler = true
+ valueCode = code
+ nilcheck = false
+ indirect = false
+ disableIndirectConversion = true
+ case isPtr && isPtrMarshalJSONType(fieldType):
+ // *struct{ field T }
+ // func (*T) MarshalJSON() ([]byte, error)
+ code, err := compileMarshalJSON(ctx.withType(fieldType))
+ if err != nil {
+ return nil, err
+ }
+ addrForMarshaler = true
+ nilcheck = false
+ valueCode = code
+ case isPtr && isPtrMarshalTextType(fieldType):
+ // *struct{ field T }
+ // func (*T) MarshalText() ([]byte, error)
+ code, err := compileMarshalText(ctx.withType(fieldType))
+ if err != nil {
+ return nil, err
+ }
+ addrForMarshaler = true
+ nilcheck = false
+ valueCode = code
+ default:
+ code, err := compile(ctx.withType(fieldType), isPtr)
+ if err != nil {
+ return nil, err
+ }
+ valueCode = code
+ }
+
+ if field.Anonymous {
+ tagKey := ""
+ if tag.IsTaggedKey {
+ tagKey = tag.Key
+ }
+ for k, v := range anonymousStructFieldPairMap(tags, tagKey, valueCode) {
+ anonymousFields[k] = append(anonymousFields[k], v...)
+ }
+ valueCode.decIndent()
+
+ // fix issue144
+ if !(isPtr && strings.Contains(valueCode.Op.String(), "Marshal")) {
+ valueCode.Indirect = indirect
+ }
+ } else {
+ if indirect {
+ // if parent is indirect type, set child indirect property to true
+ valueCode.Indirect = indirect
+ } else {
+ // if parent is not indirect type and child have only one field, set child indirect property to false
+ if i == 0 && valueCode.NextField != nil && valueCode.NextField.Op == OpStructEnd {
+ valueCode.Indirect = indirect
+ }
+ }
+ }
+ key := fmt.Sprintf(`"%s":`, tag.Key)
+ escapedKey := fmt.Sprintf(`%s:`, string(AppendEscapedString([]byte{}, tag.Key)))
+ fieldCode := &Opcode{
+ Type: valueCode.Type,
+ DisplayIdx: fieldOpcodeIndex,
+ Idx: opcodeOffset(fieldPtrIndex),
+ Next: valueCode,
+ Indent: ctx.indent,
+ AnonymousKey: field.Anonymous,
+ Key: []byte(key),
+ EscapedKey: []byte(escapedKey),
+ IsTaggedKey: tag.IsTaggedKey,
+ DisplayKey: tag.Key,
+ Offset: field.Offset,
+ Indirect: indirect,
+ Nilcheck: nilcheck,
+ AddrForMarshaler: addrForMarshaler,
+ IsNextOpPtrType: strings.Contains(valueCode.Op.String(), "Ptr") || valueCode.Op == OpInterface,
+ IsNilableType: isNilableType,
+ }
+ if fieldIdx == 0 {
+ fieldCode.HeadIdx = fieldCode.Idx
+ code = structHeader(ctx, fieldCode, valueCode, tag)
+ head = fieldCode
+ prevField = fieldCode
+ } else {
+ fieldCode.HeadIdx = head.HeadIdx
+ code.Next = fieldCode
+ code = structField(ctx, fieldCode, valueCode, tag)
+ prevField.NextField = fieldCode
+ fieldCode.PrevField = prevField
+ prevField = fieldCode
+ }
+ fieldIdx++
+ }
+
+ structEndCode := &Opcode{
+ Op: OpStructEnd,
+ Type: nil,
+ Indent: ctx.indent,
+ Next: newEndOp(ctx),
+ }
+
+ ctx = ctx.decIndent()
+
+ // no struct field
+ if head == nil {
+ head = &Opcode{
+ Op: OpStructHead,
+ Type: typ,
+ DisplayIdx: ctx.opcodeIndex,
+ Idx: opcodeOffset(ctx.ptrIndex),
+ HeadIdx: opcodeOffset(ctx.ptrIndex),
+ Indent: ctx.indent,
+ NextField: structEndCode,
+ }
+ structEndCode.PrevField = head
+ ctx.incIndex()
+ code = head
+ }
+
+ structEndCode.DisplayIdx = ctx.opcodeIndex
+ structEndCode.Idx = opcodeOffset(ctx.ptrIndex)
+ ctx.incIndex()
+
+ if prevField != nil && prevField.NextField == nil {
+ prevField.NextField = structEndCode
+ structEndCode.PrevField = prevField
+ }
+
+ head.End = structEndCode
+ code.Next = structEndCode
+ optimizeConflictAnonymousFields(anonymousFields)
+ optimizeAnonymousFields(head)
+ ret := (*Opcode)(unsafe.Pointer(head))
+ compiled.Code = ret
+
+ delete(ctx.structTypeToCompiledCode, typeptr)
+
+ if !disableIndirectConversion && !head.Indirect && isPtr {
+ head.Indirect = true
+ }
+
+ return ret, nil
+}
+
+func isPtrMarshalJSONType(typ *runtime.Type) bool {
+ return !typ.Implements(marshalJSONType) && runtime.PtrTo(typ).Implements(marshalJSONType)
+}
+
+func isPtrMarshalTextType(typ *runtime.Type) bool {
+ return !typ.Implements(marshalTextType) && runtime.PtrTo(typ).Implements(marshalTextType)
+}
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/compiler_norace.go b/vendor/github.com/goccy/go-json/internal/encoder/compiler_norace.go
new file mode 100644
index 000000000..acc2658b5
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/compiler_norace.go
@@ -0,0 +1,39 @@
+// +build !race
+
+package encoder
+
+import (
+ "unsafe"
+
+ "github.com/goccy/go-json/internal/runtime"
+)
+
+func CompileToGetCodeSet(typeptr uintptr) (*OpcodeSet, error) {
+ if typeptr > typeAddr.MaxTypeAddr {
+ return compileToGetCodeSetSlowPath(typeptr)
+ }
+ index := (typeptr - typeAddr.BaseTypeAddr) >> typeAddr.AddrShift
+ if codeSet := cachedOpcodeSets[index]; codeSet != nil {
+ return codeSet, nil
+ }
+
+ // noescape trick for header.typ ( reflect.*rtype )
+ copiedType := *(**runtime.Type)(unsafe.Pointer(&typeptr))
+
+ code, err := compileHead(&compileContext{
+ typ: copiedType,
+ structTypeToCompiledCode: map[uintptr]*CompiledCode{},
+ })
+ if err != nil {
+ return nil, err
+ }
+ code = copyOpcode(code)
+ codeLength := code.TotalLength()
+ codeSet := &OpcodeSet{
+ Type: copiedType,
+ Code: code,
+ CodeLength: codeLength,
+ }
+ cachedOpcodeSets[index] = codeSet
+ return codeSet, nil
+}
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/compiler_race.go b/vendor/github.com/goccy/go-json/internal/encoder/compiler_race.go
new file mode 100644
index 000000000..63b7733e0
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/compiler_race.go
@@ -0,0 +1,47 @@
+// +build race
+
+package encoder
+
+import (
+ "sync"
+ "unsafe"
+
+ "github.com/goccy/go-json/internal/runtime"
+)
+
+var setsMu sync.RWMutex
+
+func CompileToGetCodeSet(typeptr uintptr) (*OpcodeSet, error) {
+ if typeptr > typeAddr.MaxTypeAddr {
+ return compileToGetCodeSetSlowPath(typeptr)
+ }
+ index := (typeptr - typeAddr.BaseTypeAddr) >> typeAddr.AddrShift
+ setsMu.RLock()
+ if codeSet := cachedOpcodeSets[index]; codeSet != nil {
+ setsMu.RUnlock()
+ return codeSet, nil
+ }
+ setsMu.RUnlock()
+
+ // noescape trick for header.typ ( reflect.*rtype )
+ copiedType := *(**runtime.Type)(unsafe.Pointer(&typeptr))
+
+ code, err := compileHead(&compileContext{
+ typ: copiedType,
+ structTypeToCompiledCode: map[uintptr]*CompiledCode{},
+ })
+ if err != nil {
+ return nil, err
+ }
+ code = copyOpcode(code)
+ codeLength := code.TotalLength()
+ codeSet := &OpcodeSet{
+ Type: copiedType,
+ Code: code,
+ CodeLength: codeLength,
+ }
+ setsMu.Lock()
+ cachedOpcodeSets[index] = codeSet
+ setsMu.Unlock()
+ return codeSet, nil
+}
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/context.go b/vendor/github.com/goccy/go-json/internal/encoder/context.go
new file mode 100644
index 000000000..d7e030eaa
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/context.go
@@ -0,0 +1,135 @@
+package encoder
+
+import (
+ "sync"
+ "unsafe"
+
+ "github.com/goccy/go-json/internal/runtime"
+)
+
+type compileContext struct {
+ typ *runtime.Type
+ opcodeIndex int
+ ptrIndex int
+ indent int
+ structTypeToCompiledCode map[uintptr]*CompiledCode
+
+ parent *compileContext
+}
+
+func (c *compileContext) context() *compileContext {
+ return &compileContext{
+ typ: c.typ,
+ opcodeIndex: c.opcodeIndex,
+ ptrIndex: c.ptrIndex,
+ indent: c.indent,
+ structTypeToCompiledCode: c.structTypeToCompiledCode,
+ parent: c,
+ }
+}
+
+func (c *compileContext) withType(typ *runtime.Type) *compileContext {
+ ctx := c.context()
+ ctx.typ = typ
+ return ctx
+}
+
+func (c *compileContext) incIndent() *compileContext {
+ ctx := c.context()
+ ctx.indent++
+ return ctx
+}
+
+func (c *compileContext) decIndent() *compileContext {
+ ctx := c.context()
+ ctx.indent--
+ return ctx
+}
+
+func (c *compileContext) incIndex() {
+ c.incOpcodeIndex()
+ c.incPtrIndex()
+}
+
+func (c *compileContext) decIndex() {
+ c.decOpcodeIndex()
+ c.decPtrIndex()
+}
+
+func (c *compileContext) incOpcodeIndex() {
+ c.opcodeIndex++
+ if c.parent != nil {
+ c.parent.incOpcodeIndex()
+ }
+}
+
+func (c *compileContext) decOpcodeIndex() {
+ c.opcodeIndex--
+ if c.parent != nil {
+ c.parent.decOpcodeIndex()
+ }
+}
+
+func (c *compileContext) incPtrIndex() {
+ c.ptrIndex++
+ if c.parent != nil {
+ c.parent.incPtrIndex()
+ }
+}
+
+func (c *compileContext) decPtrIndex() {
+ c.ptrIndex--
+ if c.parent != nil {
+ c.parent.decPtrIndex()
+ }
+}
+
+const (
+ bufSize = 1024
+)
+
+var (
+ runtimeContextPool = sync.Pool{
+ New: func() interface{} {
+ return &RuntimeContext{
+ Buf: make([]byte, 0, bufSize),
+ Ptrs: make([]uintptr, 128),
+ KeepRefs: make([]unsafe.Pointer, 0, 8),
+ }
+ },
+ }
+)
+
+type RuntimeContext struct {
+ Buf []byte
+ MarshalBuf []byte
+ Ptrs []uintptr
+ KeepRefs []unsafe.Pointer
+ SeenPtr []uintptr
+ BaseIndent int
+ Prefix []byte
+ IndentStr []byte
+}
+
+func (c *RuntimeContext) Init(p uintptr, codelen int) {
+ if len(c.Ptrs) < codelen {
+ c.Ptrs = make([]uintptr, codelen)
+ }
+ c.Ptrs[0] = p
+ c.KeepRefs = c.KeepRefs[:0]
+ c.SeenPtr = c.SeenPtr[:0]
+ c.BaseIndent = 0
+}
+
+func (c *RuntimeContext) Ptr() uintptr {
+ header := (*runtime.SliceHeader)(unsafe.Pointer(&c.Ptrs))
+ return uintptr(header.Data)
+}
+
+func TakeRuntimeContext() *RuntimeContext {
+ return runtimeContextPool.Get().(*RuntimeContext)
+}
+
+func ReleaseRuntimeContext(ctx *RuntimeContext) {
+ runtimeContextPool.Put(ctx)
+}
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/encoder.go b/vendor/github.com/goccy/go-json/internal/encoder/encoder.go
new file mode 100644
index 000000000..ef6b910ad
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/encoder.go
@@ -0,0 +1,533 @@
+package encoder
+
+import (
+ "bytes"
+ "encoding"
+ "encoding/base64"
+ "encoding/json"
+ "fmt"
+ "math"
+ "reflect"
+ "strconv"
+ "strings"
+ "sync"
+ "unsafe"
+
+ "github.com/goccy/go-json/internal/errors"
+ "github.com/goccy/go-json/internal/runtime"
+)
+
+type Option int
+
+const (
+ HTMLEscapeOption Option = 1 << iota
+ IndentOption
+ UnorderedMapOption
+)
+
+func (t OpType) IsMultipleOpHead() bool {
+ switch t {
+ case OpStructHead:
+ return true
+ case OpStructHeadSlice:
+ return true
+ case OpStructHeadArray:
+ return true
+ case OpStructHeadMap:
+ return true
+ case OpStructHeadStruct:
+ return true
+ case OpStructHeadOmitEmpty:
+ return true
+ case OpStructHeadOmitEmptySlice:
+ return true
+ case OpStructHeadOmitEmptyArray:
+ return true
+ case OpStructHeadOmitEmptyMap:
+ return true
+ case OpStructHeadOmitEmptyStruct:
+ return true
+ case OpStructHeadSlicePtr:
+ return true
+ case OpStructHeadOmitEmptySlicePtr:
+ return true
+ case OpStructHeadArrayPtr:
+ return true
+ case OpStructHeadOmitEmptyArrayPtr:
+ return true
+ case OpStructHeadMapPtr:
+ return true
+ case OpStructHeadOmitEmptyMapPtr:
+ return true
+ }
+ return false
+}
+
+func (t OpType) IsMultipleOpField() bool {
+ switch t {
+ case OpStructField:
+ return true
+ case OpStructFieldSlice:
+ return true
+ case OpStructFieldArray:
+ return true
+ case OpStructFieldMap:
+ return true
+ case OpStructFieldStruct:
+ return true
+ case OpStructFieldOmitEmpty:
+ return true
+ case OpStructFieldOmitEmptySlice:
+ return true
+ case OpStructFieldOmitEmptyArray:
+ return true
+ case OpStructFieldOmitEmptyMap:
+ return true
+ case OpStructFieldOmitEmptyStruct:
+ return true
+ case OpStructFieldSlicePtr:
+ return true
+ case OpStructFieldOmitEmptySlicePtr:
+ return true
+ case OpStructFieldArrayPtr:
+ return true
+ case OpStructFieldOmitEmptyArrayPtr:
+ return true
+ case OpStructFieldMapPtr:
+ return true
+ case OpStructFieldOmitEmptyMapPtr:
+ return true
+ }
+ return false
+}
+
+type OpcodeSet struct {
+ Type *runtime.Type
+ Code *Opcode
+ CodeLength int
+}
+
+type CompiledCode struct {
+ Code *Opcode
+ Linked bool // whether recursive code already have linked
+ CurLen uintptr
+ NextLen uintptr
+}
+
+const StartDetectingCyclesAfter = 1000
+
+func Load(base uintptr, idx uintptr) uintptr {
+ addr := base + idx
+ return **(**uintptr)(unsafe.Pointer(&addr))
+}
+
+func Store(base uintptr, idx uintptr, p uintptr) {
+ addr := base + idx
+ **(**uintptr)(unsafe.Pointer(&addr)) = p
+}
+
+func LoadNPtr(base uintptr, idx uintptr, ptrNum int) uintptr {
+ addr := base + idx
+ p := **(**uintptr)(unsafe.Pointer(&addr))
+ if p == 0 {
+ return 0
+ }
+ return PtrToPtr(p)
+ /*
+ for i := 0; i < ptrNum; i++ {
+ if p == 0 {
+ return p
+ }
+ p = PtrToPtr(p)
+ }
+ return p
+ */
+}
+
+func PtrToUint64(p uintptr) uint64 { return **(**uint64)(unsafe.Pointer(&p)) }
+func PtrToFloat32(p uintptr) float32 { return **(**float32)(unsafe.Pointer(&p)) }
+func PtrToFloat64(p uintptr) float64 { return **(**float64)(unsafe.Pointer(&p)) }
+func PtrToBool(p uintptr) bool { return **(**bool)(unsafe.Pointer(&p)) }
+func PtrToBytes(p uintptr) []byte { return **(**[]byte)(unsafe.Pointer(&p)) }
+func PtrToNumber(p uintptr) json.Number { return **(**json.Number)(unsafe.Pointer(&p)) }
+func PtrToString(p uintptr) string { return **(**string)(unsafe.Pointer(&p)) }
+func PtrToSlice(p uintptr) *runtime.SliceHeader { return *(**runtime.SliceHeader)(unsafe.Pointer(&p)) }
+func PtrToPtr(p uintptr) uintptr {
+ return uintptr(**(**unsafe.Pointer)(unsafe.Pointer(&p)))
+}
+func PtrToNPtr(p uintptr, ptrNum int) uintptr {
+ for i := 0; i < ptrNum; i++ {
+ if p == 0 {
+ return 0
+ }
+ p = PtrToPtr(p)
+ }
+ return p
+}
+
+func PtrToUnsafePtr(p uintptr) unsafe.Pointer {
+ return *(*unsafe.Pointer)(unsafe.Pointer(&p))
+}
+func PtrToInterface(code *Opcode, p uintptr) interface{} {
+ return *(*interface{})(unsafe.Pointer(&emptyInterface{
+ typ: code.Type,
+ ptr: *(*unsafe.Pointer)(unsafe.Pointer(&p)),
+ }))
+}
+
+func ErrUnsupportedValue(code *Opcode, ptr uintptr) *errors.UnsupportedValueError {
+ v := *(*interface{})(unsafe.Pointer(&emptyInterface{
+ typ: code.Type,
+ ptr: *(*unsafe.Pointer)(unsafe.Pointer(&ptr)),
+ }))
+ return &errors.UnsupportedValueError{
+ Value: reflect.ValueOf(v),
+ Str: fmt.Sprintf("encountered a cycle via %s", code.Type),
+ }
+}
+
+func ErrUnsupportedFloat(v float64) *errors.UnsupportedValueError {
+ return &errors.UnsupportedValueError{
+ Value: reflect.ValueOf(v),
+ Str: strconv.FormatFloat(v, 'g', -1, 64),
+ }
+}
+
+func ErrMarshalerWithCode(code *Opcode, err error) *errors.MarshalerError {
+ return &errors.MarshalerError{
+ Type: runtime.RType2Type(code.Type),
+ Err: err,
+ }
+}
+
+type emptyInterface struct {
+ typ *runtime.Type
+ ptr unsafe.Pointer
+}
+
+type MapItem struct {
+ Key []byte
+ Value []byte
+}
+
+type Mapslice struct {
+ Items []MapItem
+}
+
+func (m *Mapslice) Len() int {
+ return len(m.Items)
+}
+
+func (m *Mapslice) Less(i, j int) bool {
+ return bytes.Compare(m.Items[i].Key, m.Items[j].Key) < 0
+}
+
+func (m *Mapslice) Swap(i, j int) {
+ m.Items[i], m.Items[j] = m.Items[j], m.Items[i]
+}
+
+type MapContext struct {
+ Pos []int
+ Slice *Mapslice
+ Buf []byte
+}
+
+var mapContextPool = sync.Pool{
+ New: func() interface{} {
+ return &MapContext{}
+ },
+}
+
+func NewMapContext(mapLen int) *MapContext {
+ ctx := mapContextPool.Get().(*MapContext)
+ if ctx.Slice == nil {
+ ctx.Slice = &Mapslice{
+ Items: make([]MapItem, 0, mapLen),
+ }
+ }
+ if cap(ctx.Pos) < (mapLen*2 + 1) {
+ ctx.Pos = make([]int, 0, mapLen*2+1)
+ ctx.Slice.Items = make([]MapItem, 0, mapLen)
+ } else {
+ ctx.Pos = ctx.Pos[:0]
+ ctx.Slice.Items = ctx.Slice.Items[:0]
+ }
+ ctx.Buf = ctx.Buf[:0]
+ return ctx
+}
+
+func ReleaseMapContext(c *MapContext) {
+ mapContextPool.Put(c)
+}
+
+//go:linkname MapIterInit reflect.mapiterinit
+//go:noescape
+func MapIterInit(mapType *runtime.Type, m unsafe.Pointer) unsafe.Pointer
+
+//go:linkname MapIterKey reflect.mapiterkey
+//go:noescape
+func MapIterKey(it unsafe.Pointer) unsafe.Pointer
+
+//go:linkname MapIterNext reflect.mapiternext
+//go:noescape
+func MapIterNext(it unsafe.Pointer)
+
+//go:linkname MapLen reflect.maplen
+//go:noescape
+func MapLen(m unsafe.Pointer) int
+
+func AppendByteSlice(b []byte, src []byte) []byte {
+ if src == nil {
+ return append(b, `null`...)
+ }
+ encodedLen := base64.StdEncoding.EncodedLen(len(src))
+ b = append(b, '"')
+ pos := len(b)
+ remainLen := cap(b[pos:])
+ var buf []byte
+ if remainLen > encodedLen {
+ buf = b[pos : pos+encodedLen]
+ } else {
+ buf = make([]byte, encodedLen)
+ }
+ base64.StdEncoding.Encode(buf, src)
+ return append(append(b, buf...), '"')
+}
+
+func AppendFloat32(b []byte, v float32) []byte {
+ f64 := float64(v)
+ abs := math.Abs(f64)
+ fmt := byte('f')
+ // Note: Must use float32 comparisons for underlying float32 value to get precise cutoffs right.
+ if abs != 0 {
+ f32 := float32(abs)
+ if f32 < 1e-6 || f32 >= 1e21 {
+ fmt = 'e'
+ }
+ }
+ return strconv.AppendFloat(b, f64, fmt, -1, 32)
+}
+
+func AppendFloat64(b []byte, v float64) []byte {
+ abs := math.Abs(v)
+ fmt := byte('f')
+ // Note: Must use float32 comparisons for underlying float32 value to get precise cutoffs right.
+ if abs != 0 {
+ if abs < 1e-6 || abs >= 1e21 {
+ fmt = 'e'
+ }
+ }
+ return strconv.AppendFloat(b, v, fmt, -1, 64)
+}
+
+func AppendBool(b []byte, v bool) []byte {
+ if v {
+ return append(b, "true"...)
+ }
+ return append(b, "false"...)
+}
+
+var (
+ floatTable = [256]bool{
+ '0': true,
+ '1': true,
+ '2': true,
+ '3': true,
+ '4': true,
+ '5': true,
+ '6': true,
+ '7': true,
+ '8': true,
+ '9': true,
+ '.': true,
+ 'e': true,
+ 'E': true,
+ '+': true,
+ '-': true,
+ }
+)
+
+func AppendNumber(b []byte, n json.Number) ([]byte, error) {
+ if len(n) == 0 {
+ return append(b, '0'), nil
+ }
+ for i := 0; i < len(n); i++ {
+ if !floatTable[n[i]] {
+ return nil, fmt.Errorf("json: invalid number literal %q", n)
+ }
+ }
+ b = append(b, n...)
+ return b, nil
+}
+
+func AppendMarshalJSON(ctx *RuntimeContext, code *Opcode, b []byte, v interface{}, escape bool) ([]byte, error) {
+ rv := reflect.ValueOf(v) // convert by dynamic interface type
+ if code.AddrForMarshaler {
+ if rv.CanAddr() {
+ rv = rv.Addr()
+ } else {
+ newV := reflect.New(rv.Type())
+ newV.Elem().Set(rv)
+ rv = newV
+ }
+ }
+ v = rv.Interface()
+ marshaler, ok := v.(json.Marshaler)
+ if !ok {
+ return AppendNull(b), nil
+ }
+ bb, err := marshaler.MarshalJSON()
+ if err != nil {
+ return nil, &errors.MarshalerError{Type: reflect.TypeOf(v), Err: err}
+ }
+ marshalBuf := ctx.MarshalBuf[:0]
+ marshalBuf = append(append(marshalBuf, bb...), nul)
+ compactedBuf, err := compact(b, marshalBuf, escape)
+ if err != nil {
+ return nil, &errors.MarshalerError{Type: reflect.TypeOf(v), Err: err}
+ }
+ ctx.MarshalBuf = marshalBuf
+ return compactedBuf, nil
+}
+
+func AppendMarshalJSONIndent(ctx *RuntimeContext, code *Opcode, b []byte, v interface{}, escape bool) ([]byte, error) {
+ rv := reflect.ValueOf(v) // convert by dynamic interface type
+ if code.AddrForMarshaler {
+ if rv.CanAddr() {
+ rv = rv.Addr()
+ } else {
+ newV := reflect.New(rv.Type())
+ newV.Elem().Set(rv)
+ rv = newV
+ }
+ }
+ v = rv.Interface()
+ marshaler, ok := v.(json.Marshaler)
+ if !ok {
+ return AppendNull(b), nil
+ }
+ bb, err := marshaler.MarshalJSON()
+ if err != nil {
+ return nil, &errors.MarshalerError{Type: reflect.TypeOf(v), Err: err}
+ }
+ marshalBuf := ctx.MarshalBuf[:0]
+ marshalBuf = append(append(marshalBuf, bb...), nul)
+ indentedBuf, err := doIndent(
+ b,
+ marshalBuf,
+ string(ctx.Prefix)+strings.Repeat(string(ctx.IndentStr), ctx.BaseIndent+code.Indent),
+ string(ctx.IndentStr),
+ escape,
+ )
+ if err != nil {
+ return nil, &errors.MarshalerError{Type: reflect.TypeOf(v), Err: err}
+ }
+ ctx.MarshalBuf = marshalBuf
+ return indentedBuf, nil
+}
+
+func AppendMarshalText(code *Opcode, b []byte, v interface{}, escape bool) ([]byte, error) {
+ rv := reflect.ValueOf(v) // convert by dynamic interface type
+ if code.AddrForMarshaler {
+ if rv.CanAddr() {
+ rv = rv.Addr()
+ } else {
+ newV := reflect.New(rv.Type())
+ newV.Elem().Set(rv)
+ rv = newV
+ }
+ }
+ v = rv.Interface()
+ marshaler, ok := v.(encoding.TextMarshaler)
+ if !ok {
+ return AppendNull(b), nil
+ }
+ bytes, err := marshaler.MarshalText()
+ if err != nil {
+ return nil, &errors.MarshalerError{Type: reflect.TypeOf(v), Err: err}
+ }
+ if escape {
+ return AppendEscapedString(b, *(*string)(unsafe.Pointer(&bytes))), nil
+ }
+ return AppendString(b, *(*string)(unsafe.Pointer(&bytes))), nil
+}
+
+func AppendMarshalTextIndent(code *Opcode, b []byte, v interface{}, escape bool) ([]byte, error) {
+ rv := reflect.ValueOf(v) // convert by dynamic interface type
+ if code.AddrForMarshaler {
+ if rv.CanAddr() {
+ rv = rv.Addr()
+ } else {
+ newV := reflect.New(rv.Type())
+ newV.Elem().Set(rv)
+ rv = newV
+ }
+ }
+ v = rv.Interface()
+ marshaler, ok := v.(encoding.TextMarshaler)
+ if !ok {
+ return AppendNull(b), nil
+ }
+ bytes, err := marshaler.MarshalText()
+ if err != nil {
+ return nil, &errors.MarshalerError{Type: reflect.TypeOf(v), Err: err}
+ }
+ if escape {
+ return AppendEscapedString(b, *(*string)(unsafe.Pointer(&bytes))), nil
+ }
+ return AppendString(b, *(*string)(unsafe.Pointer(&bytes))), nil
+}
+
+func AppendNull(b []byte) []byte {
+ return append(b, "null"...)
+}
+
+func AppendComma(b []byte) []byte {
+ return append(b, ',')
+}
+
+func AppendCommaIndent(b []byte) []byte {
+ return append(b, ',', '\n')
+}
+
+func AppendStructEnd(b []byte) []byte {
+ return append(b, '}', ',')
+}
+
+func AppendStructEndIndent(ctx *RuntimeContext, code *Opcode, b []byte) []byte {
+ b = append(b, '\n')
+ b = append(b, ctx.Prefix...)
+ indentNum := ctx.BaseIndent + code.Indent - 1
+ for i := 0; i < indentNum; i++ {
+ b = append(b, ctx.IndentStr...)
+ }
+ return append(b, '}', ',', '\n')
+}
+
+func AppendIndent(ctx *RuntimeContext, b []byte, indent int) []byte {
+ b = append(b, ctx.Prefix...)
+ indentNum := ctx.BaseIndent + indent
+ for i := 0; i < indentNum; i++ {
+ b = append(b, ctx.IndentStr...)
+ }
+ return b
+}
+
+func IsNilForMarshaler(v interface{}) bool {
+ rv := reflect.ValueOf(v)
+ switch rv.Kind() {
+ case reflect.Bool:
+ return !rv.Bool()
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ return rv.Int() == 0
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+ return rv.Uint() == 0
+ case reflect.Float32, reflect.Float64:
+ return math.Float64bits(rv.Float()) == 0
+ case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Func:
+ return rv.IsNil()
+ case reflect.Slice:
+ return rv.IsNil() || rv.Len() == 0
+ }
+ return false
+}
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/indent.go b/vendor/github.com/goccy/go-json/internal/encoder/indent.go
new file mode 100644
index 000000000..dfe04b5e3
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/indent.go
@@ -0,0 +1,211 @@
+package encoder
+
+import (
+ "bytes"
+ "fmt"
+
+ "github.com/goccy/go-json/internal/errors"
+)
+
+func takeIndentSrcRuntimeContext(src []byte) (*RuntimeContext, []byte) {
+ ctx := TakeRuntimeContext()
+ buf := ctx.Buf[:0]
+ buf = append(append(buf, src...), nul)
+ ctx.Buf = buf
+ return ctx, buf
+}
+
+func Indent(buf *bytes.Buffer, src []byte, prefix, indentStr string) error {
+ if len(src) == 0 {
+ return errors.ErrUnexpectedEndOfJSON("", 0)
+ }
+
+ srcCtx, srcBuf := takeIndentSrcRuntimeContext(src)
+ dstCtx := TakeRuntimeContext()
+ dst := dstCtx.Buf[:0]
+
+ dst, err := indentAndWrite(buf, dst, srcBuf, prefix, indentStr)
+ if err != nil {
+ ReleaseRuntimeContext(srcCtx)
+ ReleaseRuntimeContext(dstCtx)
+ return err
+ }
+ dstCtx.Buf = dst
+ ReleaseRuntimeContext(srcCtx)
+ ReleaseRuntimeContext(dstCtx)
+ return nil
+}
+
+func indentAndWrite(buf *bytes.Buffer, dst []byte, src []byte, prefix, indentStr string) ([]byte, error) {
+ dst, err := doIndent(dst, src, prefix, indentStr, false)
+ if err != nil {
+ return nil, err
+ }
+ if _, err := buf.Write(dst); err != nil {
+ return nil, err
+ }
+ return dst, nil
+}
+
+func doIndent(dst, src []byte, prefix, indentStr string, escape bool) ([]byte, error) {
+ buf, cursor, err := indentValue(dst, src, 0, 0, []byte(prefix), []byte(indentStr), escape)
+ if err != nil {
+ return nil, err
+ }
+ if err := validateEndBuf(src, cursor); err != nil {
+ return nil, err
+ }
+ return buf, nil
+}
+
+func indentValue(
+ dst []byte,
+ src []byte,
+ indentNum int,
+ cursor int64,
+ prefix []byte,
+ indentBytes []byte,
+ escape bool) ([]byte, int64, error) {
+ for {
+ switch src[cursor] {
+ case ' ', '\t', '\n', '\r':
+ cursor++
+ continue
+ case '{':
+ return indentObject(dst, src, indentNum, cursor, prefix, indentBytes, escape)
+ case '}':
+ return nil, 0, errors.ErrSyntax("unexpected character '}'", cursor)
+ case '[':
+ return indentArray(dst, src, indentNum, cursor, prefix, indentBytes, escape)
+ case ']':
+ return nil, 0, errors.ErrSyntax("unexpected character ']'", cursor)
+ case '"':
+ return compactString(dst, src, cursor, escape)
+ case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
+ return compactNumber(dst, src, cursor)
+ case 't':
+ return compactTrue(dst, src, cursor)
+ case 'f':
+ return compactFalse(dst, src, cursor)
+ case 'n':
+ return compactNull(dst, src, cursor)
+ default:
+ return nil, 0, errors.ErrSyntax(fmt.Sprintf("unexpected character '%c'", src[cursor]), cursor)
+ }
+ }
+}
+
+func indentObject(
+ dst []byte,
+ src []byte,
+ indentNum int,
+ cursor int64,
+ prefix []byte,
+ indentBytes []byte,
+ escape bool) ([]byte, int64, error) {
+ if src[cursor] == '{' {
+ dst = append(dst, '{')
+ } else {
+ return nil, 0, errors.ErrExpected("expected { character for object value", cursor)
+ }
+ cursor = skipWhiteSpace(src, cursor+1)
+ if src[cursor] == '}' {
+ dst = append(dst, '}')
+ return dst, cursor + 1, nil
+ }
+ indentNum++
+ var err error
+ for {
+ dst = append(append(dst, '\n'), prefix...)
+ for i := 0; i < indentNum; i++ {
+ dst = append(dst, indentBytes...)
+ }
+ cursor = skipWhiteSpace(src, cursor)
+ dst, cursor, err = compactString(dst, src, cursor, escape)
+ if err != nil {
+ return nil, 0, err
+ }
+ cursor = skipWhiteSpace(src, cursor)
+ if src[cursor] != ':' {
+ return nil, 0, errors.ErrSyntax(
+ fmt.Sprintf("invalid character '%c' after object key", src[cursor]),
+ cursor+1,
+ )
+ }
+ dst = append(dst, ':', ' ')
+ dst, cursor, err = indentValue(dst, src, indentNum, cursor+1, prefix, indentBytes, escape)
+ if err != nil {
+ return nil, 0, err
+ }
+ cursor = skipWhiteSpace(src, cursor)
+ switch src[cursor] {
+ case '}':
+ dst = append(append(dst, '\n'), prefix...)
+ for i := 0; i < indentNum-1; i++ {
+ dst = append(dst, indentBytes...)
+ }
+ dst = append(dst, '}')
+ cursor++
+ return dst, cursor, nil
+ case ',':
+ dst = append(dst, ',')
+ default:
+ return nil, 0, errors.ErrSyntax(
+ fmt.Sprintf("invalid character '%c' after object key:value pair", src[cursor]),
+ cursor+1,
+ )
+ }
+ cursor++
+ }
+}
+
+func indentArray(
+ dst []byte,
+ src []byte,
+ indentNum int,
+ cursor int64,
+ prefix []byte,
+ indentBytes []byte,
+ escape bool) ([]byte, int64, error) {
+ if src[cursor] == '[' {
+ dst = append(dst, '[')
+ } else {
+ return nil, 0, errors.ErrExpected("expected [ character for array value", cursor)
+ }
+ cursor = skipWhiteSpace(src, cursor+1)
+ if src[cursor] == ']' {
+ dst = append(dst, ']')
+ return dst, cursor + 1, nil
+ }
+ indentNum++
+ var err error
+ for {
+ dst = append(append(dst, '\n'), prefix...)
+ for i := 0; i < indentNum; i++ {
+ dst = append(dst, indentBytes...)
+ }
+ dst, cursor, err = indentValue(dst, src, indentNum, cursor, prefix, indentBytes, escape)
+ if err != nil {
+ return nil, 0, err
+ }
+ cursor = skipWhiteSpace(src, cursor)
+ switch src[cursor] {
+ case ']':
+ dst = append(append(dst, '\n'), prefix...)
+ for i := 0; i < indentNum-1; i++ {
+ dst = append(dst, indentBytes...)
+ }
+ dst = append(dst, ']')
+ cursor++
+ return dst, cursor, nil
+ case ',':
+ dst = append(dst, ',')
+ default:
+ return nil, 0, errors.ErrSyntax(
+ fmt.Sprintf("invalid character '%c' after array value", src[cursor]),
+ cursor+1,
+ )
+ }
+ cursor++
+ }
+}
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/int.go b/vendor/github.com/goccy/go-json/internal/encoder/int.go
new file mode 100644
index 000000000..70ea5f7d7
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/int.go
@@ -0,0 +1,124 @@
+package encoder
+
+import (
+ "unsafe"
+)
+
+var endianness int
+
+func init() {
+ var b [2]byte
+ *(*uint16)(unsafe.Pointer(&b)) = uint16(0xABCD)
+
+ switch b[0] {
+ case 0xCD:
+ endianness = 0 // LE
+ case 0xAB:
+ endianness = 1 // BE
+ default:
+ panic("could not determine endianness")
+ }
+}
+
+// "00010203...96979899" cast to []uint16
+var intLELookup = [100]uint16{
+ 0x3030, 0x3130, 0x3230, 0x3330, 0x3430, 0x3530, 0x3630, 0x3730, 0x3830, 0x3930,
+ 0x3031, 0x3131, 0x3231, 0x3331, 0x3431, 0x3531, 0x3631, 0x3731, 0x3831, 0x3931,
+ 0x3032, 0x3132, 0x3232, 0x3332, 0x3432, 0x3532, 0x3632, 0x3732, 0x3832, 0x3932,
+ 0x3033, 0x3133, 0x3233, 0x3333, 0x3433, 0x3533, 0x3633, 0x3733, 0x3833, 0x3933,
+ 0x3034, 0x3134, 0x3234, 0x3334, 0x3434, 0x3534, 0x3634, 0x3734, 0x3834, 0x3934,
+ 0x3035, 0x3135, 0x3235, 0x3335, 0x3435, 0x3535, 0x3635, 0x3735, 0x3835, 0x3935,
+ 0x3036, 0x3136, 0x3236, 0x3336, 0x3436, 0x3536, 0x3636, 0x3736, 0x3836, 0x3936,
+ 0x3037, 0x3137, 0x3237, 0x3337, 0x3437, 0x3537, 0x3637, 0x3737, 0x3837, 0x3937,
+ 0x3038, 0x3138, 0x3238, 0x3338, 0x3438, 0x3538, 0x3638, 0x3738, 0x3838, 0x3938,
+ 0x3039, 0x3139, 0x3239, 0x3339, 0x3439, 0x3539, 0x3639, 0x3739, 0x3839, 0x3939,
+}
+
+var intBELookup = [100]uint16{
+ 0x3030, 0x3031, 0x3032, 0x3033, 0x3034, 0x3035, 0x3036, 0x3037, 0x3038, 0x3039,
+ 0x3130, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3138, 0x3139,
+ 0x3230, 0x3231, 0x3232, 0x3233, 0x3234, 0x3235, 0x3236, 0x3237, 0x3238, 0x3239,
+ 0x3330, 0x3331, 0x3332, 0x3333, 0x3334, 0x3335, 0x3336, 0x3337, 0x3338, 0x3339,
+ 0x3430, 0x3431, 0x3432, 0x3433, 0x3434, 0x3435, 0x3436, 0x3437, 0x3438, 0x3439,
+ 0x3530, 0x3531, 0x3532, 0x3533, 0x3534, 0x3535, 0x3536, 0x3537, 0x3538, 0x3539,
+ 0x3630, 0x3631, 0x3632, 0x3633, 0x3634, 0x3635, 0x3636, 0x3637, 0x3638, 0x3639,
+ 0x3730, 0x3731, 0x3732, 0x3733, 0x3734, 0x3735, 0x3736, 0x3737, 0x3738, 0x3739,
+ 0x3830, 0x3831, 0x3832, 0x3833, 0x3834, 0x3835, 0x3836, 0x3837, 0x3838, 0x3839,
+ 0x3930, 0x3931, 0x3932, 0x3933, 0x3934, 0x3935, 0x3936, 0x3937, 0x3938, 0x3939,
+}
+
+var intLookup = [2]*[100]uint16{&intLELookup, &intBELookup}
+
+func AppendInt(out []byte, u64 uint64, code *Opcode) []byte {
+ n := u64 & code.Mask
+ negative := (u64>>code.RshiftNum)&1 == 1
+ if !negative {
+ if n < 10 {
+ return append(out, byte(n+'0'))
+ } else if n < 100 {
+ u := intLELookup[n]
+ return append(out, byte(u), byte(u>>8))
+ }
+ } else {
+ n = -n & code.Mask
+ }
+
+ lookup := intLookup[endianness]
+
+ var b [22]byte
+ u := (*[11]uint16)(unsafe.Pointer(&b))
+ i := 11
+
+ for n >= 100 {
+ j := n % 100
+ n /= 100
+ i--
+ u[i] = lookup[j]
+ }
+
+ i--
+ u[i] = lookup[n]
+
+ i *= 2 // convert to byte index
+ if n < 10 {
+ i++ // remove leading zero
+ }
+ if negative {
+ i--
+ b[i] = '-'
+ }
+
+ return append(out, b[i:]...)
+}
+
+func AppendUint(out []byte, u64 uint64, code *Opcode) []byte {
+ n := u64 & code.Mask
+ if n < 10 {
+ return append(out, byte(n+'0'))
+ } else if n < 100 {
+ u := intLELookup[n]
+ return append(out, byte(u), byte(u>>8))
+ }
+
+ lookup := intLookup[endianness]
+
+ var b [22]byte
+ u := (*[11]uint16)(unsafe.Pointer(&b))
+ i := 11
+
+ for n >= 100 {
+ j := n % 100
+ n /= 100
+ i--
+ u[i] = lookup[j]
+ }
+
+ i--
+ u[i] = lookup[n]
+
+ i *= 2 // convert to byte index
+ if n < 10 {
+ i++ // remove leading zero
+ }
+ return append(out, b[i:]...)
+}
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/map112.go b/vendor/github.com/goccy/go-json/internal/encoder/map112.go
new file mode 100644
index 000000000..31858d000
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/map112.go
@@ -0,0 +1,8 @@
+// +build !go1.13
+
+package encoder
+
+import "unsafe"
+
+//go:linkname MapIterValue reflect.mapitervalue
+func MapIterValue(it unsafe.Pointer) unsafe.Pointer
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/map113.go b/vendor/github.com/goccy/go-json/internal/encoder/map113.go
new file mode 100644
index 000000000..f49c27bed
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/map113.go
@@ -0,0 +1,8 @@
+// +build go1.13
+
+package encoder
+
+import "unsafe"
+
+//go:linkname MapIterValue reflect.mapiterelem
+func MapIterValue(it unsafe.Pointer) unsafe.Pointer
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/opcode.go b/vendor/github.com/goccy/go-json/internal/encoder/opcode.go
new file mode 100644
index 000000000..0dfd6fb95
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/opcode.go
@@ -0,0 +1,743 @@
+package encoder
+
+import (
+ "fmt"
+ "math"
+ "strings"
+ "unsafe"
+
+ "github.com/goccy/go-json/internal/runtime"
+)
+
+const uintptrSize = 4 << (^uintptr(0) >> 63)
+
+type Opcode struct {
+ Op OpType // operation type
+ Type *runtime.Type // go type
+ DisplayIdx int // opcode index
+ Key []byte // struct field key
+ EscapedKey []byte // struct field key ( HTML escaped )
+ PtrNum int // pointer number: e.g. double pointer is 2.
+ DisplayKey string // key text to display
+ IsTaggedKey bool // whether tagged key
+ AnonymousKey bool // whether anonymous key
+ AnonymousHead bool // whether anonymous head or not
+ Indirect bool // whether indirect or not
+ Nilcheck bool // whether needs to nilcheck or not
+ AddrForMarshaler bool // whether needs to addr for marshaler or not
+ IsNextOpPtrType bool // whether next operation is ptr type or not
+ IsNilableType bool // whether type is nilable or not
+ RshiftNum uint8 // use to take bit for judging whether negative integer or not
+ Mask uint64 // mask for number
+ Indent int // indent number
+
+ Idx uintptr // offset to access ptr
+ HeadIdx uintptr // offset to access slice/struct head
+ ElemIdx uintptr // offset to access array/slice/map elem
+ Length uintptr // offset to access slice/map length or array length
+ MapIter uintptr // offset to access map iterator
+ MapPos uintptr // offset to access position list for sorted map
+ Offset uintptr // offset size from struct header
+ Size uintptr // array/slice elem size
+
+ MapKey *Opcode // map key
+ MapValue *Opcode // map value
+ Elem *Opcode // array/slice elem
+ End *Opcode // array/slice/struct/map end
+ PrevField *Opcode // prev struct field
+ NextField *Opcode // next struct field
+ Next *Opcode // next opcode
+ Jmp *CompiledCode // for recursive call
+}
+
+func rshitNum(bitSize uint8) uint8 {
+ return bitSize - 1
+}
+
+func (c *Opcode) setMaskAndRshiftNum(bitSize uint8) {
+ switch bitSize {
+ case 8:
+ c.Mask = math.MaxUint8
+ case 16:
+ c.Mask = math.MaxUint16
+ case 32:
+ c.Mask = math.MaxUint32
+ case 64:
+ c.Mask = math.MaxUint64
+ }
+ c.RshiftNum = rshitNum(bitSize)
+}
+
+func (c *Opcode) ToHeaderType(isString bool) OpType {
+ switch c.Op {
+ case OpInt:
+ if isString {
+ return OpStructHeadIntString
+ }
+ return OpStructHeadInt
+ case OpIntPtr:
+ if isString {
+ return OpStructHeadIntPtrString
+ }
+ return OpStructHeadIntPtr
+ case OpUint:
+ if isString {
+ return OpStructHeadUintString
+ }
+ return OpStructHeadUint
+ case OpUintPtr:
+ if isString {
+ return OpStructHeadUintPtrString
+ }
+ return OpStructHeadUintPtr
+ case OpFloat32:
+ if isString {
+ return OpStructHeadFloat32String
+ }
+ return OpStructHeadFloat32
+ case OpFloat32Ptr:
+ if isString {
+ return OpStructHeadFloat32PtrString
+ }
+ return OpStructHeadFloat32Ptr
+ case OpFloat64:
+ if isString {
+ return OpStructHeadFloat64String
+ }
+ return OpStructHeadFloat64
+ case OpFloat64Ptr:
+ if isString {
+ return OpStructHeadFloat64PtrString
+ }
+ return OpStructHeadFloat64Ptr
+ case OpString:
+ if isString {
+ return OpStructHeadStringString
+ }
+ return OpStructHeadString
+ case OpStringPtr:
+ if isString {
+ return OpStructHeadStringPtrString
+ }
+ return OpStructHeadStringPtr
+ case OpNumber:
+ if isString {
+ return OpStructHeadNumberString
+ }
+ return OpStructHeadNumber
+ case OpNumberPtr:
+ if isString {
+ return OpStructHeadNumberPtrString
+ }
+ return OpStructHeadNumberPtr
+ case OpBool:
+ if isString {
+ return OpStructHeadBoolString
+ }
+ return OpStructHeadBool
+ case OpBoolPtr:
+ if isString {
+ return OpStructHeadBoolPtrString
+ }
+ return OpStructHeadBoolPtr
+ case OpBytes:
+ return OpStructHeadBytes
+ case OpBytesPtr:
+ return OpStructHeadBytesPtr
+ case OpMap:
+ return OpStructHeadMap
+ case OpMapPtr:
+ c.Op = OpMap
+ return OpStructHeadMapPtr
+ case OpArray:
+ return OpStructHeadArray
+ case OpArrayPtr:
+ c.Op = OpArray
+ return OpStructHeadArrayPtr
+ case OpSlice:
+ return OpStructHeadSlice
+ case OpSlicePtr:
+ c.Op = OpSlice
+ return OpStructHeadSlicePtr
+ case OpMarshalJSON:
+ return OpStructHeadMarshalJSON
+ case OpMarshalJSONPtr:
+ return OpStructHeadMarshalJSONPtr
+ case OpMarshalText:
+ return OpStructHeadMarshalText
+ case OpMarshalTextPtr:
+ return OpStructHeadMarshalTextPtr
+ }
+ return OpStructHead
+}
+
+func (c *Opcode) ToFieldType(isString bool) OpType {
+ switch c.Op {
+ case OpInt:
+ if isString {
+ return OpStructFieldIntString
+ }
+ return OpStructFieldInt
+ case OpIntPtr:
+ if isString {
+ return OpStructFieldIntPtrString
+ }
+ return OpStructFieldIntPtr
+ case OpUint:
+ if isString {
+ return OpStructFieldUintString
+ }
+ return OpStructFieldUint
+ case OpUintPtr:
+ if isString {
+ return OpStructFieldUintPtrString
+ }
+ return OpStructFieldUintPtr
+ case OpFloat32:
+ if isString {
+ return OpStructFieldFloat32String
+ }
+ return OpStructFieldFloat32
+ case OpFloat32Ptr:
+ if isString {
+ return OpStructFieldFloat32PtrString
+ }
+ return OpStructFieldFloat32Ptr
+ case OpFloat64:
+ if isString {
+ return OpStructFieldFloat64String
+ }
+ return OpStructFieldFloat64
+ case OpFloat64Ptr:
+ if isString {
+ return OpStructFieldFloat64PtrString
+ }
+ return OpStructFieldFloat64Ptr
+ case OpString:
+ if isString {
+ return OpStructFieldStringString
+ }
+ return OpStructFieldString
+ case OpStringPtr:
+ if isString {
+ return OpStructFieldStringPtrString
+ }
+ return OpStructFieldStringPtr
+ case OpNumber:
+ if isString {
+ return OpStructFieldNumberString
+ }
+ return OpStructFieldNumber
+ case OpNumberPtr:
+ if isString {
+ return OpStructFieldNumberPtrString
+ }
+ return OpStructFieldNumberPtr
+ case OpBool:
+ if isString {
+ return OpStructFieldBoolString
+ }
+ return OpStructFieldBool
+ case OpBoolPtr:
+ if isString {
+ return OpStructFieldBoolPtrString
+ }
+ return OpStructFieldBoolPtr
+ case OpBytes:
+ return OpStructFieldBytes
+ case OpBytesPtr:
+ return OpStructFieldBytesPtr
+ case OpMap:
+ return OpStructFieldMap
+ case OpMapPtr:
+ c.Op = OpMap
+ return OpStructFieldMapPtr
+ case OpArray:
+ return OpStructFieldArray
+ case OpArrayPtr:
+ c.Op = OpArray
+ return OpStructFieldArrayPtr
+ case OpSlice:
+ return OpStructFieldSlice
+ case OpSlicePtr:
+ c.Op = OpSlice
+ return OpStructFieldSlicePtr
+ case OpMarshalJSON:
+ return OpStructFieldMarshalJSON
+ case OpMarshalJSONPtr:
+ return OpStructFieldMarshalJSONPtr
+ case OpMarshalText:
+ return OpStructFieldMarshalText
+ case OpMarshalTextPtr:
+ return OpStructFieldMarshalTextPtr
+ }
+ return OpStructField
+}
+
+func newOpCode(ctx *compileContext, op OpType) *Opcode {
+ return newOpCodeWithNext(ctx, op, newEndOp(ctx))
+}
+
+func opcodeOffset(idx int) uintptr {
+ return uintptr(idx) * uintptrSize
+}
+
+func copyOpcode(code *Opcode) *Opcode {
+ codeMap := map[uintptr]*Opcode{}
+ return code.copy(codeMap)
+}
+
+func newOpCodeWithNext(ctx *compileContext, op OpType, next *Opcode) *Opcode {
+ return &Opcode{
+ Op: op,
+ Type: ctx.typ,
+ DisplayIdx: ctx.opcodeIndex,
+ Indent: ctx.indent,
+ Idx: opcodeOffset(ctx.ptrIndex),
+ Next: next,
+ }
+}
+
+func newEndOp(ctx *compileContext) *Opcode {
+ return newOpCodeWithNext(ctx, OpEnd, nil)
+}
+
+func (c *Opcode) copy(codeMap map[uintptr]*Opcode) *Opcode {
+ if c == nil {
+ return nil
+ }
+ addr := uintptr(unsafe.Pointer(c))
+ if code, exists := codeMap[addr]; exists {
+ return code
+ }
+ copied := &Opcode{
+ Op: c.Op,
+ Type: c.Type,
+ DisplayIdx: c.DisplayIdx,
+ Key: c.Key,
+ EscapedKey: c.EscapedKey,
+ DisplayKey: c.DisplayKey,
+ PtrNum: c.PtrNum,
+ Mask: c.Mask,
+ RshiftNum: c.RshiftNum,
+ IsTaggedKey: c.IsTaggedKey,
+ AnonymousKey: c.AnonymousKey,
+ AnonymousHead: c.AnonymousHead,
+ Indirect: c.Indirect,
+ Nilcheck: c.Nilcheck,
+ AddrForMarshaler: c.AddrForMarshaler,
+ IsNextOpPtrType: c.IsNextOpPtrType,
+ IsNilableType: c.IsNilableType,
+ Indent: c.Indent,
+ Idx: c.Idx,
+ HeadIdx: c.HeadIdx,
+ ElemIdx: c.ElemIdx,
+ Length: c.Length,
+ MapIter: c.MapIter,
+ MapPos: c.MapPos,
+ Offset: c.Offset,
+ Size: c.Size,
+ }
+ codeMap[addr] = copied
+ copied.MapKey = c.MapKey.copy(codeMap)
+ copied.MapValue = c.MapValue.copy(codeMap)
+ copied.Elem = c.Elem.copy(codeMap)
+ copied.End = c.End.copy(codeMap)
+ copied.PrevField = c.PrevField.copy(codeMap)
+ copied.NextField = c.NextField.copy(codeMap)
+ copied.Next = c.Next.copy(codeMap)
+ copied.Jmp = c.Jmp
+ return copied
+}
+
+func (c *Opcode) BeforeLastCode() *Opcode {
+ code := c
+ for {
+ var nextCode *Opcode
+ switch code.Op.CodeType() {
+ case CodeArrayElem, CodeSliceElem, CodeMapKey:
+ nextCode = code.End
+ default:
+ nextCode = code.Next
+ }
+ if nextCode.Op == OpEnd {
+ return code
+ }
+ code = nextCode
+ }
+}
+
+func (c *Opcode) TotalLength() int {
+ var idx int
+ for code := c; code.Op != OpEnd; {
+ idx = int(code.Idx / uintptrSize)
+ if code.Op == OpRecursiveEnd {
+ break
+ }
+ switch code.Op.CodeType() {
+ case CodeArrayElem, CodeSliceElem, CodeMapKey:
+ code = code.End
+ default:
+ code = code.Next
+ }
+ }
+ return idx + 2 // opEnd + 1
+}
+
+func (c *Opcode) decOpcodeIndex() {
+ for code := c; code.Op != OpEnd; {
+ code.DisplayIdx--
+ code.Idx -= uintptrSize
+ if code.HeadIdx > 0 {
+ code.HeadIdx -= uintptrSize
+ }
+ if code.ElemIdx > 0 {
+ code.ElemIdx -= uintptrSize
+ }
+ if code.MapIter > 0 {
+ code.MapIter -= uintptrSize
+ }
+ if code.Length > 0 && code.Op.CodeType() != CodeArrayHead && code.Op.CodeType() != CodeArrayElem {
+ code.Length -= uintptrSize
+ }
+ switch code.Op.CodeType() {
+ case CodeArrayElem, CodeSliceElem, CodeMapKey:
+ code = code.End
+ default:
+ code = code.Next
+ }
+ }
+}
+
+func (c *Opcode) decIndent() {
+ for code := c; code.Op != OpEnd; {
+ code.Indent--
+ switch code.Op.CodeType() {
+ case CodeArrayElem, CodeSliceElem, CodeMapKey:
+ code = code.End
+ default:
+ code = code.Next
+ }
+ }
+}
+
+func (c *Opcode) dumpHead(code *Opcode) string {
+ var length uintptr
+ if code.Op.CodeType() == CodeArrayHead {
+ length = code.Length
+ } else {
+ length = code.Length / uintptrSize
+ }
+ return fmt.Sprintf(
+ `[%d]%s%s ([idx:%d][headIdx:%d][elemIdx:%d][length:%d])`,
+ code.DisplayIdx,
+ strings.Repeat("-", code.Indent),
+ code.Op,
+ code.Idx/uintptrSize,
+ code.HeadIdx/uintptrSize,
+ code.ElemIdx/uintptrSize,
+ length,
+ )
+}
+
+func (c *Opcode) dumpMapHead(code *Opcode) string {
+ return fmt.Sprintf(
+ `[%d]%s%s ([idx:%d][headIdx:%d][elemIdx:%d][length:%d][mapIter:%d])`,
+ code.DisplayIdx,
+ strings.Repeat("-", code.Indent),
+ code.Op,
+ code.Idx/uintptrSize,
+ code.HeadIdx/uintptrSize,
+ code.ElemIdx/uintptrSize,
+ code.Length/uintptrSize,
+ code.MapIter/uintptrSize,
+ )
+}
+
+func (c *Opcode) dumpMapEnd(code *Opcode) string {
+ return fmt.Sprintf(
+ `[%d]%s%s ([idx:%d][mapPos:%d][length:%d])`,
+ code.DisplayIdx,
+ strings.Repeat("-", code.Indent),
+ code.Op,
+ code.Idx/uintptrSize,
+ code.MapPos/uintptrSize,
+ code.Length/uintptrSize,
+ )
+}
+
+func (c *Opcode) dumpElem(code *Opcode) string {
+ var length uintptr
+ if code.Op.CodeType() == CodeArrayElem {
+ length = code.Length
+ } else {
+ length = code.Length / uintptrSize
+ }
+ return fmt.Sprintf(
+ `[%d]%s%s ([idx:%d][headIdx:%d][elemIdx:%d][length:%d][size:%d])`,
+ code.DisplayIdx,
+ strings.Repeat("-", code.Indent),
+ code.Op,
+ code.Idx/uintptrSize,
+ code.HeadIdx/uintptrSize,
+ code.ElemIdx/uintptrSize,
+ length,
+ code.Size,
+ )
+}
+
+func (c *Opcode) dumpField(code *Opcode) string {
+ return fmt.Sprintf(
+ `[%d]%s%s ([idx:%d][key:%s][offset:%d][headIdx:%d])`,
+ code.DisplayIdx,
+ strings.Repeat("-", code.Indent),
+ code.Op,
+ code.Idx/uintptrSize,
+ code.DisplayKey,
+ code.Offset,
+ code.HeadIdx/uintptrSize,
+ )
+}
+
+func (c *Opcode) dumpKey(code *Opcode) string {
+ return fmt.Sprintf(
+ `[%d]%s%s ([idx:%d][elemIdx:%d][length:%d][mapIter:%d])`,
+ code.DisplayIdx,
+ strings.Repeat("-", code.Indent),
+ code.Op,
+ code.Idx/uintptrSize,
+ code.ElemIdx/uintptrSize,
+ code.Length/uintptrSize,
+ code.MapIter/uintptrSize,
+ )
+}
+
+func (c *Opcode) dumpValue(code *Opcode) string {
+ return fmt.Sprintf(
+ `[%d]%s%s ([idx:%d][mapIter:%d])`,
+ code.DisplayIdx,
+ strings.Repeat("-", code.Indent),
+ code.Op,
+ code.Idx/uintptrSize,
+ code.MapIter/uintptrSize,
+ )
+}
+
+func (c *Opcode) Dump() string {
+ codes := []string{}
+ for code := c; code.Op != OpEnd; {
+ switch code.Op.CodeType() {
+ case CodeSliceHead:
+ codes = append(codes, c.dumpHead(code))
+ code = code.Next
+ case CodeMapHead:
+ codes = append(codes, c.dumpMapHead(code))
+ code = code.Next
+ case CodeArrayElem, CodeSliceElem:
+ codes = append(codes, c.dumpElem(code))
+ code = code.End
+ case CodeMapKey:
+ codes = append(codes, c.dumpKey(code))
+ code = code.End
+ case CodeMapValue:
+ codes = append(codes, c.dumpValue(code))
+ code = code.Next
+ case CodeMapEnd:
+ codes = append(codes, c.dumpMapEnd(code))
+ code = code.Next
+ case CodeStructField:
+ codes = append(codes, c.dumpField(code))
+ code = code.Next
+ case CodeStructEnd:
+ codes = append(codes, c.dumpField(code))
+ code = code.Next
+ default:
+ codes = append(codes, fmt.Sprintf(
+ "[%d]%s%s ([idx:%d])",
+ code.DisplayIdx,
+ strings.Repeat("-", code.Indent),
+ code.Op,
+ code.Idx/uintptrSize,
+ ))
+ code = code.Next
+ }
+ }
+ return strings.Join(codes, "\n")
+}
+
+func prevField(code *Opcode, removedFields map[*Opcode]struct{}) *Opcode {
+ if _, exists := removedFields[code]; exists {
+ return prevField(code.PrevField, removedFields)
+ }
+ return code
+}
+
+func nextField(code *Opcode, removedFields map[*Opcode]struct{}) *Opcode {
+ if _, exists := removedFields[code]; exists {
+ return nextField(code.NextField, removedFields)
+ }
+ return code
+}
+
+func linkPrevToNextField(cur *Opcode, removedFields map[*Opcode]struct{}) {
+ prev := prevField(cur.PrevField, removedFields)
+ prev.NextField = nextField(cur.NextField, removedFields)
+ code := prev
+ fcode := cur
+ for {
+ var nextCode *Opcode
+ switch code.Op.CodeType() {
+ case CodeArrayElem, CodeSliceElem, CodeMapKey:
+ nextCode = code.End
+ default:
+ nextCode = code.Next
+ }
+ if nextCode == fcode {
+ code.Next = fcode.Next
+ break
+ } else if nextCode.Op == OpEnd {
+ break
+ }
+ code = nextCode
+ }
+}
+
+func newSliceHeaderCode(ctx *compileContext) *Opcode {
+ idx := opcodeOffset(ctx.ptrIndex)
+ ctx.incPtrIndex()
+ elemIdx := opcodeOffset(ctx.ptrIndex)
+ ctx.incPtrIndex()
+ length := opcodeOffset(ctx.ptrIndex)
+ return &Opcode{
+ Op: OpSlice,
+ DisplayIdx: ctx.opcodeIndex,
+ Idx: idx,
+ HeadIdx: idx,
+ ElemIdx: elemIdx,
+ Length: length,
+ Indent: ctx.indent,
+ }
+}
+
+func newSliceElemCode(ctx *compileContext, head *Opcode, size uintptr) *Opcode {
+ return &Opcode{
+ Op: OpSliceElem,
+ DisplayIdx: ctx.opcodeIndex,
+ Idx: opcodeOffset(ctx.ptrIndex),
+ HeadIdx: head.Idx,
+ ElemIdx: head.ElemIdx,
+ Length: head.Length,
+ Indent: ctx.indent,
+ Size: size,
+ }
+}
+
+func newArrayHeaderCode(ctx *compileContext, alen int) *Opcode {
+ idx := opcodeOffset(ctx.ptrIndex)
+ ctx.incPtrIndex()
+ elemIdx := opcodeOffset(ctx.ptrIndex)
+ return &Opcode{
+ Op: OpArray,
+ DisplayIdx: ctx.opcodeIndex,
+ Idx: idx,
+ HeadIdx: idx,
+ ElemIdx: elemIdx,
+ Indent: ctx.indent,
+ Length: uintptr(alen),
+ }
+}
+
+func newArrayElemCode(ctx *compileContext, head *Opcode, length int, size uintptr) *Opcode {
+ return &Opcode{
+ Op: OpArrayElem,
+ DisplayIdx: ctx.opcodeIndex,
+ Idx: opcodeOffset(ctx.ptrIndex),
+ ElemIdx: head.ElemIdx,
+ HeadIdx: head.HeadIdx,
+ Length: uintptr(length),
+ Indent: ctx.indent,
+ Size: size,
+ }
+}
+
+func newMapHeaderCode(ctx *compileContext) *Opcode {
+ idx := opcodeOffset(ctx.ptrIndex)
+ ctx.incPtrIndex()
+ elemIdx := opcodeOffset(ctx.ptrIndex)
+ ctx.incPtrIndex()
+ length := opcodeOffset(ctx.ptrIndex)
+ ctx.incPtrIndex()
+ mapIter := opcodeOffset(ctx.ptrIndex)
+ return &Opcode{
+ Op: OpMap,
+ Type: ctx.typ,
+ DisplayIdx: ctx.opcodeIndex,
+ Idx: idx,
+ ElemIdx: elemIdx,
+ Length: length,
+ MapIter: mapIter,
+ Indent: ctx.indent,
+ }
+}
+
+func newMapKeyCode(ctx *compileContext, head *Opcode) *Opcode {
+ return &Opcode{
+ Op: OpMapKey,
+ DisplayIdx: ctx.opcodeIndex,
+ Idx: opcodeOffset(ctx.ptrIndex),
+ ElemIdx: head.ElemIdx,
+ Length: head.Length,
+ MapIter: head.MapIter,
+ Indent: ctx.indent,
+ }
+}
+
+func newMapValueCode(ctx *compileContext, head *Opcode) *Opcode {
+ return &Opcode{
+ Op: OpMapValue,
+ DisplayIdx: ctx.opcodeIndex,
+ Idx: opcodeOffset(ctx.ptrIndex),
+ ElemIdx: head.ElemIdx,
+ Length: head.Length,
+ MapIter: head.MapIter,
+ Indent: ctx.indent,
+ }
+}
+
+func newMapEndCode(ctx *compileContext, head *Opcode) *Opcode {
+ mapPos := opcodeOffset(ctx.ptrIndex)
+ ctx.incPtrIndex()
+ idx := opcodeOffset(ctx.ptrIndex)
+ return &Opcode{
+ Op: OpMapEnd,
+ DisplayIdx: ctx.opcodeIndex,
+ Idx: idx,
+ Length: head.Length,
+ MapPos: mapPos,
+ Indent: ctx.indent,
+ Next: newEndOp(ctx),
+ }
+}
+
+func newInterfaceCode(ctx *compileContext) *Opcode {
+ return &Opcode{
+ Op: OpInterface,
+ Type: ctx.typ,
+ DisplayIdx: ctx.opcodeIndex,
+ Idx: opcodeOffset(ctx.ptrIndex),
+ Indent: ctx.indent,
+ Next: newEndOp(ctx),
+ }
+}
+
+func newRecursiveCode(ctx *compileContext, jmp *CompiledCode) *Opcode {
+ return &Opcode{
+ Op: OpRecursive,
+ Type: ctx.typ,
+ DisplayIdx: ctx.opcodeIndex,
+ Idx: opcodeOffset(ctx.ptrIndex),
+ Indent: ctx.indent,
+ Next: newEndOp(ctx),
+ Jmp: jmp,
+ }
+}
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/optype.go b/vendor/github.com/goccy/go-json/internal/encoder/optype.go
new file mode 100644
index 000000000..21ac3457c
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/optype.go
@@ -0,0 +1,932 @@
+// Code generated by internal/cmd/generator. DO NOT EDIT!
+package encoder
+
+import (
+ "strings"
+)
+
+type CodeType int
+
+const (
+ CodeOp CodeType = 0
+ CodeArrayHead CodeType = 1
+ CodeArrayElem CodeType = 2
+ CodeSliceHead CodeType = 3
+ CodeSliceElem CodeType = 4
+ CodeMapHead CodeType = 5
+ CodeMapKey CodeType = 6
+ CodeMapValue CodeType = 7
+ CodeMapEnd CodeType = 8
+ CodeRecursive CodeType = 9
+ CodeStructField CodeType = 10
+ CodeStructEnd CodeType = 11
+)
+
+var opTypeStrings = [400]string{
+ "End",
+ "Interface",
+ "Ptr",
+ "SliceElem",
+ "SliceEnd",
+ "ArrayElem",
+ "ArrayEnd",
+ "MapKey",
+ "MapValue",
+ "MapEnd",
+ "Recursive",
+ "RecursivePtr",
+ "RecursiveEnd",
+ "StructAnonymousEnd",
+ "Int",
+ "Uint",
+ "Float32",
+ "Float64",
+ "Bool",
+ "String",
+ "Bytes",
+ "Number",
+ "Array",
+ "Map",
+ "Slice",
+ "Struct",
+ "MarshalJSON",
+ "MarshalText",
+ "IntString",
+ "UintString",
+ "Float32String",
+ "Float64String",
+ "BoolString",
+ "StringString",
+ "NumberString",
+ "IntPtr",
+ "UintPtr",
+ "Float32Ptr",
+ "Float64Ptr",
+ "BoolPtr",
+ "StringPtr",
+ "BytesPtr",
+ "NumberPtr",
+ "ArrayPtr",
+ "MapPtr",
+ "SlicePtr",
+ "MarshalJSONPtr",
+ "MarshalTextPtr",
+ "InterfacePtr",
+ "IntPtrString",
+ "UintPtrString",
+ "Float32PtrString",
+ "Float64PtrString",
+ "BoolPtrString",
+ "StringPtrString",
+ "NumberPtrString",
+ "StructHeadInt",
+ "StructHeadOmitEmptyInt",
+ "StructPtrHeadInt",
+ "StructPtrHeadOmitEmptyInt",
+ "StructHeadUint",
+ "StructHeadOmitEmptyUint",
+ "StructPtrHeadUint",
+ "StructPtrHeadOmitEmptyUint",
+ "StructHeadFloat32",
+ "StructHeadOmitEmptyFloat32",
+ "StructPtrHeadFloat32",
+ "StructPtrHeadOmitEmptyFloat32",
+ "StructHeadFloat64",
+ "StructHeadOmitEmptyFloat64",
+ "StructPtrHeadFloat64",
+ "StructPtrHeadOmitEmptyFloat64",
+ "StructHeadBool",
+ "StructHeadOmitEmptyBool",
+ "StructPtrHeadBool",
+ "StructPtrHeadOmitEmptyBool",
+ "StructHeadString",
+ "StructHeadOmitEmptyString",
+ "StructPtrHeadString",
+ "StructPtrHeadOmitEmptyString",
+ "StructHeadBytes",
+ "StructHeadOmitEmptyBytes",
+ "StructPtrHeadBytes",
+ "StructPtrHeadOmitEmptyBytes",
+ "StructHeadNumber",
+ "StructHeadOmitEmptyNumber",
+ "StructPtrHeadNumber",
+ "StructPtrHeadOmitEmptyNumber",
+ "StructHeadArray",
+ "StructHeadOmitEmptyArray",
+ "StructPtrHeadArray",
+ "StructPtrHeadOmitEmptyArray",
+ "StructHeadMap",
+ "StructHeadOmitEmptyMap",
+ "StructPtrHeadMap",
+ "StructPtrHeadOmitEmptyMap",
+ "StructHeadSlice",
+ "StructHeadOmitEmptySlice",
+ "StructPtrHeadSlice",
+ "StructPtrHeadOmitEmptySlice",
+ "StructHeadStruct",
+ "StructHeadOmitEmptyStruct",
+ "StructPtrHeadStruct",
+ "StructPtrHeadOmitEmptyStruct",
+ "StructHeadMarshalJSON",
+ "StructHeadOmitEmptyMarshalJSON",
+ "StructPtrHeadMarshalJSON",
+ "StructPtrHeadOmitEmptyMarshalJSON",
+ "StructHeadMarshalText",
+ "StructHeadOmitEmptyMarshalText",
+ "StructPtrHeadMarshalText",
+ "StructPtrHeadOmitEmptyMarshalText",
+ "StructHeadIntString",
+ "StructHeadOmitEmptyIntString",
+ "StructPtrHeadIntString",
+ "StructPtrHeadOmitEmptyIntString",
+ "StructHeadUintString",
+ "StructHeadOmitEmptyUintString",
+ "StructPtrHeadUintString",
+ "StructPtrHeadOmitEmptyUintString",
+ "StructHeadFloat32String",
+ "StructHeadOmitEmptyFloat32String",
+ "StructPtrHeadFloat32String",
+ "StructPtrHeadOmitEmptyFloat32String",
+ "StructHeadFloat64String",
+ "StructHeadOmitEmptyFloat64String",
+ "StructPtrHeadFloat64String",
+ "StructPtrHeadOmitEmptyFloat64String",
+ "StructHeadBoolString",
+ "StructHeadOmitEmptyBoolString",
+ "StructPtrHeadBoolString",
+ "StructPtrHeadOmitEmptyBoolString",
+ "StructHeadStringString",
+ "StructHeadOmitEmptyStringString",
+ "StructPtrHeadStringString",
+ "StructPtrHeadOmitEmptyStringString",
+ "StructHeadNumberString",
+ "StructHeadOmitEmptyNumberString",
+ "StructPtrHeadNumberString",
+ "StructPtrHeadOmitEmptyNumberString",
+ "StructHeadIntPtr",
+ "StructHeadOmitEmptyIntPtr",
+ "StructPtrHeadIntPtr",
+ "StructPtrHeadOmitEmptyIntPtr",
+ "StructHeadUintPtr",
+ "StructHeadOmitEmptyUintPtr",
+ "StructPtrHeadUintPtr",
+ "StructPtrHeadOmitEmptyUintPtr",
+ "StructHeadFloat32Ptr",
+ "StructHeadOmitEmptyFloat32Ptr",
+ "StructPtrHeadFloat32Ptr",
+ "StructPtrHeadOmitEmptyFloat32Ptr",
+ "StructHeadFloat64Ptr",
+ "StructHeadOmitEmptyFloat64Ptr",
+ "StructPtrHeadFloat64Ptr",
+ "StructPtrHeadOmitEmptyFloat64Ptr",
+ "StructHeadBoolPtr",
+ "StructHeadOmitEmptyBoolPtr",
+ "StructPtrHeadBoolPtr",
+ "StructPtrHeadOmitEmptyBoolPtr",
+ "StructHeadStringPtr",
+ "StructHeadOmitEmptyStringPtr",
+ "StructPtrHeadStringPtr",
+ "StructPtrHeadOmitEmptyStringPtr",
+ "StructHeadBytesPtr",
+ "StructHeadOmitEmptyBytesPtr",
+ "StructPtrHeadBytesPtr",
+ "StructPtrHeadOmitEmptyBytesPtr",
+ "StructHeadNumberPtr",
+ "StructHeadOmitEmptyNumberPtr",
+ "StructPtrHeadNumberPtr",
+ "StructPtrHeadOmitEmptyNumberPtr",
+ "StructHeadArrayPtr",
+ "StructHeadOmitEmptyArrayPtr",
+ "StructPtrHeadArrayPtr",
+ "StructPtrHeadOmitEmptyArrayPtr",
+ "StructHeadMapPtr",
+ "StructHeadOmitEmptyMapPtr",
+ "StructPtrHeadMapPtr",
+ "StructPtrHeadOmitEmptyMapPtr",
+ "StructHeadSlicePtr",
+ "StructHeadOmitEmptySlicePtr",
+ "StructPtrHeadSlicePtr",
+ "StructPtrHeadOmitEmptySlicePtr",
+ "StructHeadMarshalJSONPtr",
+ "StructHeadOmitEmptyMarshalJSONPtr",
+ "StructPtrHeadMarshalJSONPtr",
+ "StructPtrHeadOmitEmptyMarshalJSONPtr",
+ "StructHeadMarshalTextPtr",
+ "StructHeadOmitEmptyMarshalTextPtr",
+ "StructPtrHeadMarshalTextPtr",
+ "StructPtrHeadOmitEmptyMarshalTextPtr",
+ "StructHeadInterfacePtr",
+ "StructHeadOmitEmptyInterfacePtr",
+ "StructPtrHeadInterfacePtr",
+ "StructPtrHeadOmitEmptyInterfacePtr",
+ "StructHeadIntPtrString",
+ "StructHeadOmitEmptyIntPtrString",
+ "StructPtrHeadIntPtrString",
+ "StructPtrHeadOmitEmptyIntPtrString",
+ "StructHeadUintPtrString",
+ "StructHeadOmitEmptyUintPtrString",
+ "StructPtrHeadUintPtrString",
+ "StructPtrHeadOmitEmptyUintPtrString",
+ "StructHeadFloat32PtrString",
+ "StructHeadOmitEmptyFloat32PtrString",
+ "StructPtrHeadFloat32PtrString",
+ "StructPtrHeadOmitEmptyFloat32PtrString",
+ "StructHeadFloat64PtrString",
+ "StructHeadOmitEmptyFloat64PtrString",
+ "StructPtrHeadFloat64PtrString",
+ "StructPtrHeadOmitEmptyFloat64PtrString",
+ "StructHeadBoolPtrString",
+ "StructHeadOmitEmptyBoolPtrString",
+ "StructPtrHeadBoolPtrString",
+ "StructPtrHeadOmitEmptyBoolPtrString",
+ "StructHeadStringPtrString",
+ "StructHeadOmitEmptyStringPtrString",
+ "StructPtrHeadStringPtrString",
+ "StructPtrHeadOmitEmptyStringPtrString",
+ "StructHeadNumberPtrString",
+ "StructHeadOmitEmptyNumberPtrString",
+ "StructPtrHeadNumberPtrString",
+ "StructPtrHeadOmitEmptyNumberPtrString",
+ "StructHead",
+ "StructHeadOmitEmpty",
+ "StructPtrHead",
+ "StructPtrHeadOmitEmpty",
+ "StructFieldInt",
+ "StructFieldOmitEmptyInt",
+ "StructEndInt",
+ "StructEndOmitEmptyInt",
+ "StructFieldUint",
+ "StructFieldOmitEmptyUint",
+ "StructEndUint",
+ "StructEndOmitEmptyUint",
+ "StructFieldFloat32",
+ "StructFieldOmitEmptyFloat32",
+ "StructEndFloat32",
+ "StructEndOmitEmptyFloat32",
+ "StructFieldFloat64",
+ "StructFieldOmitEmptyFloat64",
+ "StructEndFloat64",
+ "StructEndOmitEmptyFloat64",
+ "StructFieldBool",
+ "StructFieldOmitEmptyBool",
+ "StructEndBool",
+ "StructEndOmitEmptyBool",
+ "StructFieldString",
+ "StructFieldOmitEmptyString",
+ "StructEndString",
+ "StructEndOmitEmptyString",
+ "StructFieldBytes",
+ "StructFieldOmitEmptyBytes",
+ "StructEndBytes",
+ "StructEndOmitEmptyBytes",
+ "StructFieldNumber",
+ "StructFieldOmitEmptyNumber",
+ "StructEndNumber",
+ "StructEndOmitEmptyNumber",
+ "StructFieldArray",
+ "StructFieldOmitEmptyArray",
+ "StructEndArray",
+ "StructEndOmitEmptyArray",
+ "StructFieldMap",
+ "StructFieldOmitEmptyMap",
+ "StructEndMap",
+ "StructEndOmitEmptyMap",
+ "StructFieldSlice",
+ "StructFieldOmitEmptySlice",
+ "StructEndSlice",
+ "StructEndOmitEmptySlice",
+ "StructFieldStruct",
+ "StructFieldOmitEmptyStruct",
+ "StructEndStruct",
+ "StructEndOmitEmptyStruct",
+ "StructFieldMarshalJSON",
+ "StructFieldOmitEmptyMarshalJSON",
+ "StructEndMarshalJSON",
+ "StructEndOmitEmptyMarshalJSON",
+ "StructFieldMarshalText",
+ "StructFieldOmitEmptyMarshalText",
+ "StructEndMarshalText",
+ "StructEndOmitEmptyMarshalText",
+ "StructFieldIntString",
+ "StructFieldOmitEmptyIntString",
+ "StructEndIntString",
+ "StructEndOmitEmptyIntString",
+ "StructFieldUintString",
+ "StructFieldOmitEmptyUintString",
+ "StructEndUintString",
+ "StructEndOmitEmptyUintString",
+ "StructFieldFloat32String",
+ "StructFieldOmitEmptyFloat32String",
+ "StructEndFloat32String",
+ "StructEndOmitEmptyFloat32String",
+ "StructFieldFloat64String",
+ "StructFieldOmitEmptyFloat64String",
+ "StructEndFloat64String",
+ "StructEndOmitEmptyFloat64String",
+ "StructFieldBoolString",
+ "StructFieldOmitEmptyBoolString",
+ "StructEndBoolString",
+ "StructEndOmitEmptyBoolString",
+ "StructFieldStringString",
+ "StructFieldOmitEmptyStringString",
+ "StructEndStringString",
+ "StructEndOmitEmptyStringString",
+ "StructFieldNumberString",
+ "StructFieldOmitEmptyNumberString",
+ "StructEndNumberString",
+ "StructEndOmitEmptyNumberString",
+ "StructFieldIntPtr",
+ "StructFieldOmitEmptyIntPtr",
+ "StructEndIntPtr",
+ "StructEndOmitEmptyIntPtr",
+ "StructFieldUintPtr",
+ "StructFieldOmitEmptyUintPtr",
+ "StructEndUintPtr",
+ "StructEndOmitEmptyUintPtr",
+ "StructFieldFloat32Ptr",
+ "StructFieldOmitEmptyFloat32Ptr",
+ "StructEndFloat32Ptr",
+ "StructEndOmitEmptyFloat32Ptr",
+ "StructFieldFloat64Ptr",
+ "StructFieldOmitEmptyFloat64Ptr",
+ "StructEndFloat64Ptr",
+ "StructEndOmitEmptyFloat64Ptr",
+ "StructFieldBoolPtr",
+ "StructFieldOmitEmptyBoolPtr",
+ "StructEndBoolPtr",
+ "StructEndOmitEmptyBoolPtr",
+ "StructFieldStringPtr",
+ "StructFieldOmitEmptyStringPtr",
+ "StructEndStringPtr",
+ "StructEndOmitEmptyStringPtr",
+ "StructFieldBytesPtr",
+ "StructFieldOmitEmptyBytesPtr",
+ "StructEndBytesPtr",
+ "StructEndOmitEmptyBytesPtr",
+ "StructFieldNumberPtr",
+ "StructFieldOmitEmptyNumberPtr",
+ "StructEndNumberPtr",
+ "StructEndOmitEmptyNumberPtr",
+ "StructFieldArrayPtr",
+ "StructFieldOmitEmptyArrayPtr",
+ "StructEndArrayPtr",
+ "StructEndOmitEmptyArrayPtr",
+ "StructFieldMapPtr",
+ "StructFieldOmitEmptyMapPtr",
+ "StructEndMapPtr",
+ "StructEndOmitEmptyMapPtr",
+ "StructFieldSlicePtr",
+ "StructFieldOmitEmptySlicePtr",
+ "StructEndSlicePtr",
+ "StructEndOmitEmptySlicePtr",
+ "StructFieldMarshalJSONPtr",
+ "StructFieldOmitEmptyMarshalJSONPtr",
+ "StructEndMarshalJSONPtr",
+ "StructEndOmitEmptyMarshalJSONPtr",
+ "StructFieldMarshalTextPtr",
+ "StructFieldOmitEmptyMarshalTextPtr",
+ "StructEndMarshalTextPtr",
+ "StructEndOmitEmptyMarshalTextPtr",
+ "StructFieldInterfacePtr",
+ "StructFieldOmitEmptyInterfacePtr",
+ "StructEndInterfacePtr",
+ "StructEndOmitEmptyInterfacePtr",
+ "StructFieldIntPtrString",
+ "StructFieldOmitEmptyIntPtrString",
+ "StructEndIntPtrString",
+ "StructEndOmitEmptyIntPtrString",
+ "StructFieldUintPtrString",
+ "StructFieldOmitEmptyUintPtrString",
+ "StructEndUintPtrString",
+ "StructEndOmitEmptyUintPtrString",
+ "StructFieldFloat32PtrString",
+ "StructFieldOmitEmptyFloat32PtrString",
+ "StructEndFloat32PtrString",
+ "StructEndOmitEmptyFloat32PtrString",
+ "StructFieldFloat64PtrString",
+ "StructFieldOmitEmptyFloat64PtrString",
+ "StructEndFloat64PtrString",
+ "StructEndOmitEmptyFloat64PtrString",
+ "StructFieldBoolPtrString",
+ "StructFieldOmitEmptyBoolPtrString",
+ "StructEndBoolPtrString",
+ "StructEndOmitEmptyBoolPtrString",
+ "StructFieldStringPtrString",
+ "StructFieldOmitEmptyStringPtrString",
+ "StructEndStringPtrString",
+ "StructEndOmitEmptyStringPtrString",
+ "StructFieldNumberPtrString",
+ "StructFieldOmitEmptyNumberPtrString",
+ "StructEndNumberPtrString",
+ "StructEndOmitEmptyNumberPtrString",
+ "StructField",
+ "StructFieldOmitEmpty",
+ "StructEnd",
+ "StructEndOmitEmpty",
+}
+
+type OpType int
+
+const (
+ OpEnd OpType = 0
+ OpInterface OpType = 1
+ OpPtr OpType = 2
+ OpSliceElem OpType = 3
+ OpSliceEnd OpType = 4
+ OpArrayElem OpType = 5
+ OpArrayEnd OpType = 6
+ OpMapKey OpType = 7
+ OpMapValue OpType = 8
+ OpMapEnd OpType = 9
+ OpRecursive OpType = 10
+ OpRecursivePtr OpType = 11
+ OpRecursiveEnd OpType = 12
+ OpStructAnonymousEnd OpType = 13
+ OpInt OpType = 14
+ OpUint OpType = 15
+ OpFloat32 OpType = 16
+ OpFloat64 OpType = 17
+ OpBool OpType = 18
+ OpString OpType = 19
+ OpBytes OpType = 20
+ OpNumber OpType = 21
+ OpArray OpType = 22
+ OpMap OpType = 23
+ OpSlice OpType = 24
+ OpStruct OpType = 25
+ OpMarshalJSON OpType = 26
+ OpMarshalText OpType = 27
+ OpIntString OpType = 28
+ OpUintString OpType = 29
+ OpFloat32String OpType = 30
+ OpFloat64String OpType = 31
+ OpBoolString OpType = 32
+ OpStringString OpType = 33
+ OpNumberString OpType = 34
+ OpIntPtr OpType = 35
+ OpUintPtr OpType = 36
+ OpFloat32Ptr OpType = 37
+ OpFloat64Ptr OpType = 38
+ OpBoolPtr OpType = 39
+ OpStringPtr OpType = 40
+ OpBytesPtr OpType = 41
+ OpNumberPtr OpType = 42
+ OpArrayPtr OpType = 43
+ OpMapPtr OpType = 44
+ OpSlicePtr OpType = 45
+ OpMarshalJSONPtr OpType = 46
+ OpMarshalTextPtr OpType = 47
+ OpInterfacePtr OpType = 48
+ OpIntPtrString OpType = 49
+ OpUintPtrString OpType = 50
+ OpFloat32PtrString OpType = 51
+ OpFloat64PtrString OpType = 52
+ OpBoolPtrString OpType = 53
+ OpStringPtrString OpType = 54
+ OpNumberPtrString OpType = 55
+ OpStructHeadInt OpType = 56
+ OpStructHeadOmitEmptyInt OpType = 57
+ OpStructPtrHeadInt OpType = 58
+ OpStructPtrHeadOmitEmptyInt OpType = 59
+ OpStructHeadUint OpType = 60
+ OpStructHeadOmitEmptyUint OpType = 61
+ OpStructPtrHeadUint OpType = 62
+ OpStructPtrHeadOmitEmptyUint OpType = 63
+ OpStructHeadFloat32 OpType = 64
+ OpStructHeadOmitEmptyFloat32 OpType = 65
+ OpStructPtrHeadFloat32 OpType = 66
+ OpStructPtrHeadOmitEmptyFloat32 OpType = 67
+ OpStructHeadFloat64 OpType = 68
+ OpStructHeadOmitEmptyFloat64 OpType = 69
+ OpStructPtrHeadFloat64 OpType = 70
+ OpStructPtrHeadOmitEmptyFloat64 OpType = 71
+ OpStructHeadBool OpType = 72
+ OpStructHeadOmitEmptyBool OpType = 73
+ OpStructPtrHeadBool OpType = 74
+ OpStructPtrHeadOmitEmptyBool OpType = 75
+ OpStructHeadString OpType = 76
+ OpStructHeadOmitEmptyString OpType = 77
+ OpStructPtrHeadString OpType = 78
+ OpStructPtrHeadOmitEmptyString OpType = 79
+ OpStructHeadBytes OpType = 80
+ OpStructHeadOmitEmptyBytes OpType = 81
+ OpStructPtrHeadBytes OpType = 82
+ OpStructPtrHeadOmitEmptyBytes OpType = 83
+ OpStructHeadNumber OpType = 84
+ OpStructHeadOmitEmptyNumber OpType = 85
+ OpStructPtrHeadNumber OpType = 86
+ OpStructPtrHeadOmitEmptyNumber OpType = 87
+ OpStructHeadArray OpType = 88
+ OpStructHeadOmitEmptyArray OpType = 89
+ OpStructPtrHeadArray OpType = 90
+ OpStructPtrHeadOmitEmptyArray OpType = 91
+ OpStructHeadMap OpType = 92
+ OpStructHeadOmitEmptyMap OpType = 93
+ OpStructPtrHeadMap OpType = 94
+ OpStructPtrHeadOmitEmptyMap OpType = 95
+ OpStructHeadSlice OpType = 96
+ OpStructHeadOmitEmptySlice OpType = 97
+ OpStructPtrHeadSlice OpType = 98
+ OpStructPtrHeadOmitEmptySlice OpType = 99
+ OpStructHeadStruct OpType = 100
+ OpStructHeadOmitEmptyStruct OpType = 101
+ OpStructPtrHeadStruct OpType = 102
+ OpStructPtrHeadOmitEmptyStruct OpType = 103
+ OpStructHeadMarshalJSON OpType = 104
+ OpStructHeadOmitEmptyMarshalJSON OpType = 105
+ OpStructPtrHeadMarshalJSON OpType = 106
+ OpStructPtrHeadOmitEmptyMarshalJSON OpType = 107
+ OpStructHeadMarshalText OpType = 108
+ OpStructHeadOmitEmptyMarshalText OpType = 109
+ OpStructPtrHeadMarshalText OpType = 110
+ OpStructPtrHeadOmitEmptyMarshalText OpType = 111
+ OpStructHeadIntString OpType = 112
+ OpStructHeadOmitEmptyIntString OpType = 113
+ OpStructPtrHeadIntString OpType = 114
+ OpStructPtrHeadOmitEmptyIntString OpType = 115
+ OpStructHeadUintString OpType = 116
+ OpStructHeadOmitEmptyUintString OpType = 117
+ OpStructPtrHeadUintString OpType = 118
+ OpStructPtrHeadOmitEmptyUintString OpType = 119
+ OpStructHeadFloat32String OpType = 120
+ OpStructHeadOmitEmptyFloat32String OpType = 121
+ OpStructPtrHeadFloat32String OpType = 122
+ OpStructPtrHeadOmitEmptyFloat32String OpType = 123
+ OpStructHeadFloat64String OpType = 124
+ OpStructHeadOmitEmptyFloat64String OpType = 125
+ OpStructPtrHeadFloat64String OpType = 126
+ OpStructPtrHeadOmitEmptyFloat64String OpType = 127
+ OpStructHeadBoolString OpType = 128
+ OpStructHeadOmitEmptyBoolString OpType = 129
+ OpStructPtrHeadBoolString OpType = 130
+ OpStructPtrHeadOmitEmptyBoolString OpType = 131
+ OpStructHeadStringString OpType = 132
+ OpStructHeadOmitEmptyStringString OpType = 133
+ OpStructPtrHeadStringString OpType = 134
+ OpStructPtrHeadOmitEmptyStringString OpType = 135
+ OpStructHeadNumberString OpType = 136
+ OpStructHeadOmitEmptyNumberString OpType = 137
+ OpStructPtrHeadNumberString OpType = 138
+ OpStructPtrHeadOmitEmptyNumberString OpType = 139
+ OpStructHeadIntPtr OpType = 140
+ OpStructHeadOmitEmptyIntPtr OpType = 141
+ OpStructPtrHeadIntPtr OpType = 142
+ OpStructPtrHeadOmitEmptyIntPtr OpType = 143
+ OpStructHeadUintPtr OpType = 144
+ OpStructHeadOmitEmptyUintPtr OpType = 145
+ OpStructPtrHeadUintPtr OpType = 146
+ OpStructPtrHeadOmitEmptyUintPtr OpType = 147
+ OpStructHeadFloat32Ptr OpType = 148
+ OpStructHeadOmitEmptyFloat32Ptr OpType = 149
+ OpStructPtrHeadFloat32Ptr OpType = 150
+ OpStructPtrHeadOmitEmptyFloat32Ptr OpType = 151
+ OpStructHeadFloat64Ptr OpType = 152
+ OpStructHeadOmitEmptyFloat64Ptr OpType = 153
+ OpStructPtrHeadFloat64Ptr OpType = 154
+ OpStructPtrHeadOmitEmptyFloat64Ptr OpType = 155
+ OpStructHeadBoolPtr OpType = 156
+ OpStructHeadOmitEmptyBoolPtr OpType = 157
+ OpStructPtrHeadBoolPtr OpType = 158
+ OpStructPtrHeadOmitEmptyBoolPtr OpType = 159
+ OpStructHeadStringPtr OpType = 160
+ OpStructHeadOmitEmptyStringPtr OpType = 161
+ OpStructPtrHeadStringPtr OpType = 162
+ OpStructPtrHeadOmitEmptyStringPtr OpType = 163
+ OpStructHeadBytesPtr OpType = 164
+ OpStructHeadOmitEmptyBytesPtr OpType = 165
+ OpStructPtrHeadBytesPtr OpType = 166
+ OpStructPtrHeadOmitEmptyBytesPtr OpType = 167
+ OpStructHeadNumberPtr OpType = 168
+ OpStructHeadOmitEmptyNumberPtr OpType = 169
+ OpStructPtrHeadNumberPtr OpType = 170
+ OpStructPtrHeadOmitEmptyNumberPtr OpType = 171
+ OpStructHeadArrayPtr OpType = 172
+ OpStructHeadOmitEmptyArrayPtr OpType = 173
+ OpStructPtrHeadArrayPtr OpType = 174
+ OpStructPtrHeadOmitEmptyArrayPtr OpType = 175
+ OpStructHeadMapPtr OpType = 176
+ OpStructHeadOmitEmptyMapPtr OpType = 177
+ OpStructPtrHeadMapPtr OpType = 178
+ OpStructPtrHeadOmitEmptyMapPtr OpType = 179
+ OpStructHeadSlicePtr OpType = 180
+ OpStructHeadOmitEmptySlicePtr OpType = 181
+ OpStructPtrHeadSlicePtr OpType = 182
+ OpStructPtrHeadOmitEmptySlicePtr OpType = 183
+ OpStructHeadMarshalJSONPtr OpType = 184
+ OpStructHeadOmitEmptyMarshalJSONPtr OpType = 185
+ OpStructPtrHeadMarshalJSONPtr OpType = 186
+ OpStructPtrHeadOmitEmptyMarshalJSONPtr OpType = 187
+ OpStructHeadMarshalTextPtr OpType = 188
+ OpStructHeadOmitEmptyMarshalTextPtr OpType = 189
+ OpStructPtrHeadMarshalTextPtr OpType = 190
+ OpStructPtrHeadOmitEmptyMarshalTextPtr OpType = 191
+ OpStructHeadInterfacePtr OpType = 192
+ OpStructHeadOmitEmptyInterfacePtr OpType = 193
+ OpStructPtrHeadInterfacePtr OpType = 194
+ OpStructPtrHeadOmitEmptyInterfacePtr OpType = 195
+ OpStructHeadIntPtrString OpType = 196
+ OpStructHeadOmitEmptyIntPtrString OpType = 197
+ OpStructPtrHeadIntPtrString OpType = 198
+ OpStructPtrHeadOmitEmptyIntPtrString OpType = 199
+ OpStructHeadUintPtrString OpType = 200
+ OpStructHeadOmitEmptyUintPtrString OpType = 201
+ OpStructPtrHeadUintPtrString OpType = 202
+ OpStructPtrHeadOmitEmptyUintPtrString OpType = 203
+ OpStructHeadFloat32PtrString OpType = 204
+ OpStructHeadOmitEmptyFloat32PtrString OpType = 205
+ OpStructPtrHeadFloat32PtrString OpType = 206
+ OpStructPtrHeadOmitEmptyFloat32PtrString OpType = 207
+ OpStructHeadFloat64PtrString OpType = 208
+ OpStructHeadOmitEmptyFloat64PtrString OpType = 209
+ OpStructPtrHeadFloat64PtrString OpType = 210
+ OpStructPtrHeadOmitEmptyFloat64PtrString OpType = 211
+ OpStructHeadBoolPtrString OpType = 212
+ OpStructHeadOmitEmptyBoolPtrString OpType = 213
+ OpStructPtrHeadBoolPtrString OpType = 214
+ OpStructPtrHeadOmitEmptyBoolPtrString OpType = 215
+ OpStructHeadStringPtrString OpType = 216
+ OpStructHeadOmitEmptyStringPtrString OpType = 217
+ OpStructPtrHeadStringPtrString OpType = 218
+ OpStructPtrHeadOmitEmptyStringPtrString OpType = 219
+ OpStructHeadNumberPtrString OpType = 220
+ OpStructHeadOmitEmptyNumberPtrString OpType = 221
+ OpStructPtrHeadNumberPtrString OpType = 222
+ OpStructPtrHeadOmitEmptyNumberPtrString OpType = 223
+ OpStructHead OpType = 224
+ OpStructHeadOmitEmpty OpType = 225
+ OpStructPtrHead OpType = 226
+ OpStructPtrHeadOmitEmpty OpType = 227
+ OpStructFieldInt OpType = 228
+ OpStructFieldOmitEmptyInt OpType = 229
+ OpStructEndInt OpType = 230
+ OpStructEndOmitEmptyInt OpType = 231
+ OpStructFieldUint OpType = 232
+ OpStructFieldOmitEmptyUint OpType = 233
+ OpStructEndUint OpType = 234
+ OpStructEndOmitEmptyUint OpType = 235
+ OpStructFieldFloat32 OpType = 236
+ OpStructFieldOmitEmptyFloat32 OpType = 237
+ OpStructEndFloat32 OpType = 238
+ OpStructEndOmitEmptyFloat32 OpType = 239
+ OpStructFieldFloat64 OpType = 240
+ OpStructFieldOmitEmptyFloat64 OpType = 241
+ OpStructEndFloat64 OpType = 242
+ OpStructEndOmitEmptyFloat64 OpType = 243
+ OpStructFieldBool OpType = 244
+ OpStructFieldOmitEmptyBool OpType = 245
+ OpStructEndBool OpType = 246
+ OpStructEndOmitEmptyBool OpType = 247
+ OpStructFieldString OpType = 248
+ OpStructFieldOmitEmptyString OpType = 249
+ OpStructEndString OpType = 250
+ OpStructEndOmitEmptyString OpType = 251
+ OpStructFieldBytes OpType = 252
+ OpStructFieldOmitEmptyBytes OpType = 253
+ OpStructEndBytes OpType = 254
+ OpStructEndOmitEmptyBytes OpType = 255
+ OpStructFieldNumber OpType = 256
+ OpStructFieldOmitEmptyNumber OpType = 257
+ OpStructEndNumber OpType = 258
+ OpStructEndOmitEmptyNumber OpType = 259
+ OpStructFieldArray OpType = 260
+ OpStructFieldOmitEmptyArray OpType = 261
+ OpStructEndArray OpType = 262
+ OpStructEndOmitEmptyArray OpType = 263
+ OpStructFieldMap OpType = 264
+ OpStructFieldOmitEmptyMap OpType = 265
+ OpStructEndMap OpType = 266
+ OpStructEndOmitEmptyMap OpType = 267
+ OpStructFieldSlice OpType = 268
+ OpStructFieldOmitEmptySlice OpType = 269
+ OpStructEndSlice OpType = 270
+ OpStructEndOmitEmptySlice OpType = 271
+ OpStructFieldStruct OpType = 272
+ OpStructFieldOmitEmptyStruct OpType = 273
+ OpStructEndStruct OpType = 274
+ OpStructEndOmitEmptyStruct OpType = 275
+ OpStructFieldMarshalJSON OpType = 276
+ OpStructFieldOmitEmptyMarshalJSON OpType = 277
+ OpStructEndMarshalJSON OpType = 278
+ OpStructEndOmitEmptyMarshalJSON OpType = 279
+ OpStructFieldMarshalText OpType = 280
+ OpStructFieldOmitEmptyMarshalText OpType = 281
+ OpStructEndMarshalText OpType = 282
+ OpStructEndOmitEmptyMarshalText OpType = 283
+ OpStructFieldIntString OpType = 284
+ OpStructFieldOmitEmptyIntString OpType = 285
+ OpStructEndIntString OpType = 286
+ OpStructEndOmitEmptyIntString OpType = 287
+ OpStructFieldUintString OpType = 288
+ OpStructFieldOmitEmptyUintString OpType = 289
+ OpStructEndUintString OpType = 290
+ OpStructEndOmitEmptyUintString OpType = 291
+ OpStructFieldFloat32String OpType = 292
+ OpStructFieldOmitEmptyFloat32String OpType = 293
+ OpStructEndFloat32String OpType = 294
+ OpStructEndOmitEmptyFloat32String OpType = 295
+ OpStructFieldFloat64String OpType = 296
+ OpStructFieldOmitEmptyFloat64String OpType = 297
+ OpStructEndFloat64String OpType = 298
+ OpStructEndOmitEmptyFloat64String OpType = 299
+ OpStructFieldBoolString OpType = 300
+ OpStructFieldOmitEmptyBoolString OpType = 301
+ OpStructEndBoolString OpType = 302
+ OpStructEndOmitEmptyBoolString OpType = 303
+ OpStructFieldStringString OpType = 304
+ OpStructFieldOmitEmptyStringString OpType = 305
+ OpStructEndStringString OpType = 306
+ OpStructEndOmitEmptyStringString OpType = 307
+ OpStructFieldNumberString OpType = 308
+ OpStructFieldOmitEmptyNumberString OpType = 309
+ OpStructEndNumberString OpType = 310
+ OpStructEndOmitEmptyNumberString OpType = 311
+ OpStructFieldIntPtr OpType = 312
+ OpStructFieldOmitEmptyIntPtr OpType = 313
+ OpStructEndIntPtr OpType = 314
+ OpStructEndOmitEmptyIntPtr OpType = 315
+ OpStructFieldUintPtr OpType = 316
+ OpStructFieldOmitEmptyUintPtr OpType = 317
+ OpStructEndUintPtr OpType = 318
+ OpStructEndOmitEmptyUintPtr OpType = 319
+ OpStructFieldFloat32Ptr OpType = 320
+ OpStructFieldOmitEmptyFloat32Ptr OpType = 321
+ OpStructEndFloat32Ptr OpType = 322
+ OpStructEndOmitEmptyFloat32Ptr OpType = 323
+ OpStructFieldFloat64Ptr OpType = 324
+ OpStructFieldOmitEmptyFloat64Ptr OpType = 325
+ OpStructEndFloat64Ptr OpType = 326
+ OpStructEndOmitEmptyFloat64Ptr OpType = 327
+ OpStructFieldBoolPtr OpType = 328
+ OpStructFieldOmitEmptyBoolPtr OpType = 329
+ OpStructEndBoolPtr OpType = 330
+ OpStructEndOmitEmptyBoolPtr OpType = 331
+ OpStructFieldStringPtr OpType = 332
+ OpStructFieldOmitEmptyStringPtr OpType = 333
+ OpStructEndStringPtr OpType = 334
+ OpStructEndOmitEmptyStringPtr OpType = 335
+ OpStructFieldBytesPtr OpType = 336
+ OpStructFieldOmitEmptyBytesPtr OpType = 337
+ OpStructEndBytesPtr OpType = 338
+ OpStructEndOmitEmptyBytesPtr OpType = 339
+ OpStructFieldNumberPtr OpType = 340
+ OpStructFieldOmitEmptyNumberPtr OpType = 341
+ OpStructEndNumberPtr OpType = 342
+ OpStructEndOmitEmptyNumberPtr OpType = 343
+ OpStructFieldArrayPtr OpType = 344
+ OpStructFieldOmitEmptyArrayPtr OpType = 345
+ OpStructEndArrayPtr OpType = 346
+ OpStructEndOmitEmptyArrayPtr OpType = 347
+ OpStructFieldMapPtr OpType = 348
+ OpStructFieldOmitEmptyMapPtr OpType = 349
+ OpStructEndMapPtr OpType = 350
+ OpStructEndOmitEmptyMapPtr OpType = 351
+ OpStructFieldSlicePtr OpType = 352
+ OpStructFieldOmitEmptySlicePtr OpType = 353
+ OpStructEndSlicePtr OpType = 354
+ OpStructEndOmitEmptySlicePtr OpType = 355
+ OpStructFieldMarshalJSONPtr OpType = 356
+ OpStructFieldOmitEmptyMarshalJSONPtr OpType = 357
+ OpStructEndMarshalJSONPtr OpType = 358
+ OpStructEndOmitEmptyMarshalJSONPtr OpType = 359
+ OpStructFieldMarshalTextPtr OpType = 360
+ OpStructFieldOmitEmptyMarshalTextPtr OpType = 361
+ OpStructEndMarshalTextPtr OpType = 362
+ OpStructEndOmitEmptyMarshalTextPtr OpType = 363
+ OpStructFieldInterfacePtr OpType = 364
+ OpStructFieldOmitEmptyInterfacePtr OpType = 365
+ OpStructEndInterfacePtr OpType = 366
+ OpStructEndOmitEmptyInterfacePtr OpType = 367
+ OpStructFieldIntPtrString OpType = 368
+ OpStructFieldOmitEmptyIntPtrString OpType = 369
+ OpStructEndIntPtrString OpType = 370
+ OpStructEndOmitEmptyIntPtrString OpType = 371
+ OpStructFieldUintPtrString OpType = 372
+ OpStructFieldOmitEmptyUintPtrString OpType = 373
+ OpStructEndUintPtrString OpType = 374
+ OpStructEndOmitEmptyUintPtrString OpType = 375
+ OpStructFieldFloat32PtrString OpType = 376
+ OpStructFieldOmitEmptyFloat32PtrString OpType = 377
+ OpStructEndFloat32PtrString OpType = 378
+ OpStructEndOmitEmptyFloat32PtrString OpType = 379
+ OpStructFieldFloat64PtrString OpType = 380
+ OpStructFieldOmitEmptyFloat64PtrString OpType = 381
+ OpStructEndFloat64PtrString OpType = 382
+ OpStructEndOmitEmptyFloat64PtrString OpType = 383
+ OpStructFieldBoolPtrString OpType = 384
+ OpStructFieldOmitEmptyBoolPtrString OpType = 385
+ OpStructEndBoolPtrString OpType = 386
+ OpStructEndOmitEmptyBoolPtrString OpType = 387
+ OpStructFieldStringPtrString OpType = 388
+ OpStructFieldOmitEmptyStringPtrString OpType = 389
+ OpStructEndStringPtrString OpType = 390
+ OpStructEndOmitEmptyStringPtrString OpType = 391
+ OpStructFieldNumberPtrString OpType = 392
+ OpStructFieldOmitEmptyNumberPtrString OpType = 393
+ OpStructEndNumberPtrString OpType = 394
+ OpStructEndOmitEmptyNumberPtrString OpType = 395
+ OpStructField OpType = 396
+ OpStructFieldOmitEmpty OpType = 397
+ OpStructEnd OpType = 398
+ OpStructEndOmitEmpty OpType = 399
+)
+
+func (t OpType) String() string {
+ if int(t) >= 400 {
+ return ""
+ }
+ return opTypeStrings[int(t)]
+}
+
+func (t OpType) CodeType() CodeType {
+ if strings.Contains(t.String(), "Struct") {
+ if strings.Contains(t.String(), "End") {
+ return CodeStructEnd
+ }
+ return CodeStructField
+ }
+ switch t {
+ case OpArray, OpArrayPtr:
+ return CodeArrayHead
+ case OpArrayElem:
+ return CodeArrayElem
+ case OpSlice, OpSlicePtr:
+ return CodeSliceHead
+ case OpSliceElem:
+ return CodeSliceElem
+ case OpMap, OpMapPtr:
+ return CodeMapHead
+ case OpMapKey:
+ return CodeMapKey
+ case OpMapValue:
+ return CodeMapValue
+ case OpMapEnd:
+ return CodeMapEnd
+ }
+
+ return CodeOp
+}
+
+func (t OpType) HeadToPtrHead() OpType {
+ if strings.Index(t.String(), "PtrHead") > 0 {
+ return t
+ }
+
+ idx := strings.Index(t.String(), "Head")
+ if idx == -1 {
+ return t
+ }
+ suffix := "PtrHead" + t.String()[idx+len("Head"):]
+
+ const toPtrOffset = 2
+ if strings.Contains(OpType(int(t)+toPtrOffset).String(), suffix) {
+ return OpType(int(t) + toPtrOffset)
+ }
+ return t
+}
+
+func (t OpType) HeadToOmitEmptyHead() OpType {
+ const toOmitEmptyOffset = 1
+ if strings.Contains(OpType(int(t)+toOmitEmptyOffset).String(), "OmitEmpty") {
+ return OpType(int(t) + toOmitEmptyOffset)
+ }
+
+ return t
+}
+
+func (t OpType) PtrHeadToHead() OpType {
+ idx := strings.Index(t.String(), "Ptr")
+ if idx == -1 {
+ return t
+ }
+ suffix := t.String()[idx+len("Ptr"):]
+
+ const toPtrOffset = 2
+ if strings.Contains(OpType(int(t)-toPtrOffset).String(), suffix) {
+ return OpType(int(t) - toPtrOffset)
+ }
+ return t
+}
+
+func (t OpType) FieldToEnd() OpType {
+ idx := strings.Index(t.String(), "Field")
+ if idx == -1 {
+ return t
+ }
+ suffix := t.String()[idx+len("Field"):]
+ if suffix == "" || suffix == "OmitEmpty" {
+ return t
+ }
+ const toEndOffset = 2
+ if strings.Contains(OpType(int(t)+toEndOffset).String(), "End"+suffix) {
+ return OpType(int(t) + toEndOffset)
+ }
+ return t
+}
+
+func (t OpType) FieldToOmitEmptyField() OpType {
+ const toOmitEmptyOffset = 1
+ if strings.Contains(OpType(int(t)+toOmitEmptyOffset).String(), "OmitEmpty") {
+ return OpType(int(t) + toOmitEmptyOffset)
+ }
+ return t
+}
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/string.go b/vendor/github.com/goccy/go-json/internal/encoder/string.go
new file mode 100644
index 000000000..26da31a5e
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/string.go
@@ -0,0 +1,637 @@
+package encoder
+
+import (
+ "math/bits"
+ "reflect"
+ "unicode/utf8"
+ "unsafe"
+)
+
+const (
+ lsb = 0x0101010101010101
+ msb = 0x8080808080808080
+)
+
+var needEscapeWithHTML = [256]bool{
+ '"': true,
+ '&': true,
+ '<': true,
+ '>': true,
+ '\\': true,
+ 0x00: true,
+ 0x01: true,
+ 0x02: true,
+ 0x03: true,
+ 0x04: true,
+ 0x05: true,
+ 0x06: true,
+ 0x07: true,
+ 0x08: true,
+ 0x09: true,
+ 0x0a: true,
+ 0x0b: true,
+ 0x0c: true,
+ 0x0d: true,
+ 0x0e: true,
+ 0x0f: true,
+ 0x10: true,
+ 0x11: true,
+ 0x12: true,
+ 0x13: true,
+ 0x14: true,
+ 0x15: true,
+ 0x16: true,
+ 0x17: true,
+ 0x18: true,
+ 0x19: true,
+ 0x1a: true,
+ 0x1b: true,
+ 0x1c: true,
+ 0x1d: true,
+ 0x1e: true,
+ 0x1f: true,
+ /* 0x20 - 0x7f */
+ 0x80: true,
+ 0x81: true,
+ 0x82: true,
+ 0x83: true,
+ 0x84: true,
+ 0x85: true,
+ 0x86: true,
+ 0x87: true,
+ 0x88: true,
+ 0x89: true,
+ 0x8a: true,
+ 0x8b: true,
+ 0x8c: true,
+ 0x8d: true,
+ 0x8e: true,
+ 0x8f: true,
+ 0x90: true,
+ 0x91: true,
+ 0x92: true,
+ 0x93: true,
+ 0x94: true,
+ 0x95: true,
+ 0x96: true,
+ 0x97: true,
+ 0x98: true,
+ 0x99: true,
+ 0x9a: true,
+ 0x9b: true,
+ 0x9c: true,
+ 0x9d: true,
+ 0x9e: true,
+ 0x9f: true,
+ 0xa0: true,
+ 0xa1: true,
+ 0xa2: true,
+ 0xa3: true,
+ 0xa4: true,
+ 0xa5: true,
+ 0xa6: true,
+ 0xa7: true,
+ 0xa8: true,
+ 0xa9: true,
+ 0xaa: true,
+ 0xab: true,
+ 0xac: true,
+ 0xad: true,
+ 0xae: true,
+ 0xaf: true,
+ 0xb0: true,
+ 0xb1: true,
+ 0xb2: true,
+ 0xb3: true,
+ 0xb4: true,
+ 0xb5: true,
+ 0xb6: true,
+ 0xb7: true,
+ 0xb8: true,
+ 0xb9: true,
+ 0xba: true,
+ 0xbb: true,
+ 0xbc: true,
+ 0xbd: true,
+ 0xbe: true,
+ 0xbf: true,
+ 0xc0: true,
+ 0xc1: true,
+ 0xc2: true,
+ 0xc3: true,
+ 0xc4: true,
+ 0xc5: true,
+ 0xc6: true,
+ 0xc7: true,
+ 0xc8: true,
+ 0xc9: true,
+ 0xca: true,
+ 0xcb: true,
+ 0xcc: true,
+ 0xcd: true,
+ 0xce: true,
+ 0xcf: true,
+ 0xd0: true,
+ 0xd1: true,
+ 0xd2: true,
+ 0xd3: true,
+ 0xd4: true,
+ 0xd5: true,
+ 0xd6: true,
+ 0xd7: true,
+ 0xd8: true,
+ 0xd9: true,
+ 0xda: true,
+ 0xdb: true,
+ 0xdc: true,
+ 0xdd: true,
+ 0xde: true,
+ 0xdf: true,
+ 0xe0: true,
+ 0xe1: true,
+ 0xe2: true,
+ 0xe3: true,
+ 0xe4: true,
+ 0xe5: true,
+ 0xe6: true,
+ 0xe7: true,
+ 0xe8: true,
+ 0xe9: true,
+ 0xea: true,
+ 0xeb: true,
+ 0xec: true,
+ 0xed: true,
+ 0xee: true,
+ 0xef: true,
+ 0xf0: true,
+ 0xf1: true,
+ 0xf2: true,
+ 0xf3: true,
+ 0xf4: true,
+ 0xf5: true,
+ 0xf6: true,
+ 0xf7: true,
+ 0xf8: true,
+ 0xf9: true,
+ 0xfa: true,
+ 0xfb: true,
+ 0xfc: true,
+ 0xfd: true,
+ 0xfe: true,
+ 0xff: true,
+}
+
+var needEscape = [256]bool{
+ '"': true,
+ '\\': true,
+ 0x00: true,
+ 0x01: true,
+ 0x02: true,
+ 0x03: true,
+ 0x04: true,
+ 0x05: true,
+ 0x06: true,
+ 0x07: true,
+ 0x08: true,
+ 0x09: true,
+ 0x0a: true,
+ 0x0b: true,
+ 0x0c: true,
+ 0x0d: true,
+ 0x0e: true,
+ 0x0f: true,
+ 0x10: true,
+ 0x11: true,
+ 0x12: true,
+ 0x13: true,
+ 0x14: true,
+ 0x15: true,
+ 0x16: true,
+ 0x17: true,
+ 0x18: true,
+ 0x19: true,
+ 0x1a: true,
+ 0x1b: true,
+ 0x1c: true,
+ 0x1d: true,
+ 0x1e: true,
+ 0x1f: true,
+ /* 0x20 - 0x7f */
+ 0x80: true,
+ 0x81: true,
+ 0x82: true,
+ 0x83: true,
+ 0x84: true,
+ 0x85: true,
+ 0x86: true,
+ 0x87: true,
+ 0x88: true,
+ 0x89: true,
+ 0x8a: true,
+ 0x8b: true,
+ 0x8c: true,
+ 0x8d: true,
+ 0x8e: true,
+ 0x8f: true,
+ 0x90: true,
+ 0x91: true,
+ 0x92: true,
+ 0x93: true,
+ 0x94: true,
+ 0x95: true,
+ 0x96: true,
+ 0x97: true,
+ 0x98: true,
+ 0x99: true,
+ 0x9a: true,
+ 0x9b: true,
+ 0x9c: true,
+ 0x9d: true,
+ 0x9e: true,
+ 0x9f: true,
+ 0xa0: true,
+ 0xa1: true,
+ 0xa2: true,
+ 0xa3: true,
+ 0xa4: true,
+ 0xa5: true,
+ 0xa6: true,
+ 0xa7: true,
+ 0xa8: true,
+ 0xa9: true,
+ 0xaa: true,
+ 0xab: true,
+ 0xac: true,
+ 0xad: true,
+ 0xae: true,
+ 0xaf: true,
+ 0xb0: true,
+ 0xb1: true,
+ 0xb2: true,
+ 0xb3: true,
+ 0xb4: true,
+ 0xb5: true,
+ 0xb6: true,
+ 0xb7: true,
+ 0xb8: true,
+ 0xb9: true,
+ 0xba: true,
+ 0xbb: true,
+ 0xbc: true,
+ 0xbd: true,
+ 0xbe: true,
+ 0xbf: true,
+ 0xc0: true,
+ 0xc1: true,
+ 0xc2: true,
+ 0xc3: true,
+ 0xc4: true,
+ 0xc5: true,
+ 0xc6: true,
+ 0xc7: true,
+ 0xc8: true,
+ 0xc9: true,
+ 0xca: true,
+ 0xcb: true,
+ 0xcc: true,
+ 0xcd: true,
+ 0xce: true,
+ 0xcf: true,
+ 0xd0: true,
+ 0xd1: true,
+ 0xd2: true,
+ 0xd3: true,
+ 0xd4: true,
+ 0xd5: true,
+ 0xd6: true,
+ 0xd7: true,
+ 0xd8: true,
+ 0xd9: true,
+ 0xda: true,
+ 0xdb: true,
+ 0xdc: true,
+ 0xdd: true,
+ 0xde: true,
+ 0xdf: true,
+ 0xe0: true,
+ 0xe1: true,
+ 0xe2: true,
+ 0xe3: true,
+ 0xe4: true,
+ 0xe5: true,
+ 0xe6: true,
+ 0xe7: true,
+ 0xe8: true,
+ 0xe9: true,
+ 0xea: true,
+ 0xeb: true,
+ 0xec: true,
+ 0xed: true,
+ 0xee: true,
+ 0xef: true,
+ 0xf0: true,
+ 0xf1: true,
+ 0xf2: true,
+ 0xf3: true,
+ 0xf4: true,
+ 0xf5: true,
+ 0xf6: true,
+ 0xf7: true,
+ 0xf8: true,
+ 0xf9: true,
+ 0xfa: true,
+ 0xfb: true,
+ 0xfc: true,
+ 0xfd: true,
+ 0xfe: true,
+ 0xff: true,
+}
+
+var hex = "0123456789abcdef"
+
+// escapeIndex finds the index of the first char in `s` that requires escaping.
+// A char requires escaping if it's outside of the range of [0x20, 0x7F] or if
+// it includes a double quote or backslash.
+// If no chars in `s` require escaping, the return value is -1.
+func escapeIndex(s string) int {
+ chunks := stringToUint64Slice(s)
+ for _, n := range chunks {
+ // combine masks before checking for the MSB of each byte. We include
+ // `n` in the mask to check whether any of the *input* byte MSBs were
+ // set (i.e. the byte was outside the ASCII range).
+ mask := n | below(n, 0x20) | contains(n, '"') | contains(n, '\\')
+ if (mask & msb) != 0 {
+ return bits.TrailingZeros64(mask&msb) / 8
+ }
+ }
+
+ valLen := len(s)
+ for i := len(chunks) * 8; i < valLen; i++ {
+ if needEscape[s[i]] {
+ return i
+ }
+ }
+
+ return -1
+}
+
+// below return a mask that can be used to determine if any of the bytes
+// in `n` are below `b`. If a byte's MSB is set in the mask then that byte was
+// below `b`. The result is only valid if `b`, and each byte in `n`, is below
+// 0x80.
+func below(n uint64, b byte) uint64 {
+ return n - expand(b)
+}
+
+// contains returns a mask that can be used to determine if any of the
+// bytes in `n` are equal to `b`. If a byte's MSB is set in the mask then
+// that byte is equal to `b`. The result is only valid if `b`, and each
+// byte in `n`, is below 0x80.
+func contains(n uint64, b byte) uint64 {
+ return (n ^ expand(b)) - lsb
+}
+
+// expand puts the specified byte into each of the 8 bytes of a uint64.
+func expand(b byte) uint64 {
+ return lsb * uint64(b)
+}
+
+//nolint:govet
+func stringToUint64Slice(s string) []uint64 {
+ return *(*[]uint64)(unsafe.Pointer(&reflect.SliceHeader{
+ Data: ((*reflect.StringHeader)(unsafe.Pointer(&s))).Data,
+ Len: len(s) / 8,
+ Cap: len(s) / 8,
+ }))
+}
+
+func AppendEscapedString(buf []byte, s string) []byte {
+ valLen := len(s)
+ if valLen == 0 {
+ return append(buf, `""`...)
+ }
+ buf = append(buf, '"')
+ var (
+ i, j int
+ )
+ if valLen >= 8 {
+ chunks := stringToUint64Slice(s)
+ for _, n := range chunks {
+ // combine masks before checking for the MSB of each byte. We include
+ // `n` in the mask to check whether any of the *input* byte MSBs were
+ // set (i.e. the byte was outside the ASCII range).
+ mask := n | (n - (lsb * 0x20)) |
+ ((n ^ (lsb * '"')) - lsb) |
+ ((n ^ (lsb * '\\')) - lsb) |
+ ((n ^ (lsb * '<')) - lsb) |
+ ((n ^ (lsb * '>')) - lsb) |
+ ((n ^ (lsb * '&')) - lsb)
+ if (mask & msb) != 0 {
+ j = bits.TrailingZeros64(mask&msb) / 8
+ goto ESCAPE_END
+ }
+ }
+ for i := len(chunks) * 8; i < valLen; i++ {
+ if needEscapeWithHTML[s[i]] {
+ j = i
+ goto ESCAPE_END
+ }
+ }
+ // no found any escape characters.
+ return append(append(buf, s...), '"')
+ }
+ESCAPE_END:
+ for j < valLen {
+ c := s[j]
+
+ if !needEscapeWithHTML[c] {
+ // fast path: most of the time, printable ascii characters are used
+ j++
+ continue
+ }
+
+ switch c {
+ case '\\', '"':
+ buf = append(buf, s[i:j]...)
+ buf = append(buf, '\\', c)
+ i = j + 1
+ j = j + 1
+ continue
+
+ case '\n':
+ buf = append(buf, s[i:j]...)
+ buf = append(buf, '\\', 'n')
+ i = j + 1
+ j = j + 1
+ continue
+
+ case '\r':
+ buf = append(buf, s[i:j]...)
+ buf = append(buf, '\\', 'r')
+ i = j + 1
+ j = j + 1
+ continue
+
+ case '\t':
+ buf = append(buf, s[i:j]...)
+ buf = append(buf, '\\', 't')
+ i = j + 1
+ j = j + 1
+ continue
+
+ case '<', '>', '&':
+ buf = append(buf, s[i:j]...)
+ buf = append(buf, `\u00`...)
+ buf = append(buf, hex[c>>4], hex[c&0xF])
+ i = j + 1
+ j = j + 1
+ continue
+ }
+
+ // This encodes bytes < 0x20 except for \t, \n and \r.
+ if c < 0x20 {
+ buf = append(buf, s[i:j]...)
+ buf = append(buf, `\u00`...)
+ buf = append(buf, hex[c>>4], hex[c&0xF])
+ i = j + 1
+ j = j + 1
+ continue
+ }
+
+ r, size := utf8.DecodeRuneInString(s[j:])
+
+ if r == utf8.RuneError && size == 1 {
+ buf = append(buf, s[i:j]...)
+ buf = append(buf, `\ufffd`...)
+ i = j + size
+ j = j + size
+ continue
+ }
+
+ switch r {
+ case '\u2028', '\u2029':
+ // U+2028 is LINE SEPARATOR.
+ // U+2029 is PARAGRAPH SEPARATOR.
+ // They are both technically valid characters in JSON strings,
+ // but don't work in JSONP, which has to be evaluated as JavaScript,
+ // and can lead to security holes there. It is valid JSON to
+ // escape them, so we do so unconditionally.
+ // See http://timelessrepo.com/json-isnt-a-javascript-subset for discussion.
+ buf = append(buf, s[i:j]...)
+ buf = append(buf, `\u202`...)
+ buf = append(buf, hex[r&0xF])
+ i = j + size
+ j = j + size
+ continue
+ }
+
+ j += size
+ }
+
+ return append(append(buf, s[i:]...), '"')
+}
+
+func AppendString(buf []byte, s string) []byte {
+ valLen := len(s)
+ if valLen == 0 {
+ return append(buf, `""`...)
+ }
+ buf = append(buf, '"')
+ var escapeIdx int
+ if valLen >= 8 {
+ if escapeIdx = escapeIndex(s); escapeIdx < 0 {
+ return append(append(buf, s...), '"')
+ }
+ }
+
+ i := 0
+ j := escapeIdx
+ for j < valLen {
+ c := s[j]
+
+ if c >= 0x20 && c <= 0x7f && c != '\\' && c != '"' {
+ // fast path: most of the time, printable ascii characters are used
+ j++
+ continue
+ }
+
+ switch c {
+ case '\\', '"':
+ buf = append(buf, s[i:j]...)
+ buf = append(buf, '\\', c)
+ i = j + 1
+ j = j + 1
+ continue
+
+ case '\n':
+ buf = append(buf, s[i:j]...)
+ buf = append(buf, '\\', 'n')
+ i = j + 1
+ j = j + 1
+ continue
+
+ case '\r':
+ buf = append(buf, s[i:j]...)
+ buf = append(buf, '\\', 'r')
+ i = j + 1
+ j = j + 1
+ continue
+
+ case '\t':
+ buf = append(buf, s[i:j]...)
+ buf = append(buf, '\\', 't')
+ i = j + 1
+ j = j + 1
+ continue
+
+ case '<', '>', '&':
+ buf = append(buf, s[i:j]...)
+ buf = append(buf, `\u00`...)
+ buf = append(buf, hex[c>>4], hex[c&0xF])
+ i = j + 1
+ j = j + 1
+ continue
+ }
+
+ // This encodes bytes < 0x20 except for \t, \n and \r.
+ if c < 0x20 {
+ buf = append(buf, s[i:j]...)
+ buf = append(buf, `\u00`...)
+ buf = append(buf, hex[c>>4], hex[c&0xF])
+ i = j + 1
+ j = j + 1
+ continue
+ }
+
+ r, size := utf8.DecodeRuneInString(s[j:])
+
+ if r == utf8.RuneError && size == 1 {
+ buf = append(buf, s[i:j]...)
+ buf = append(buf, `\ufffd`...)
+ i = j + size
+ j = j + size
+ continue
+ }
+
+ switch r {
+ case '\u2028', '\u2029':
+ // U+2028 is LINE SEPARATOR.
+ // U+2029 is PARAGRAPH SEPARATOR.
+ // They are both technically valid characters in JSON strings,
+ // but don't work in JSONP, which has to be evaluated as JavaScript,
+ // and can lead to security holes there. It is valid JSON to
+ // escape them, so we do so unconditionally.
+ // See http://timelessrepo.com/json-isnt-a-javascript-subset for discussion.
+ buf = append(buf, s[i:j]...)
+ buf = append(buf, `\u202`...)
+ buf = append(buf, hex[r&0xF])
+ i = j + size
+ j = j + size
+ continue
+ }
+
+ j += size
+ }
+
+ return append(append(buf, s[i:]...), '"')
+}
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/vm/debug_vm.go b/vendor/github.com/goccy/go-json/internal/encoder/vm/debug_vm.go
new file mode 100644
index 000000000..43525e1f5
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/vm/debug_vm.go
@@ -0,0 +1,27 @@
+package vm
+
+import (
+ "fmt"
+
+ "github.com/goccy/go-json/internal/encoder"
+)
+
+func DebugRun(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet, opt encoder.Option) ([]byte, error) {
+ defer func() {
+ if err := recover(); err != nil {
+ fmt.Println("=============[DEBUG]===============")
+ fmt.Println("* [TYPE]")
+ fmt.Println(codeSet.Type)
+ fmt.Printf("\n")
+ fmt.Println("* [ALL OPCODE]")
+ fmt.Println(codeSet.Code.Dump())
+ fmt.Printf("\n")
+ fmt.Println("* [CONTEXT]")
+ fmt.Printf("%+v\n", ctx)
+ fmt.Println("===================================")
+ panic(err)
+ }
+ }()
+
+ return Run(ctx, b, codeSet, opt)
+}
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/vm/hack.go b/vendor/github.com/goccy/go-json/internal/encoder/vm/hack.go
new file mode 100644
index 000000000..ec24ee32e
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/vm/hack.go
@@ -0,0 +1,9 @@
+package vm
+
+import (
+ // HACK: compile order
+ // `vm`, `vm_escaped`, `vm_indent`, `vm_escaped_indent` packages uses a lot of memory to compile,
+ // so forcibly make dependencies and avoid compiling in concurrent.
+ // dependency order: vm => vm_escaped => vm_indent => vm_escaped_indent
+ _ "github.com/goccy/go-json/internal/encoder/vm_escaped"
+)
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/vm/util.go b/vendor/github.com/goccy/go-json/internal/encoder/vm/util.go
new file mode 100644
index 000000000..01e608f52
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/vm/util.go
@@ -0,0 +1,215 @@
+package vm
+
+import (
+ "encoding/json"
+ "fmt"
+ "unsafe"
+
+ "github.com/goccy/go-json/internal/encoder"
+ "github.com/goccy/go-json/internal/runtime"
+)
+
+const uintptrSize = 4 << (^uintptr(0) >> 63)
+
+var (
+ appendInt = encoder.AppendInt
+ appendUint = encoder.AppendUint
+ appendFloat32 = encoder.AppendFloat32
+ appendFloat64 = encoder.AppendFloat64
+ appendString = encoder.AppendString
+ appendByteSlice = encoder.AppendByteSlice
+ appendNumber = encoder.AppendNumber
+ errUnsupportedValue = encoder.ErrUnsupportedValue
+ errUnsupportedFloat = encoder.ErrUnsupportedFloat
+ mapiterinit = encoder.MapIterInit
+ mapiterkey = encoder.MapIterKey
+ mapitervalue = encoder.MapIterValue
+ mapiternext = encoder.MapIterNext
+ maplen = encoder.MapLen
+)
+
+type emptyInterface struct {
+ typ *runtime.Type
+ ptr unsafe.Pointer
+}
+
+func errUnimplementedOp(op encoder.OpType) error {
+ return fmt.Errorf("encoder: opcode %s has not been implemented", op)
+}
+
+func load(base uintptr, idx uintptr) uintptr {
+ addr := base + idx
+ return **(**uintptr)(unsafe.Pointer(&addr))
+}
+
+func store(base uintptr, idx uintptr, p uintptr) {
+ addr := base + idx
+ **(**uintptr)(unsafe.Pointer(&addr)) = p
+}
+
+func loadNPtr(base uintptr, idx uintptr, ptrNum int) uintptr {
+ addr := base + idx
+ p := **(**uintptr)(unsafe.Pointer(&addr))
+ for i := 0; i < ptrNum; i++ {
+ if p == 0 {
+ return 0
+ }
+ p = ptrToPtr(p)
+ }
+ return p
+}
+
+func ptrToUint64(p uintptr) uint64 { return **(**uint64)(unsafe.Pointer(&p)) }
+func ptrToFloat32(p uintptr) float32 { return **(**float32)(unsafe.Pointer(&p)) }
+func ptrToFloat64(p uintptr) float64 { return **(**float64)(unsafe.Pointer(&p)) }
+func ptrToBool(p uintptr) bool { return **(**bool)(unsafe.Pointer(&p)) }
+func ptrToBytes(p uintptr) []byte { return **(**[]byte)(unsafe.Pointer(&p)) }
+func ptrToNumber(p uintptr) json.Number { return **(**json.Number)(unsafe.Pointer(&p)) }
+func ptrToString(p uintptr) string { return **(**string)(unsafe.Pointer(&p)) }
+func ptrToSlice(p uintptr) *runtime.SliceHeader { return *(**runtime.SliceHeader)(unsafe.Pointer(&p)) }
+func ptrToPtr(p uintptr) uintptr {
+ return uintptr(**(**unsafe.Pointer)(unsafe.Pointer(&p)))
+}
+func ptrToNPtr(p uintptr, ptrNum int) uintptr {
+ for i := 0; i < ptrNum; i++ {
+ if p == 0 {
+ return 0
+ }
+ p = ptrToPtr(p)
+ }
+ return p
+}
+
+func ptrToUnsafePtr(p uintptr) unsafe.Pointer {
+ return *(*unsafe.Pointer)(unsafe.Pointer(&p))
+}
+func ptrToInterface(code *encoder.Opcode, p uintptr) interface{} {
+ return *(*interface{})(unsafe.Pointer(&emptyInterface{
+ typ: code.Type,
+ ptr: *(*unsafe.Pointer)(unsafe.Pointer(&p)),
+ }))
+}
+
+func appendBool(b []byte, v bool) []byte {
+ if v {
+ return append(b, "true"...)
+ }
+ return append(b, "false"...)
+}
+
+func appendNull(b []byte) []byte {
+ return append(b, "null"...)
+}
+
+func appendComma(b []byte) []byte {
+ return append(b, ',')
+}
+
+func appendColon(b []byte) []byte {
+ last := len(b) - 1
+ b[last] = ':'
+ return b
+}
+
+func appendMapKeyValue(_ *encoder.RuntimeContext, _ *encoder.Opcode, b, key, value []byte) []byte {
+ b = append(b, key...)
+ b[len(b)-1] = ':'
+ return append(b, value...)
+}
+
+func appendMapEnd(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte {
+ b[len(b)-1] = '}'
+ b = append(b, ',')
+ return b
+}
+
+func appendInterface(ctx *encoder.RuntimeContext, codeSet *encoder.OpcodeSet, opt encoder.Option, _ *encoder.Opcode, b []byte, iface *emptyInterface, ptrOffset uintptr) ([]byte, error) {
+ ctx.KeepRefs = append(ctx.KeepRefs, unsafe.Pointer(iface))
+ ifaceCodeSet, err := encoder.CompileToGetCodeSet(uintptr(unsafe.Pointer(iface.typ)))
+ if err != nil {
+ return nil, err
+ }
+
+ totalLength := uintptr(codeSet.CodeLength)
+ nextTotalLength := uintptr(ifaceCodeSet.CodeLength)
+
+ curlen := uintptr(len(ctx.Ptrs))
+ offsetNum := ptrOffset / uintptrSize
+
+ newLen := offsetNum + totalLength + nextTotalLength
+ if curlen < newLen {
+ ctx.Ptrs = append(ctx.Ptrs, make([]uintptr, newLen-curlen)...)
+ }
+ oldPtrs := ctx.Ptrs
+
+ newPtrs := ctx.Ptrs[(ptrOffset+totalLength*uintptrSize)/uintptrSize:]
+ newPtrs[0] = uintptr(iface.ptr)
+
+ ctx.Ptrs = newPtrs
+
+ bb, err := Run(ctx, b, ifaceCodeSet, opt)
+ if err != nil {
+ return nil, err
+ }
+
+ ctx.Ptrs = oldPtrs
+ return bb, nil
+}
+
+func appendMarshalJSON(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte, v interface{}) ([]byte, error) {
+ return encoder.AppendMarshalJSON(ctx, code, b, v, false)
+}
+
+func appendMarshalText(code *encoder.Opcode, b []byte, v interface{}) ([]byte, error) {
+ return encoder.AppendMarshalText(code, b, v, false)
+}
+
+func appendArrayHead(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte {
+ return append(b, '[')
+}
+
+func appendArrayEnd(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte {
+ last := len(b) - 1
+ b[last] = ']'
+ return append(b, ',')
+}
+
+func appendEmptyArray(b []byte) []byte {
+ return append(b, '[', ']', ',')
+}
+
+func appendEmptyObject(b []byte) []byte {
+ return append(b, '{', '}', ',')
+}
+
+func appendObjectEnd(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte {
+ last := len(b) - 1
+ b[last] = '}'
+ return append(b, ',')
+}
+
+func appendStructHead(b []byte) []byte {
+ return append(b, '{')
+}
+
+func appendStructKey(_ *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte {
+ return append(b, code.Key...)
+}
+
+func appendStructEnd(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte {
+ return append(b, '}', ',')
+}
+
+func appendStructEndSkipLast(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte {
+ last := len(b) - 1
+ if b[last] == ',' {
+ b[last] = '}'
+ return appendComma(b)
+ }
+ return appendStructEnd(ctx, code, b)
+}
+
+func restoreIndent(_ *encoder.RuntimeContext, _ *encoder.Opcode, _ uintptr) {}
+func storeIndent(_ uintptr, _ *encoder.Opcode, _ uintptr) {}
+func appendMapKeyIndent(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte { return b }
+func appendArrayElemIndent(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte { return b }
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/vm/vm.go b/vendor/github.com/goccy/go-json/internal/encoder/vm/vm.go
new file mode 100644
index 000000000..952236425
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/vm/vm.go
@@ -0,0 +1,4993 @@
+// Code generated by internal/cmd/generator. DO NOT EDIT!
+package vm
+
+import (
+ "math"
+ "sort"
+ "unsafe"
+
+ "github.com/goccy/go-json/internal/encoder"
+)
+
+func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet, opt encoder.Option) ([]byte, error) {
+ recursiveLevel := 0
+ ptrOffset := uintptr(0)
+ ctxptr := ctx.Ptr()
+ code := codeSet.Code
+
+ for {
+ switch code.Op {
+ default:
+ return nil, errUnimplementedOp(code.Op)
+ case encoder.OpPtr:
+ p := load(ctxptr, code.Idx)
+ code = code.Next
+ store(ctxptr, code.Idx, ptrToPtr(p))
+ case encoder.OpIntPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpInt:
+ b = appendInt(b, ptrToUint64(load(ctxptr, code.Idx)), code)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpUintPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpUint:
+ b = appendUint(b, ptrToUint64(load(ctxptr, code.Idx)), code)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpIntString:
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(load(ctxptr, code.Idx)), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpUintString:
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(load(ctxptr, code.Idx)), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpFloat32Ptr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpFloat32:
+ b = appendFloat32(b, ptrToFloat32(load(ctxptr, code.Idx)))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpFloat64Ptr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpFloat64:
+ v := ptrToFloat64(load(ctxptr, code.Idx))
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStringPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpString:
+ b = appendString(b, ptrToString(load(ctxptr, code.Idx)))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpBoolPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpBool:
+ b = appendBool(b, ptrToBool(load(ctxptr, code.Idx)))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpBytesPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpBytes:
+ b = appendByteSlice(b, ptrToBytes(load(ctxptr, code.Idx)))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpNumberPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpNumber:
+ bb, err := appendNumber(b, ptrToNumber(load(ctxptr, code.Idx)))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpInterfacePtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpInterface:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ for _, seen := range ctx.SeenPtr {
+ if p == seen {
+ return nil, errUnsupportedValue(code, p)
+ }
+ }
+ ctx.SeenPtr = append(ctx.SeenPtr, p)
+ iface := (*emptyInterface)(ptrToUnsafePtr(p))
+ if iface.ptr == nil {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ bb, err := appendInterface(ctx, codeSet, opt, code, b, iface, ptrOffset)
+ if err != nil {
+ return nil, err
+ }
+ ctxptr = ctx.Ptr()
+ ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
+
+ b = bb
+ code = code.Next
+ case encoder.OpMarshalJSONPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToPtr(p))
+ fallthrough
+ case encoder.OpMarshalJSON:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ if code.IsNilableType && code.Indirect {
+ p = ptrToPtr(p)
+ }
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpMarshalTextPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToPtr(p))
+ fallthrough
+ case encoder.OpMarshalText:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = append(b, `""`...)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ if code.IsNilableType && code.Indirect {
+ p = ptrToPtr(p)
+ }
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpSlicePtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpSlice:
+ p := load(ctxptr, code.Idx)
+ slice := ptrToSlice(p)
+ if p == 0 || slice.Data == nil {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.ElemIdx, 0)
+ store(ctxptr, code.Length, uintptr(slice.Len))
+ store(ctxptr, code.Idx, uintptr(slice.Data))
+ if slice.Len > 0 {
+ b = appendArrayHead(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, uintptr(slice.Data))
+ } else {
+ b = appendEmptyArray(b)
+ code = code.End.Next
+ }
+ case encoder.OpSliceElem:
+ idx := load(ctxptr, code.ElemIdx)
+ length := load(ctxptr, code.Length)
+ idx++
+ if idx < length {
+ b = appendArrayElemIndent(ctx, code, b)
+ store(ctxptr, code.ElemIdx, idx)
+ data := load(ctxptr, code.HeadIdx)
+ size := code.Size
+ code = code.Next
+ store(ctxptr, code.Idx, data+idx*size)
+ } else {
+ b = appendArrayEnd(ctx, code, b)
+ code = code.End.Next
+ }
+ case encoder.OpArrayPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpArray:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.End.Next
+ break
+ }
+ if code.Length > 0 {
+ b = appendArrayHead(ctx, code, b)
+ store(ctxptr, code.ElemIdx, 0)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ } else {
+ b = appendEmptyArray(b)
+ code = code.End.Next
+ }
+ case encoder.OpArrayElem:
+ idx := load(ctxptr, code.ElemIdx)
+ idx++
+ if idx < code.Length {
+ b = appendArrayElemIndent(ctx, code, b)
+ store(ctxptr, code.ElemIdx, idx)
+ p := load(ctxptr, code.HeadIdx)
+ size := code.Size
+ code = code.Next
+ store(ctxptr, code.Idx, p+idx*size)
+ } else {
+ b = appendArrayEnd(ctx, code, b)
+ code = code.End.Next
+ }
+ case encoder.OpMapPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpMap:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.End.Next
+ break
+ }
+ uptr := ptrToUnsafePtr(p)
+ mlen := maplen(uptr)
+ if mlen <= 0 {
+ b = appendEmptyObject(b)
+ code = code.End.Next
+ break
+ }
+ b = appendStructHead(b)
+ iter := mapiterinit(code.Type, uptr)
+ ctx.KeepRefs = append(ctx.KeepRefs, iter)
+ store(ctxptr, code.ElemIdx, 0)
+ store(ctxptr, code.Length, uintptr(mlen))
+ store(ctxptr, code.MapIter, uintptr(iter))
+ if (opt & encoder.UnorderedMapOption) == 0 {
+ mapCtx := encoder.NewMapContext(mlen)
+ mapCtx.Pos = append(mapCtx.Pos, len(b))
+ ctx.KeepRefs = append(ctx.KeepRefs, unsafe.Pointer(mapCtx))
+ store(ctxptr, code.End.MapPos, uintptr(unsafe.Pointer(mapCtx)))
+ } else {
+ b = appendMapKeyIndent(ctx, code.Next, b)
+ }
+ key := mapiterkey(iter)
+ store(ctxptr, code.Next.Idx, uintptr(key))
+ code = code.Next
+ case encoder.OpMapKey:
+ idx := load(ctxptr, code.ElemIdx)
+ length := load(ctxptr, code.Length)
+ idx++
+ if (opt & encoder.UnorderedMapOption) != 0 {
+ if idx < length {
+ b = appendMapKeyIndent(ctx, code, b)
+ store(ctxptr, code.ElemIdx, idx)
+ ptr := load(ctxptr, code.MapIter)
+ iter := ptrToUnsafePtr(ptr)
+ key := mapiterkey(iter)
+ store(ctxptr, code.Next.Idx, uintptr(key))
+ code = code.Next
+ } else {
+ b = appendObjectEnd(ctx, code, b)
+ code = code.End.Next
+ }
+ } else {
+ ptr := load(ctxptr, code.End.MapPos)
+ mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(ptr))
+ mapCtx.Pos = append(mapCtx.Pos, len(b))
+ if idx < length {
+ ptr := load(ctxptr, code.MapIter)
+ iter := ptrToUnsafePtr(ptr)
+ store(ctxptr, code.ElemIdx, idx)
+ key := mapiterkey(iter)
+ store(ctxptr, code.Next.Idx, uintptr(key))
+ code = code.Next
+ } else {
+ code = code.End
+ }
+ }
+ case encoder.OpMapValue:
+ if (opt & encoder.UnorderedMapOption) != 0 {
+ b = appendColon(b)
+ } else {
+ ptr := load(ctxptr, code.End.MapPos)
+ mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(ptr))
+ mapCtx.Pos = append(mapCtx.Pos, len(b))
+ }
+ ptr := load(ctxptr, code.MapIter)
+ iter := ptrToUnsafePtr(ptr)
+ value := mapitervalue(iter)
+ store(ctxptr, code.Next.Idx, uintptr(value))
+ mapiternext(iter)
+ code = code.Next
+ case encoder.OpMapEnd:
+ // this operation only used by sorted map.
+ length := int(load(ctxptr, code.Length))
+ ptr := load(ctxptr, code.MapPos)
+ mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(ptr))
+ pos := mapCtx.Pos
+ for i := 0; i < length; i++ {
+ startKey := pos[i*2]
+ startValue := pos[i*2+1]
+ var endValue int
+ if i+1 < length {
+ endValue = pos[i*2+2]
+ } else {
+ endValue = len(b)
+ }
+ mapCtx.Slice.Items = append(mapCtx.Slice.Items, encoder.MapItem{
+ Key: b[startKey:startValue],
+ Value: b[startValue:endValue],
+ })
+ }
+ sort.Sort(mapCtx.Slice)
+ buf := mapCtx.Buf
+ for _, item := range mapCtx.Slice.Items {
+ buf = appendMapKeyValue(ctx, code, buf, item.Key, item.Value)
+ }
+ buf = appendMapEnd(ctx, code, buf)
+ b = b[:pos[0]]
+ b = append(b, buf...)
+ mapCtx.Buf = buf
+ encoder.ReleaseMapContext(mapCtx)
+ code = code.Next
+ case encoder.OpRecursivePtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpRecursive:
+ ptr := load(ctxptr, code.Idx)
+ if ptr != 0 {
+ if recursiveLevel > encoder.StartDetectingCyclesAfter {
+ for _, seen := range ctx.SeenPtr {
+ if ptr == seen {
+ return nil, errUnsupportedValue(code, ptr)
+ }
+ }
+ }
+ }
+ ctx.SeenPtr = append(ctx.SeenPtr, ptr)
+ c := code.Jmp.Code
+ curlen := uintptr(len(ctx.Ptrs))
+ offsetNum := ptrOffset / uintptrSize
+ oldOffset := ptrOffset
+ ptrOffset += code.Jmp.CurLen * uintptrSize
+ oldBaseIndent := ctx.BaseIndent
+ ctx.BaseIndent += code.Indent - 1
+
+ newLen := offsetNum + code.Jmp.CurLen + code.Jmp.NextLen
+ if curlen < newLen {
+ ctx.Ptrs = append(ctx.Ptrs, make([]uintptr, newLen-curlen)...)
+ }
+ ctxptr = ctx.Ptr() + ptrOffset // assign new ctxptr
+
+ store(ctxptr, c.Idx, ptr)
+ store(ctxptr, c.End.Next.Idx, oldOffset)
+ store(ctxptr, c.End.Next.ElemIdx, uintptr(unsafe.Pointer(code.Next)))
+ storeIndent(ctxptr, c, uintptr(oldBaseIndent))
+ code = c
+ recursiveLevel++
+ case encoder.OpRecursiveEnd:
+ recursiveLevel--
+
+ // restore ctxptr
+ restoreIndent(ctx, code, ctxptr)
+ offset := load(ctxptr, code.Idx)
+ ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
+
+ codePtr := load(ctxptr, code.ElemIdx)
+ code = (*encoder.Opcode)(ptrToUnsafePtr(codePtr))
+ ctxptr = ctx.Ptr() + offset
+ ptrOffset = offset
+ case encoder.OpStructPtrHead:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHead:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && (code.Indirect || code.Next.Op == encoder.OpStructEnd) {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if !code.AnonymousKey && len(code.Key) > 0 {
+ b = appendStructKey(ctx, code, b)
+ }
+ p += code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructPtrHeadOmitEmpty:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmpty:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && (code.Indirect || code.Next.Op == encoder.OpStructEnd) {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ p += code.Offset
+ if p == 0 || (ptrToPtr(p) == 0 && code.IsNextOpPtrType) {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadInt:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadInt:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, ptrToUint64(p+code.Offset), code)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyInt:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyInt:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, u64, code)
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadIntString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadIntString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p+code.Offset), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyIntString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyIntString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, u64, code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadIntPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadIntPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendInt(b, ptrToUint64(p), code)
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyIntPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyIntPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, ptrToUint64(p), code)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadIntPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadIntPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyIntPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyIntPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadUint:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadUint:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, ptrToUint64(p+code.Offset), code)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyUint:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyUint:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, u64, code)
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadUintString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadUintString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p+code.Offset), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyUintString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyUintString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, u64, code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadUintPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadUintPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendUint(b, ptrToUint64(p), code)
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyUintPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyUintPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, ptrToUint64(p), code)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadUintPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadUintPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyUintPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyUintPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadFloat32:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadFloat32:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, ptrToFloat32(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat32:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat32:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToFloat32(p + code.Offset)
+ if v == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, v)
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadFloat32String:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadFloat32String:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p+code.Offset))
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat32String:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat32String:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToFloat32(p + code.Offset)
+ if v == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadFloat32Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadFloat32Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendFloat32(b, ptrToFloat32(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat32Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat32Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadFloat32PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadFloat32PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat32PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat32PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadFloat64:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadFloat64:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ v := ptrToFloat64(p + code.Offset)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat64:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat64:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToFloat64(p + code.Offset)
+ if v == 0 {
+ code = code.NextField
+ } else {
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadFloat64String:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadFloat64String:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToFloat64(p + code.Offset)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat64String:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat64String:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToFloat64(p + code.Offset)
+ if v == 0 {
+ code = code.NextField
+ } else {
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadFloat64Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadFloat64Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat64Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat64Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadFloat64PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadFloat64PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat64PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat64PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, ptrToString(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToString(p + code.Offset)
+ if v == "" {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, v)
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadStringString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadStringString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p+code.Offset))))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyStringString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyStringString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToString(p + code.Offset)
+ if v == "" {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, v)))
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadStringPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadStringPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendString(b, ptrToString(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyStringPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyStringPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, ptrToString(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadStringPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadStringPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p))))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyStringPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyStringPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p))))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadBool:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadBool:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, ptrToBool(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyBool:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyBool:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToBool(p + code.Offset)
+ if v {
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, v)
+ b = appendComma(b)
+ code = code.Next
+ } else {
+ code = code.NextField
+ }
+ case encoder.OpStructPtrHeadBoolString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadBoolString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p+code.Offset))
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyBoolString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyBoolString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToBool(p + code.Offset)
+ if v {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ } else {
+ code = code.NextField
+ }
+ case encoder.OpStructPtrHeadBoolPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadBoolPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendBool(b, ptrToBool(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyBoolPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyBoolPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, ptrToBool(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadBoolPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadBoolPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p))
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyBoolPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyBoolPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p))
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadBytes:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadBytes:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, ptrToBytes(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyBytes:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyBytes:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToBytes(p + code.Offset)
+ if len(v) == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, v)
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadBytesPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadBytesPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendByteSlice(b, ptrToBytes(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyBytesPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyBytesPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, ptrToBytes(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadNumber:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadNumber:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, ptrToNumber(p+code.Offset))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyNumber:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyNumber:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToNumber(p + code.Offset)
+ if v == "" {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, v)
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadNumberString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadNumberString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p+code.Offset))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyNumberString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyNumberString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToNumber(p + code.Offset)
+ if v == "" {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, v)
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadNumberPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadNumberPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyNumberPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyNumberPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadNumberPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadNumberPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyNumberPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyNumberPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadArray, encoder.OpStructPtrHeadSlice:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadArray, encoder.OpStructHeadSlice:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ p += code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructPtrHeadOmitEmptyArray:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyArray:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ p += code.Offset
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructPtrHeadOmitEmptySlice:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptySlice:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ p += code.Offset
+ slice := ptrToSlice(p)
+ if slice.Len == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadArrayPtr, encoder.OpStructPtrHeadSlicePtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadArrayPtr, encoder.OpStructHeadSlicePtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.NextField
+ } else {
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadOmitEmptyArrayPtr, encoder.OpStructPtrHeadOmitEmptySlicePtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyArrayPtr, encoder.OpStructHeadOmitEmptySlicePtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadMap:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadMap:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if p != 0 && code.Indirect {
+ p = ptrToPtr(p + code.Offset)
+ }
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructPtrHeadOmitEmptyMap:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyMap:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if p != 0 && code.Indirect {
+ p = ptrToPtr(p + code.Offset)
+ }
+ if maplen(ptrToUnsafePtr(p)) == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadMapPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadMapPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.NextField
+ break
+ }
+ p = ptrToPtr(p + code.Offset)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.NextField
+ } else {
+ if code.Indirect {
+ p = ptrToNPtr(p, code.PtrNum)
+ }
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadOmitEmptyMapPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyMapPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if p == 0 {
+ code = code.NextField
+ break
+ }
+ p = ptrToPtr(p + code.Offset)
+ if p == 0 {
+ code = code.NextField
+ } else {
+ if code.Indirect {
+ p = ptrToNPtr(p, code.PtrNum)
+ }
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadMarshalJSON:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if code.Indirect {
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadMarshalJSON:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.IsNilableType {
+ if code.Indirect || code.Op == encoder.OpStructPtrHeadMarshalJSON {
+ p = ptrToPtr(p + code.Offset)
+ }
+ }
+ if p == 0 && code.Nilcheck {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyMarshalJSON:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if code.Indirect {
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyMarshalJSON:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.IsNilableType {
+ if code.Indirect || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalJSON {
+ p = ptrToPtr(p + code.Offset)
+ }
+ }
+ iface := ptrToInterface(code, p)
+ if code.Nilcheck && encoder.IsNilForMarshaler(iface) {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalJSON(ctx, code, b, iface)
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadMarshalJSONPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadMarshalJSONPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyMarshalJSONPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyMarshalJSONPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if p == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadMarshalText:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if code.Indirect {
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadMarshalText:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.IsNilableType {
+ if code.Indirect || code.Op == encoder.OpStructPtrHeadMarshalText {
+ p = ptrToPtr(p + code.Offset)
+ }
+ }
+ if p == 0 && code.Nilcheck {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyMarshalText:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if code.Indirect {
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyMarshalText:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.IsNilableType {
+ if code.Indirect || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalText {
+ p = ptrToPtr(p + code.Offset)
+ }
+ }
+ if p == 0 && code.Nilcheck {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadMarshalTextPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadMarshalTextPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyMarshalTextPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyMarshalTextPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if p == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructField:
+ if !code.AnonymousKey {
+ b = appendStructKey(ctx, code, b)
+ }
+ p := load(ctxptr, code.HeadIdx) + code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmpty:
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ if ptrToPtr(p) == 0 && code.IsNextOpPtrType {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructFieldInt:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, ptrToUint64(p+code.Offset), code)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyInt:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, u64, code)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldIntString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p+code.Offset), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyIntString:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, u64, code)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldIntPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendInt(b, ptrToUint64(p), code)
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyIntPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, ptrToUint64(p), code)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldIntPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyIntPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldUint:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, ptrToUint64(p+code.Offset), code)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyUint:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, u64, code)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldUintString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p+code.Offset), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyUintString:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, u64, code)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldUintPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendUint(b, ptrToUint64(p), code)
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyUintPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, ptrToUint64(p), code)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldUintPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyUintPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat32:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, ptrToFloat32(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat32:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat32(p + code.Offset)
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat32String:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p+code.Offset))
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat32String:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat32(p + code.Offset)
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat32Ptr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendFloat32(b, ptrToFloat32(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat32Ptr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat32PtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat32PtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat64:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ v := ptrToFloat64(p + code.Offset)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat64:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if v != 0 {
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat64String:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat64String:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if v != 0 {
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat64Ptr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat64Ptr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat64PtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat64PtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, ptrToString(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToString(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldStringString:
+ p := load(ctxptr, code.HeadIdx)
+ s := ptrToString(p + code.Offset)
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, s)))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyStringString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToString(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, v)))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldStringPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendString(b, ptrToString(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyStringPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, ptrToString(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldStringPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p))))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyStringPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p))))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldBool:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, ptrToBool(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyBool:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToBool(p + code.Offset)
+ if v {
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldBoolString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p+code.Offset))
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyBoolString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToBool(p + code.Offset)
+ if v {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldBoolPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendBool(b, ptrToBool(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyBoolPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, ptrToBool(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldBoolPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p))
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyBoolPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p))
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldBytes:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, ptrToBytes(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyBytes:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToBytes(p + code.Offset)
+ if len(v) > 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldBytesPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendByteSlice(b, ptrToBytes(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyBytesPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, ptrToBytes(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldNumber:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, ptrToNumber(p+code.Offset))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyNumber:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToNumber(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, v)
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ }
+ code = code.Next
+ case encoder.OpStructFieldNumberString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p+code.Offset))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyNumberString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToNumber(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, v)
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldNumberPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyNumberPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ }
+ code = code.Next
+ case encoder.OpStructFieldNumberPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyNumberPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldMarshalJSON:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ p += code.Offset
+ if code.IsNilableType {
+ p = ptrToPtr(p)
+ }
+ if p == 0 && code.Nilcheck {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyMarshalJSON:
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ if code.IsNilableType {
+ p = ptrToPtr(p)
+ }
+ if p == 0 && code.Nilcheck {
+ code = code.NextField
+ break
+ }
+ iface := ptrToInterface(code, p)
+ if code.Nilcheck && encoder.IsNilForMarshaler(iface) {
+ code = code.NextField
+ break
+ }
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalJSON(ctx, code, b, iface)
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpStructFieldMarshalJSONPtr:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyMarshalJSONPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ }
+ code = code.Next
+ case encoder.OpStructFieldMarshalText:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ p += code.Offset
+ if code.IsNilableType {
+ p = ptrToPtr(p)
+ }
+ if p == 0 && code.Nilcheck {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyMarshalText:
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ if code.IsNilableType {
+ p = ptrToPtr(p)
+ }
+ if p == 0 && code.Nilcheck {
+ code = code.NextField
+ break
+ }
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpStructFieldMarshalTextPtr:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyMarshalTextPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ }
+ code = code.Next
+ case encoder.OpStructFieldArray:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptyArray:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldArrayPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptyArrayPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ } else {
+ code = code.NextField
+ }
+ case encoder.OpStructFieldSlice:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptySlice:
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ slice := ptrToSlice(p)
+ if slice.Len == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructFieldSlicePtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptySlicePtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ } else {
+ code = code.NextField
+ }
+ case encoder.OpStructFieldMap:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToPtr(p + code.Offset)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptyMap:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToPtr(p + code.Offset)
+ if p == 0 || maplen(ptrToUnsafePtr(p)) == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructFieldMapPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToPtr(p + code.Offset)
+ if p != 0 {
+ p = ptrToNPtr(p, code.PtrNum)
+ }
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptyMapPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToPtr(p + code.Offset)
+ if p != 0 {
+ p = ptrToNPtr(p, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ } else {
+ code = code.NextField
+ }
+ case encoder.OpStructFieldStruct:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptyStruct:
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ if ptrToPtr(p) == 0 && code.IsNextOpPtrType {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructAnonymousEnd:
+ code = code.Next
+ case encoder.OpStructEnd:
+ b = appendStructEndSkipLast(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndInt:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, ptrToUint64(p+code.Offset), code)
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyInt:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, u64, code)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndIntString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p+code.Offset), code)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyIntString:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, u64, code)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndIntPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendInt(b, ptrToUint64(p), code)
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyIntPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, ptrToUint64(p), code)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndIntPtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyIntPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndUint:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, ptrToUint64(p+code.Offset), code)
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyUint:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, u64, code)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndUintString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p+code.Offset), code)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyUintString:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, u64, code)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndUintPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendUint(b, ptrToUint64(p), code)
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyUintPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, ptrToUint64(p), code)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndUintPtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyUintPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat32:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, ptrToFloat32(p+code.Offset))
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat32:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat32(p + code.Offset)
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, v)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat32String:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p+code.Offset))
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat32String:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat32(p + code.Offset)
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, v)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat32Ptr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendFloat32(b, ptrToFloat32(p))
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat32Ptr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat32PtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = append(b, '"')
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat32PtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat64:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat64(b, v)
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat64:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if v != 0 {
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat64(b, v)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat64String:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat64String:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if v != 0 {
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat64Ptr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ break
+ }
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat64Ptr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat64PtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat64PtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, ptrToString(p+code.Offset))
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToString(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, v)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndStringString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ s := ptrToString(p + code.Offset)
+ b = appendString(b, string(appendString([]byte{}, s)))
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyStringString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToString(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, v)))
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndStringPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendString(b, ptrToString(p))
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyStringPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, ptrToString(p))
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndStringPtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p))))
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyStringPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p))))
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndBool:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, ptrToBool(p+code.Offset))
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyBool:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToBool(p + code.Offset)
+ if v {
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, v)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndBoolString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p+code.Offset))
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyBoolString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToBool(p + code.Offset)
+ if v {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, v)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndBoolPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendBool(b, ptrToBool(p))
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyBoolPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, ptrToBool(p))
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndBoolPtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p))
+ b = append(b, '"')
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyBoolPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p))
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndBytes:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, ptrToBytes(p+code.Offset))
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyBytes:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToBytes(p + code.Offset)
+ if len(v) > 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, v)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndBytesPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendByteSlice(b, ptrToBytes(p))
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyBytesPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, ptrToBytes(p))
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndNumber:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, ptrToNumber(p+code.Offset))
+ if err != nil {
+ return nil, err
+ }
+ b = appendStructEnd(ctx, code, bb)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyNumber:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToNumber(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, v)
+ if err != nil {
+ return nil, err
+ }
+ b = appendStructEnd(ctx, code, bb)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndNumberString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p+code.Offset))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyNumberString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToNumber(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, v)
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndNumberPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyNumberPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendStructEnd(ctx, code, bb)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndNumberPtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyNumberPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpEnd:
+ goto END
+ }
+ }
+END:
+ return b, nil
+}
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/vm_escaped/debug_vm.go b/vendor/github.com/goccy/go-json/internal/encoder/vm_escaped/debug_vm.go
new file mode 100644
index 000000000..0139f5755
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/vm_escaped/debug_vm.go
@@ -0,0 +1,27 @@
+package vm_escaped
+
+import (
+ "fmt"
+
+ "github.com/goccy/go-json/internal/encoder"
+)
+
+func DebugRun(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet, opt encoder.Option) ([]byte, error) {
+ defer func() {
+ if err := recover(); err != nil {
+ fmt.Println("=============[DEBUG]===============")
+ fmt.Println("* [TYPE]")
+ fmt.Println(codeSet.Type)
+ fmt.Printf("\n")
+ fmt.Println("* [ALL OPCODE]")
+ fmt.Println(codeSet.Code.Dump())
+ fmt.Printf("\n")
+ fmt.Println("* [CONTEXT]")
+ fmt.Printf("%+v\n", ctx)
+ fmt.Println("===================================")
+ panic(err)
+ }
+ }()
+
+ return Run(ctx, b, codeSet, opt)
+}
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/vm_escaped/hack.go b/vendor/github.com/goccy/go-json/internal/encoder/vm_escaped/hack.go
new file mode 100644
index 000000000..3ac51dda3
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/vm_escaped/hack.go
@@ -0,0 +1,9 @@
+package vm_escaped
+
+import (
+ // HACK: compile order
+ // `vm`, `vm_escaped`, `vm_indent`, `vm_escaped_indent` packages uses a lot of memory to compile,
+ // so forcibly make dependencies and avoid compiling in concurrent.
+ // dependency order: vm => vm_escaped => vm_indent => vm_escaped_indent
+ _ "github.com/goccy/go-json/internal/encoder/vm_indent"
+)
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/vm_escaped/util.go b/vendor/github.com/goccy/go-json/internal/encoder/vm_escaped/util.go
new file mode 100644
index 000000000..129eb2cfa
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/vm_escaped/util.go
@@ -0,0 +1,215 @@
+package vm_escaped
+
+import (
+ "encoding/json"
+ "fmt"
+ "unsafe"
+
+ "github.com/goccy/go-json/internal/encoder"
+ "github.com/goccy/go-json/internal/runtime"
+)
+
+const uintptrSize = 4 << (^uintptr(0) >> 63)
+
+var (
+ appendInt = encoder.AppendInt
+ appendUint = encoder.AppendUint
+ appendFloat32 = encoder.AppendFloat32
+ appendFloat64 = encoder.AppendFloat64
+ appendString = encoder.AppendEscapedString
+ appendByteSlice = encoder.AppendByteSlice
+ appendNumber = encoder.AppendNumber
+ errUnsupportedValue = encoder.ErrUnsupportedValue
+ errUnsupportedFloat = encoder.ErrUnsupportedFloat
+ mapiterinit = encoder.MapIterInit
+ mapiterkey = encoder.MapIterKey
+ mapitervalue = encoder.MapIterValue
+ mapiternext = encoder.MapIterNext
+ maplen = encoder.MapLen
+)
+
+type emptyInterface struct {
+ typ *runtime.Type
+ ptr unsafe.Pointer
+}
+
+func errUnimplementedOp(op encoder.OpType) error {
+ return fmt.Errorf("encoder (escaped): opcode %s has not been implemented", op)
+}
+
+func load(base uintptr, idx uintptr) uintptr {
+ addr := base + idx
+ return **(**uintptr)(unsafe.Pointer(&addr))
+}
+
+func store(base uintptr, idx uintptr, p uintptr) {
+ addr := base + idx
+ **(**uintptr)(unsafe.Pointer(&addr)) = p
+}
+
+func loadNPtr(base uintptr, idx uintptr, ptrNum int) uintptr {
+ addr := base + idx
+ p := **(**uintptr)(unsafe.Pointer(&addr))
+ for i := 0; i < ptrNum; i++ {
+ if p == 0 {
+ return 0
+ }
+ p = ptrToPtr(p)
+ }
+ return p
+}
+
+func ptrToUint64(p uintptr) uint64 { return **(**uint64)(unsafe.Pointer(&p)) }
+func ptrToFloat32(p uintptr) float32 { return **(**float32)(unsafe.Pointer(&p)) }
+func ptrToFloat64(p uintptr) float64 { return **(**float64)(unsafe.Pointer(&p)) }
+func ptrToBool(p uintptr) bool { return **(**bool)(unsafe.Pointer(&p)) }
+func ptrToBytes(p uintptr) []byte { return **(**[]byte)(unsafe.Pointer(&p)) }
+func ptrToNumber(p uintptr) json.Number { return **(**json.Number)(unsafe.Pointer(&p)) }
+func ptrToString(p uintptr) string { return **(**string)(unsafe.Pointer(&p)) }
+func ptrToSlice(p uintptr) *runtime.SliceHeader { return *(**runtime.SliceHeader)(unsafe.Pointer(&p)) }
+func ptrToPtr(p uintptr) uintptr {
+ return uintptr(**(**unsafe.Pointer)(unsafe.Pointer(&p)))
+}
+func ptrToNPtr(p uintptr, ptrNum int) uintptr {
+ for i := 0; i < ptrNum; i++ {
+ if p == 0 {
+ return 0
+ }
+ p = ptrToPtr(p)
+ }
+ return p
+}
+
+func ptrToUnsafePtr(p uintptr) unsafe.Pointer {
+ return *(*unsafe.Pointer)(unsafe.Pointer(&p))
+}
+func ptrToInterface(code *encoder.Opcode, p uintptr) interface{} {
+ return *(*interface{})(unsafe.Pointer(&emptyInterface{
+ typ: code.Type,
+ ptr: *(*unsafe.Pointer)(unsafe.Pointer(&p)),
+ }))
+}
+
+func appendBool(b []byte, v bool) []byte {
+ if v {
+ return append(b, "true"...)
+ }
+ return append(b, "false"...)
+}
+
+func appendNull(b []byte) []byte {
+ return append(b, "null"...)
+}
+
+func appendComma(b []byte) []byte {
+ return append(b, ',')
+}
+
+func appendColon(b []byte) []byte {
+ last := len(b) - 1
+ b[last] = ':'
+ return b
+}
+
+func appendMapKeyValue(_ *encoder.RuntimeContext, _ *encoder.Opcode, b, key, value []byte) []byte {
+ b = append(b, key...)
+ b[len(b)-1] = ':'
+ return append(b, value...)
+}
+
+func appendMapEnd(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte {
+ b[len(b)-1] = '}'
+ b = append(b, ',')
+ return b
+}
+
+func appendInterface(ctx *encoder.RuntimeContext, codeSet *encoder.OpcodeSet, opt encoder.Option, _ *encoder.Opcode, b []byte, iface *emptyInterface, ptrOffset uintptr) ([]byte, error) {
+ ctx.KeepRefs = append(ctx.KeepRefs, unsafe.Pointer(iface))
+ ifaceCodeSet, err := encoder.CompileToGetCodeSet(uintptr(unsafe.Pointer(iface.typ)))
+ if err != nil {
+ return nil, err
+ }
+
+ totalLength := uintptr(codeSet.CodeLength)
+ nextTotalLength := uintptr(ifaceCodeSet.CodeLength)
+
+ curlen := uintptr(len(ctx.Ptrs))
+ offsetNum := ptrOffset / uintptrSize
+
+ newLen := offsetNum + totalLength + nextTotalLength
+ if curlen < newLen {
+ ctx.Ptrs = append(ctx.Ptrs, make([]uintptr, newLen-curlen)...)
+ }
+ oldPtrs := ctx.Ptrs
+
+ newPtrs := ctx.Ptrs[(ptrOffset+totalLength*uintptrSize)/uintptrSize:]
+ newPtrs[0] = uintptr(iface.ptr)
+
+ ctx.Ptrs = newPtrs
+
+ bb, err := Run(ctx, b, ifaceCodeSet, opt)
+ if err != nil {
+ return nil, err
+ }
+
+ ctx.Ptrs = oldPtrs
+ return bb, nil
+}
+
+func appendMarshalJSON(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte, v interface{}) ([]byte, error) {
+ return encoder.AppendMarshalJSON(ctx, code, b, v, true)
+}
+
+func appendMarshalText(code *encoder.Opcode, b []byte, v interface{}) ([]byte, error) {
+ return encoder.AppendMarshalText(code, b, v, true)
+}
+
+func appendArrayHead(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte {
+ return append(b, '[')
+}
+
+func appendArrayEnd(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte {
+ last := len(b) - 1
+ b[last] = ']'
+ return append(b, ',')
+}
+
+func appendEmptyArray(b []byte) []byte {
+ return append(b, '[', ']', ',')
+}
+
+func appendEmptyObject(b []byte) []byte {
+ return append(b, '{', '}', ',')
+}
+
+func appendObjectEnd(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte {
+ last := len(b) - 1
+ b[last] = '}'
+ return append(b, ',')
+}
+
+func appendStructHead(b []byte) []byte {
+ return append(b, '{')
+}
+
+func appendStructKey(_ *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte {
+ return append(b, code.EscapedKey...)
+}
+
+func appendStructEnd(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte {
+ return append(b, '}', ',')
+}
+
+func appendStructEndSkipLast(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte {
+ last := len(b) - 1
+ if b[last] == ',' {
+ b[last] = '}'
+ return appendComma(b)
+ }
+ return appendStructEnd(ctx, code, b)
+}
+
+func restoreIndent(_ *encoder.RuntimeContext, _ *encoder.Opcode, _ uintptr) {}
+func storeIndent(_ uintptr, _ *encoder.Opcode, _ uintptr) {}
+func appendMapKeyIndent(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte { return b }
+func appendArrayElemIndent(_ *encoder.RuntimeContext, _ *encoder.Opcode, b []byte) []byte { return b }
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/vm_escaped/vm.go b/vendor/github.com/goccy/go-json/internal/encoder/vm_escaped/vm.go
new file mode 100644
index 000000000..03d5b4e95
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/vm_escaped/vm.go
@@ -0,0 +1,4993 @@
+// Code generated by internal/cmd/generator. DO NOT EDIT!
+package vm_escaped
+
+import (
+ "math"
+ "sort"
+ "unsafe"
+
+ "github.com/goccy/go-json/internal/encoder"
+)
+
+func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet, opt encoder.Option) ([]byte, error) {
+ recursiveLevel := 0
+ ptrOffset := uintptr(0)
+ ctxptr := ctx.Ptr()
+ code := codeSet.Code
+
+ for {
+ switch code.Op {
+ default:
+ return nil, errUnimplementedOp(code.Op)
+ case encoder.OpPtr:
+ p := load(ctxptr, code.Idx)
+ code = code.Next
+ store(ctxptr, code.Idx, ptrToPtr(p))
+ case encoder.OpIntPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpInt:
+ b = appendInt(b, ptrToUint64(load(ctxptr, code.Idx)), code)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpUintPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpUint:
+ b = appendUint(b, ptrToUint64(load(ctxptr, code.Idx)), code)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpIntString:
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(load(ctxptr, code.Idx)), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpUintString:
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(load(ctxptr, code.Idx)), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpFloat32Ptr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpFloat32:
+ b = appendFloat32(b, ptrToFloat32(load(ctxptr, code.Idx)))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpFloat64Ptr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpFloat64:
+ v := ptrToFloat64(load(ctxptr, code.Idx))
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStringPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpString:
+ b = appendString(b, ptrToString(load(ctxptr, code.Idx)))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpBoolPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpBool:
+ b = appendBool(b, ptrToBool(load(ctxptr, code.Idx)))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpBytesPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpBytes:
+ b = appendByteSlice(b, ptrToBytes(load(ctxptr, code.Idx)))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpNumberPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpNumber:
+ bb, err := appendNumber(b, ptrToNumber(load(ctxptr, code.Idx)))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpInterfacePtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpInterface:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ for _, seen := range ctx.SeenPtr {
+ if p == seen {
+ return nil, errUnsupportedValue(code, p)
+ }
+ }
+ ctx.SeenPtr = append(ctx.SeenPtr, p)
+ iface := (*emptyInterface)(ptrToUnsafePtr(p))
+ if iface.ptr == nil {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ bb, err := appendInterface(ctx, codeSet, opt, code, b, iface, ptrOffset)
+ if err != nil {
+ return nil, err
+ }
+ ctxptr = ctx.Ptr()
+ ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
+
+ b = bb
+ code = code.Next
+ case encoder.OpMarshalJSONPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToPtr(p))
+ fallthrough
+ case encoder.OpMarshalJSON:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ if code.IsNilableType && code.Indirect {
+ p = ptrToPtr(p)
+ }
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpMarshalTextPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToPtr(p))
+ fallthrough
+ case encoder.OpMarshalText:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = append(b, `""`...)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ if code.IsNilableType && code.Indirect {
+ p = ptrToPtr(p)
+ }
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpSlicePtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpSlice:
+ p := load(ctxptr, code.Idx)
+ slice := ptrToSlice(p)
+ if p == 0 || slice.Data == nil {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.ElemIdx, 0)
+ store(ctxptr, code.Length, uintptr(slice.Len))
+ store(ctxptr, code.Idx, uintptr(slice.Data))
+ if slice.Len > 0 {
+ b = appendArrayHead(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, uintptr(slice.Data))
+ } else {
+ b = appendEmptyArray(b)
+ code = code.End.Next
+ }
+ case encoder.OpSliceElem:
+ idx := load(ctxptr, code.ElemIdx)
+ length := load(ctxptr, code.Length)
+ idx++
+ if idx < length {
+ b = appendArrayElemIndent(ctx, code, b)
+ store(ctxptr, code.ElemIdx, idx)
+ data := load(ctxptr, code.HeadIdx)
+ size := code.Size
+ code = code.Next
+ store(ctxptr, code.Idx, data+idx*size)
+ } else {
+ b = appendArrayEnd(ctx, code, b)
+ code = code.End.Next
+ }
+ case encoder.OpArrayPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpArray:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.End.Next
+ break
+ }
+ if code.Length > 0 {
+ b = appendArrayHead(ctx, code, b)
+ store(ctxptr, code.ElemIdx, 0)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ } else {
+ b = appendEmptyArray(b)
+ code = code.End.Next
+ }
+ case encoder.OpArrayElem:
+ idx := load(ctxptr, code.ElemIdx)
+ idx++
+ if idx < code.Length {
+ b = appendArrayElemIndent(ctx, code, b)
+ store(ctxptr, code.ElemIdx, idx)
+ p := load(ctxptr, code.HeadIdx)
+ size := code.Size
+ code = code.Next
+ store(ctxptr, code.Idx, p+idx*size)
+ } else {
+ b = appendArrayEnd(ctx, code, b)
+ code = code.End.Next
+ }
+ case encoder.OpMapPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpMap:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.End.Next
+ break
+ }
+ uptr := ptrToUnsafePtr(p)
+ mlen := maplen(uptr)
+ if mlen <= 0 {
+ b = appendEmptyObject(b)
+ code = code.End.Next
+ break
+ }
+ b = appendStructHead(b)
+ iter := mapiterinit(code.Type, uptr)
+ ctx.KeepRefs = append(ctx.KeepRefs, iter)
+ store(ctxptr, code.ElemIdx, 0)
+ store(ctxptr, code.Length, uintptr(mlen))
+ store(ctxptr, code.MapIter, uintptr(iter))
+ if (opt & encoder.UnorderedMapOption) == 0 {
+ mapCtx := encoder.NewMapContext(mlen)
+ mapCtx.Pos = append(mapCtx.Pos, len(b))
+ ctx.KeepRefs = append(ctx.KeepRefs, unsafe.Pointer(mapCtx))
+ store(ctxptr, code.End.MapPos, uintptr(unsafe.Pointer(mapCtx)))
+ } else {
+ b = appendMapKeyIndent(ctx, code.Next, b)
+ }
+ key := mapiterkey(iter)
+ store(ctxptr, code.Next.Idx, uintptr(key))
+ code = code.Next
+ case encoder.OpMapKey:
+ idx := load(ctxptr, code.ElemIdx)
+ length := load(ctxptr, code.Length)
+ idx++
+ if (opt & encoder.UnorderedMapOption) != 0 {
+ if idx < length {
+ b = appendMapKeyIndent(ctx, code, b)
+ store(ctxptr, code.ElemIdx, idx)
+ ptr := load(ctxptr, code.MapIter)
+ iter := ptrToUnsafePtr(ptr)
+ key := mapiterkey(iter)
+ store(ctxptr, code.Next.Idx, uintptr(key))
+ code = code.Next
+ } else {
+ b = appendObjectEnd(ctx, code, b)
+ code = code.End.Next
+ }
+ } else {
+ ptr := load(ctxptr, code.End.MapPos)
+ mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(ptr))
+ mapCtx.Pos = append(mapCtx.Pos, len(b))
+ if idx < length {
+ ptr := load(ctxptr, code.MapIter)
+ iter := ptrToUnsafePtr(ptr)
+ store(ctxptr, code.ElemIdx, idx)
+ key := mapiterkey(iter)
+ store(ctxptr, code.Next.Idx, uintptr(key))
+ code = code.Next
+ } else {
+ code = code.End
+ }
+ }
+ case encoder.OpMapValue:
+ if (opt & encoder.UnorderedMapOption) != 0 {
+ b = appendColon(b)
+ } else {
+ ptr := load(ctxptr, code.End.MapPos)
+ mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(ptr))
+ mapCtx.Pos = append(mapCtx.Pos, len(b))
+ }
+ ptr := load(ctxptr, code.MapIter)
+ iter := ptrToUnsafePtr(ptr)
+ value := mapitervalue(iter)
+ store(ctxptr, code.Next.Idx, uintptr(value))
+ mapiternext(iter)
+ code = code.Next
+ case encoder.OpMapEnd:
+ // this operation only used by sorted map.
+ length := int(load(ctxptr, code.Length))
+ ptr := load(ctxptr, code.MapPos)
+ mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(ptr))
+ pos := mapCtx.Pos
+ for i := 0; i < length; i++ {
+ startKey := pos[i*2]
+ startValue := pos[i*2+1]
+ var endValue int
+ if i+1 < length {
+ endValue = pos[i*2+2]
+ } else {
+ endValue = len(b)
+ }
+ mapCtx.Slice.Items = append(mapCtx.Slice.Items, encoder.MapItem{
+ Key: b[startKey:startValue],
+ Value: b[startValue:endValue],
+ })
+ }
+ sort.Sort(mapCtx.Slice)
+ buf := mapCtx.Buf
+ for _, item := range mapCtx.Slice.Items {
+ buf = appendMapKeyValue(ctx, code, buf, item.Key, item.Value)
+ }
+ buf = appendMapEnd(ctx, code, buf)
+ b = b[:pos[0]]
+ b = append(b, buf...)
+ mapCtx.Buf = buf
+ encoder.ReleaseMapContext(mapCtx)
+ code = code.Next
+ case encoder.OpRecursivePtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpRecursive:
+ ptr := load(ctxptr, code.Idx)
+ if ptr != 0 {
+ if recursiveLevel > encoder.StartDetectingCyclesAfter {
+ for _, seen := range ctx.SeenPtr {
+ if ptr == seen {
+ return nil, errUnsupportedValue(code, ptr)
+ }
+ }
+ }
+ }
+ ctx.SeenPtr = append(ctx.SeenPtr, ptr)
+ c := code.Jmp.Code
+ curlen := uintptr(len(ctx.Ptrs))
+ offsetNum := ptrOffset / uintptrSize
+ oldOffset := ptrOffset
+ ptrOffset += code.Jmp.CurLen * uintptrSize
+ oldBaseIndent := ctx.BaseIndent
+ ctx.BaseIndent += code.Indent - 1
+
+ newLen := offsetNum + code.Jmp.CurLen + code.Jmp.NextLen
+ if curlen < newLen {
+ ctx.Ptrs = append(ctx.Ptrs, make([]uintptr, newLen-curlen)...)
+ }
+ ctxptr = ctx.Ptr() + ptrOffset // assign new ctxptr
+
+ store(ctxptr, c.Idx, ptr)
+ store(ctxptr, c.End.Next.Idx, oldOffset)
+ store(ctxptr, c.End.Next.ElemIdx, uintptr(unsafe.Pointer(code.Next)))
+ storeIndent(ctxptr, c, uintptr(oldBaseIndent))
+ code = c
+ recursiveLevel++
+ case encoder.OpRecursiveEnd:
+ recursiveLevel--
+
+ // restore ctxptr
+ restoreIndent(ctx, code, ctxptr)
+ offset := load(ctxptr, code.Idx)
+ ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
+
+ codePtr := load(ctxptr, code.ElemIdx)
+ code = (*encoder.Opcode)(ptrToUnsafePtr(codePtr))
+ ctxptr = ctx.Ptr() + offset
+ ptrOffset = offset
+ case encoder.OpStructPtrHead:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHead:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && (code.Indirect || code.Next.Op == encoder.OpStructEnd) {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if !code.AnonymousKey && len(code.Key) > 0 {
+ b = appendStructKey(ctx, code, b)
+ }
+ p += code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructPtrHeadOmitEmpty:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmpty:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && (code.Indirect || code.Next.Op == encoder.OpStructEnd) {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ p += code.Offset
+ if p == 0 || (ptrToPtr(p) == 0 && code.IsNextOpPtrType) {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadInt:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadInt:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, ptrToUint64(p+code.Offset), code)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyInt:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyInt:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, u64, code)
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadIntString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadIntString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p+code.Offset), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyIntString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyIntString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, u64, code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadIntPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadIntPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendInt(b, ptrToUint64(p), code)
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyIntPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyIntPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, ptrToUint64(p), code)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadIntPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadIntPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyIntPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyIntPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadUint:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadUint:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, ptrToUint64(p+code.Offset), code)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyUint:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyUint:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, u64, code)
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadUintString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadUintString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p+code.Offset), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyUintString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyUintString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, u64, code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadUintPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadUintPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendUint(b, ptrToUint64(p), code)
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyUintPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyUintPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, ptrToUint64(p), code)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadUintPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadUintPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyUintPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyUintPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadFloat32:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadFloat32:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, ptrToFloat32(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat32:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat32:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToFloat32(p + code.Offset)
+ if v == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, v)
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadFloat32String:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadFloat32String:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p+code.Offset))
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat32String:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat32String:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToFloat32(p + code.Offset)
+ if v == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadFloat32Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadFloat32Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendFloat32(b, ptrToFloat32(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat32Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat32Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadFloat32PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadFloat32PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat32PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat32PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadFloat64:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadFloat64:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ v := ptrToFloat64(p + code.Offset)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat64:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat64:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToFloat64(p + code.Offset)
+ if v == 0 {
+ code = code.NextField
+ } else {
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadFloat64String:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadFloat64String:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToFloat64(p + code.Offset)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat64String:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat64String:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToFloat64(p + code.Offset)
+ if v == 0 {
+ code = code.NextField
+ } else {
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadFloat64Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadFloat64Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat64Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat64Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadFloat64PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadFloat64PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat64PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat64PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, ptrToString(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToString(p + code.Offset)
+ if v == "" {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, v)
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadStringString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadStringString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p+code.Offset))))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyStringString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyStringString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToString(p + code.Offset)
+ if v == "" {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, v)))
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadStringPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadStringPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendString(b, ptrToString(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyStringPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyStringPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, ptrToString(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadStringPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadStringPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p))))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyStringPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyStringPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p))))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadBool:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadBool:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, ptrToBool(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyBool:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyBool:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToBool(p + code.Offset)
+ if v {
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, v)
+ b = appendComma(b)
+ code = code.Next
+ } else {
+ code = code.NextField
+ }
+ case encoder.OpStructPtrHeadBoolString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadBoolString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p+code.Offset))
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyBoolString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyBoolString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToBool(p + code.Offset)
+ if v {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ } else {
+ code = code.NextField
+ }
+ case encoder.OpStructPtrHeadBoolPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadBoolPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendBool(b, ptrToBool(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyBoolPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyBoolPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, ptrToBool(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadBoolPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadBoolPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p))
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyBoolPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyBoolPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p))
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadBytes:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadBytes:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, ptrToBytes(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyBytes:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyBytes:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToBytes(p + code.Offset)
+ if len(v) == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, v)
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadBytesPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadBytesPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendByteSlice(b, ptrToBytes(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyBytesPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyBytesPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, ptrToBytes(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadNumber:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadNumber:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, ptrToNumber(p+code.Offset))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyNumber:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyNumber:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToNumber(p + code.Offset)
+ if v == "" {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, v)
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadNumberString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadNumberString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p+code.Offset))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyNumberString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyNumberString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToNumber(p + code.Offset)
+ if v == "" {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, v)
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadNumberPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadNumberPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyNumberPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyNumberPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadNumberPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadNumberPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyNumberPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyNumberPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadArray, encoder.OpStructPtrHeadSlice:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadArray, encoder.OpStructHeadSlice:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ p += code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructPtrHeadOmitEmptyArray:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyArray:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ p += code.Offset
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructPtrHeadOmitEmptySlice:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptySlice:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ p += code.Offset
+ slice := ptrToSlice(p)
+ if slice.Len == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadArrayPtr, encoder.OpStructPtrHeadSlicePtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadArrayPtr, encoder.OpStructHeadSlicePtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.NextField
+ } else {
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadOmitEmptyArrayPtr, encoder.OpStructPtrHeadOmitEmptySlicePtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyArrayPtr, encoder.OpStructHeadOmitEmptySlicePtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadMap:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadMap:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if p != 0 && code.Indirect {
+ p = ptrToPtr(p + code.Offset)
+ }
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructPtrHeadOmitEmptyMap:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyMap:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if p != 0 && code.Indirect {
+ p = ptrToPtr(p + code.Offset)
+ }
+ if maplen(ptrToUnsafePtr(p)) == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadMapPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadMapPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.NextField
+ break
+ }
+ p = ptrToPtr(p + code.Offset)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.NextField
+ } else {
+ if code.Indirect {
+ p = ptrToNPtr(p, code.PtrNum)
+ }
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadOmitEmptyMapPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyMapPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if p == 0 {
+ code = code.NextField
+ break
+ }
+ p = ptrToPtr(p + code.Offset)
+ if p == 0 {
+ code = code.NextField
+ } else {
+ if code.Indirect {
+ p = ptrToNPtr(p, code.PtrNum)
+ }
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadMarshalJSON:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if code.Indirect {
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadMarshalJSON:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.IsNilableType {
+ if code.Indirect || code.Op == encoder.OpStructPtrHeadMarshalJSON {
+ p = ptrToPtr(p + code.Offset)
+ }
+ }
+ if p == 0 && code.Nilcheck {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyMarshalJSON:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if code.Indirect {
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyMarshalJSON:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.IsNilableType {
+ if code.Indirect || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalJSON {
+ p = ptrToPtr(p + code.Offset)
+ }
+ }
+ iface := ptrToInterface(code, p)
+ if code.Nilcheck && encoder.IsNilForMarshaler(iface) {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalJSON(ctx, code, b, iface)
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadMarshalJSONPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadMarshalJSONPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyMarshalJSONPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyMarshalJSONPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if p == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadMarshalText:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if code.Indirect {
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadMarshalText:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.IsNilableType {
+ if code.Indirect || code.Op == encoder.OpStructPtrHeadMarshalText {
+ p = ptrToPtr(p + code.Offset)
+ }
+ }
+ if p == 0 && code.Nilcheck {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyMarshalText:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if code.Indirect {
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyMarshalText:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.IsNilableType {
+ if code.Indirect || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalText {
+ p = ptrToPtr(p + code.Offset)
+ }
+ }
+ if p == 0 && code.Nilcheck {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadMarshalTextPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadMarshalTextPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyMarshalTextPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyMarshalTextPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if p == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructField:
+ if !code.AnonymousKey {
+ b = appendStructKey(ctx, code, b)
+ }
+ p := load(ctxptr, code.HeadIdx) + code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmpty:
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ if ptrToPtr(p) == 0 && code.IsNextOpPtrType {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructFieldInt:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, ptrToUint64(p+code.Offset), code)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyInt:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, u64, code)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldIntString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p+code.Offset), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyIntString:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, u64, code)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldIntPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendInt(b, ptrToUint64(p), code)
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyIntPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, ptrToUint64(p), code)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldIntPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyIntPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldUint:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, ptrToUint64(p+code.Offset), code)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyUint:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, u64, code)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldUintString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p+code.Offset), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyUintString:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, u64, code)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldUintPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendUint(b, ptrToUint64(p), code)
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyUintPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, ptrToUint64(p), code)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldUintPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyUintPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat32:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, ptrToFloat32(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat32:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat32(p + code.Offset)
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat32String:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p+code.Offset))
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat32String:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat32(p + code.Offset)
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat32Ptr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendFloat32(b, ptrToFloat32(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat32Ptr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat32PtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat32PtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat64:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ v := ptrToFloat64(p + code.Offset)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat64:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if v != 0 {
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat64String:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat64String:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if v != 0 {
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat64Ptr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat64Ptr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat64PtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat64PtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, ptrToString(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToString(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldStringString:
+ p := load(ctxptr, code.HeadIdx)
+ s := ptrToString(p + code.Offset)
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, s)))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyStringString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToString(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, v)))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldStringPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendString(b, ptrToString(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyStringPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, ptrToString(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldStringPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p))))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyStringPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p))))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldBool:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, ptrToBool(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyBool:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToBool(p + code.Offset)
+ if v {
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldBoolString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p+code.Offset))
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyBoolString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToBool(p + code.Offset)
+ if v {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldBoolPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendBool(b, ptrToBool(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyBoolPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, ptrToBool(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldBoolPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p))
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyBoolPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p))
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldBytes:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, ptrToBytes(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyBytes:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToBytes(p + code.Offset)
+ if len(v) > 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldBytesPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendByteSlice(b, ptrToBytes(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyBytesPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, ptrToBytes(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldNumber:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, ptrToNumber(p+code.Offset))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyNumber:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToNumber(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, v)
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ }
+ code = code.Next
+ case encoder.OpStructFieldNumberString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p+code.Offset))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyNumberString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToNumber(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, v)
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldNumberPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyNumberPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ }
+ code = code.Next
+ case encoder.OpStructFieldNumberPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyNumberPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldMarshalJSON:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ p += code.Offset
+ if code.IsNilableType {
+ p = ptrToPtr(p)
+ }
+ if p == 0 && code.Nilcheck {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyMarshalJSON:
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ if code.IsNilableType {
+ p = ptrToPtr(p)
+ }
+ if p == 0 && code.Nilcheck {
+ code = code.NextField
+ break
+ }
+ iface := ptrToInterface(code, p)
+ if code.Nilcheck && encoder.IsNilForMarshaler(iface) {
+ code = code.NextField
+ break
+ }
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalJSON(ctx, code, b, iface)
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpStructFieldMarshalJSONPtr:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyMarshalJSONPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ }
+ code = code.Next
+ case encoder.OpStructFieldMarshalText:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ p += code.Offset
+ if code.IsNilableType {
+ p = ptrToPtr(p)
+ }
+ if p == 0 && code.Nilcheck {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyMarshalText:
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ if code.IsNilableType {
+ p = ptrToPtr(p)
+ }
+ if p == 0 && code.Nilcheck {
+ code = code.NextField
+ break
+ }
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpStructFieldMarshalTextPtr:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyMarshalTextPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ }
+ code = code.Next
+ case encoder.OpStructFieldArray:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptyArray:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldArrayPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptyArrayPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ } else {
+ code = code.NextField
+ }
+ case encoder.OpStructFieldSlice:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptySlice:
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ slice := ptrToSlice(p)
+ if slice.Len == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructFieldSlicePtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptySlicePtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ } else {
+ code = code.NextField
+ }
+ case encoder.OpStructFieldMap:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToPtr(p + code.Offset)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptyMap:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToPtr(p + code.Offset)
+ if p == 0 || maplen(ptrToUnsafePtr(p)) == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructFieldMapPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToPtr(p + code.Offset)
+ if p != 0 {
+ p = ptrToNPtr(p, code.PtrNum)
+ }
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptyMapPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToPtr(p + code.Offset)
+ if p != 0 {
+ p = ptrToNPtr(p, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ } else {
+ code = code.NextField
+ }
+ case encoder.OpStructFieldStruct:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptyStruct:
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ if ptrToPtr(p) == 0 && code.IsNextOpPtrType {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructAnonymousEnd:
+ code = code.Next
+ case encoder.OpStructEnd:
+ b = appendStructEndSkipLast(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndInt:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, ptrToUint64(p+code.Offset), code)
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyInt:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, u64, code)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndIntString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p+code.Offset), code)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyIntString:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, u64, code)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndIntPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendInt(b, ptrToUint64(p), code)
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyIntPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, ptrToUint64(p), code)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndIntPtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyIntPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndUint:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, ptrToUint64(p+code.Offset), code)
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyUint:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, u64, code)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndUintString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p+code.Offset), code)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyUintString:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, u64, code)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndUintPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendUint(b, ptrToUint64(p), code)
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyUintPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, ptrToUint64(p), code)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndUintPtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyUintPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat32:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, ptrToFloat32(p+code.Offset))
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat32:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat32(p + code.Offset)
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, v)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat32String:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p+code.Offset))
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat32String:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat32(p + code.Offset)
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, v)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat32Ptr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendFloat32(b, ptrToFloat32(p))
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat32Ptr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat32PtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = append(b, '"')
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat32PtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat64:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat64(b, v)
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat64:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if v != 0 {
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat64(b, v)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat64String:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat64String:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if v != 0 {
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat64Ptr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ break
+ }
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat64Ptr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat64PtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat64PtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, ptrToString(p+code.Offset))
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToString(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, v)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndStringString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ s := ptrToString(p + code.Offset)
+ b = appendString(b, string(appendString([]byte{}, s)))
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyStringString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToString(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, v)))
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndStringPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendString(b, ptrToString(p))
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyStringPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, ptrToString(p))
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndStringPtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p))))
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyStringPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p))))
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndBool:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, ptrToBool(p+code.Offset))
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyBool:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToBool(p + code.Offset)
+ if v {
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, v)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndBoolString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p+code.Offset))
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyBoolString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToBool(p + code.Offset)
+ if v {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, v)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndBoolPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendBool(b, ptrToBool(p))
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyBoolPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, ptrToBool(p))
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndBoolPtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p))
+ b = append(b, '"')
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyBoolPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p))
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndBytes:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, ptrToBytes(p+code.Offset))
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyBytes:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToBytes(p + code.Offset)
+ if len(v) > 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, v)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndBytesPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendByteSlice(b, ptrToBytes(p))
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyBytesPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, ptrToBytes(p))
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndNumber:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, ptrToNumber(p+code.Offset))
+ if err != nil {
+ return nil, err
+ }
+ b = appendStructEnd(ctx, code, bb)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyNumber:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToNumber(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, v)
+ if err != nil {
+ return nil, err
+ }
+ b = appendStructEnd(ctx, code, bb)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndNumberString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p+code.Offset))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyNumberString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToNumber(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, v)
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndNumberPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyNumberPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendStructEnd(ctx, code, bb)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndNumberPtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyNumberPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpEnd:
+ goto END
+ }
+ }
+END:
+ return b, nil
+}
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/vm_escaped_indent/debug_vm.go b/vendor/github.com/goccy/go-json/internal/encoder/vm_escaped_indent/debug_vm.go
new file mode 100644
index 000000000..970ab47fa
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/vm_escaped_indent/debug_vm.go
@@ -0,0 +1,27 @@
+package vm_escaped_indent
+
+import (
+ "fmt"
+
+ "github.com/goccy/go-json/internal/encoder"
+)
+
+func DebugRun(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet, opt encoder.Option) ([]byte, error) {
+ defer func() {
+ if err := recover(); err != nil {
+ fmt.Println("=============[DEBUG]===============")
+ fmt.Println("* [TYPE]")
+ fmt.Println(codeSet.Type)
+ fmt.Printf("\n")
+ fmt.Println("* [ALL OPCODE]")
+ fmt.Println(codeSet.Code.Dump())
+ fmt.Printf("\n")
+ fmt.Println("* [CONTEXT]")
+ fmt.Printf("%+v\n", ctx)
+ fmt.Println("===================================")
+ panic(err)
+ }
+ }()
+
+ return Run(ctx, b, codeSet, opt)
+}
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/vm_escaped_indent/hack.go b/vendor/github.com/goccy/go-json/internal/encoder/vm_escaped_indent/hack.go
new file mode 100644
index 000000000..49d3ceccd
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/vm_escaped_indent/hack.go
@@ -0,0 +1,6 @@
+package vm_escaped_indent
+
+// HACK: compile order
+// `vm`, `vm_escaped`, `vm_indent`, `vm_escaped_indent` packages uses a lot of memory to compile,
+// so forcibly make dependencies and avoid compiling in concurrent.
+// dependency order: vm => vm_escaped => vm_indent => vm_escaped_indent
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/vm_escaped_indent/util.go b/vendor/github.com/goccy/go-json/internal/encoder/vm_escaped_indent/util.go
new file mode 100644
index 000000000..60d73e090
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/vm_escaped_indent/util.go
@@ -0,0 +1,241 @@
+package vm_escaped_indent
+
+import (
+ "encoding/json"
+ "fmt"
+ "unsafe"
+
+ "github.com/goccy/go-json/internal/encoder"
+ "github.com/goccy/go-json/internal/runtime"
+)
+
+const uintptrSize = 4 << (^uintptr(0) >> 63)
+
+var (
+ appendInt = encoder.AppendInt
+ appendUint = encoder.AppendUint
+ appendFloat32 = encoder.AppendFloat32
+ appendFloat64 = encoder.AppendFloat64
+ appendString = encoder.AppendString
+ appendByteSlice = encoder.AppendByteSlice
+ appendNumber = encoder.AppendNumber
+ appendStructEnd = encoder.AppendStructEndIndent
+ appendIndent = encoder.AppendIndent
+ errUnsupportedValue = encoder.ErrUnsupportedValue
+ errUnsupportedFloat = encoder.ErrUnsupportedFloat
+ mapiterinit = encoder.MapIterInit
+ mapiterkey = encoder.MapIterKey
+ mapitervalue = encoder.MapIterValue
+ mapiternext = encoder.MapIterNext
+ maplen = encoder.MapLen
+)
+
+type emptyInterface struct {
+ typ *runtime.Type
+ ptr unsafe.Pointer
+}
+
+func errUnimplementedOp(op encoder.OpType) error {
+ return fmt.Errorf("encoder (indent+escaped): opcode %s has not been implemented", op)
+}
+
+func load(base uintptr, idx uintptr) uintptr {
+ addr := base + idx
+ return **(**uintptr)(unsafe.Pointer(&addr))
+}
+
+func store(base uintptr, idx uintptr, p uintptr) {
+ addr := base + idx
+ **(**uintptr)(unsafe.Pointer(&addr)) = p
+}
+
+func loadNPtr(base uintptr, idx uintptr, ptrNum int) uintptr {
+ addr := base + idx
+ p := **(**uintptr)(unsafe.Pointer(&addr))
+ for i := 0; i < ptrNum; i++ {
+ if p == 0 {
+ return 0
+ }
+ p = ptrToPtr(p)
+ }
+ return p
+}
+
+func ptrToUint64(p uintptr) uint64 { return **(**uint64)(unsafe.Pointer(&p)) }
+func ptrToFloat32(p uintptr) float32 { return **(**float32)(unsafe.Pointer(&p)) }
+func ptrToFloat64(p uintptr) float64 { return **(**float64)(unsafe.Pointer(&p)) }
+func ptrToBool(p uintptr) bool { return **(**bool)(unsafe.Pointer(&p)) }
+func ptrToBytes(p uintptr) []byte { return **(**[]byte)(unsafe.Pointer(&p)) }
+func ptrToNumber(p uintptr) json.Number { return **(**json.Number)(unsafe.Pointer(&p)) }
+func ptrToString(p uintptr) string { return **(**string)(unsafe.Pointer(&p)) }
+func ptrToSlice(p uintptr) *runtime.SliceHeader { return *(**runtime.SliceHeader)(unsafe.Pointer(&p)) }
+func ptrToPtr(p uintptr) uintptr {
+ return uintptr(**(**unsafe.Pointer)(unsafe.Pointer(&p)))
+}
+func ptrToNPtr(p uintptr, ptrNum int) uintptr {
+ for i := 0; i < ptrNum; i++ {
+ if p == 0 {
+ return 0
+ }
+ p = ptrToPtr(p)
+ }
+ return p
+}
+
+func ptrToUnsafePtr(p uintptr) unsafe.Pointer {
+ return *(*unsafe.Pointer)(unsafe.Pointer(&p))
+}
+func ptrToInterface(code *encoder.Opcode, p uintptr) interface{} {
+ return *(*interface{})(unsafe.Pointer(&emptyInterface{
+ typ: code.Type,
+ ptr: *(*unsafe.Pointer)(unsafe.Pointer(&p)),
+ }))
+}
+
+func appendBool(b []byte, v bool) []byte {
+ if v {
+ return append(b, "true"...)
+ }
+ return append(b, "false"...)
+}
+
+func appendNull(b []byte) []byte {
+ return append(b, "null"...)
+}
+
+func appendComma(b []byte) []byte {
+ return append(b, ',', '\n')
+}
+
+func appendColon(b []byte) []byte {
+ return append(b, ':', ' ')
+}
+
+func appendInterface(ctx *encoder.RuntimeContext, codeSet *encoder.OpcodeSet, opt encoder.Option, code *encoder.Opcode, b []byte, iface *emptyInterface, ptrOffset uintptr) ([]byte, error) {
+ ctx.KeepRefs = append(ctx.KeepRefs, unsafe.Pointer(iface))
+ ifaceCodeSet, err := encoder.CompileToGetCodeSet(uintptr(unsafe.Pointer(iface.typ)))
+ if err != nil {
+ return nil, err
+ }
+
+ totalLength := uintptr(codeSet.CodeLength)
+ nextTotalLength := uintptr(ifaceCodeSet.CodeLength)
+
+ curlen := uintptr(len(ctx.Ptrs))
+ offsetNum := ptrOffset / uintptrSize
+
+ newLen := offsetNum + totalLength + nextTotalLength
+ if curlen < newLen {
+ ctx.Ptrs = append(ctx.Ptrs, make([]uintptr, newLen-curlen)...)
+ }
+ oldPtrs := ctx.Ptrs
+
+ newPtrs := ctx.Ptrs[(ptrOffset+totalLength*uintptrSize)/uintptrSize:]
+ newPtrs[0] = uintptr(iface.ptr)
+
+ ctx.Ptrs = newPtrs
+
+ oldBaseIndent := ctx.BaseIndent
+ ctx.BaseIndent = code.Indent
+ bb, err := Run(ctx, b, ifaceCodeSet, opt)
+ if err != nil {
+ return nil, err
+ }
+ ctx.BaseIndent = oldBaseIndent
+
+ ctx.Ptrs = oldPtrs
+
+ return bb, nil
+}
+
+func appendMapKeyValue(ctx *encoder.RuntimeContext, code *encoder.Opcode, b, key, value []byte) []byte {
+ b = appendIndent(ctx, b, code.Indent+1)
+ b = append(b, key...)
+ b[len(b)-2] = ':'
+ b[len(b)-1] = ' '
+ return append(b, value...)
+}
+
+func appendMapEnd(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte {
+ b = b[:len(b)-2]
+ b = append(b, '\n')
+ b = appendIndent(ctx, b, code.Indent)
+ return append(b, '}', ',', '\n')
+}
+
+func appendArrayHead(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte {
+ b = append(b, '[', '\n')
+ return appendIndent(ctx, b, code.Indent+1)
+}
+
+func appendArrayEnd(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte {
+ b = b[:len(b)-2]
+ b = append(b, '\n')
+ b = appendIndent(ctx, b, code.Indent)
+ return append(b, ']', ',', '\n')
+}
+
+func appendEmptyArray(b []byte) []byte {
+ return append(b, '[', ']', ',', '\n')
+}
+
+func appendEmptyObject(b []byte) []byte {
+ return append(b, '{', '}', ',', '\n')
+}
+
+func appendObjectEnd(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte {
+ last := len(b) - 1
+ b[last] = '\n'
+ b = appendIndent(ctx, b, code.Indent-1)
+ return append(b, '}', ',', '\n')
+}
+
+func appendMarshalJSON(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte, v interface{}) ([]byte, error) {
+ return encoder.AppendMarshalJSONIndent(ctx, code, b, v, true)
+}
+
+func appendMarshalText(code *encoder.Opcode, b []byte, v interface{}) ([]byte, error) {
+ return encoder.AppendMarshalTextIndent(code, b, v, true)
+}
+
+func appendStructHead(b []byte) []byte {
+ return append(b, '{', '\n')
+}
+
+func appendStructKey(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte {
+ b = appendIndent(ctx, b, code.Indent)
+ b = append(b, code.EscapedKey...)
+ return append(b, ' ')
+}
+
+func appendStructEndSkipLast(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte {
+ last := len(b) - 1
+ if b[last-1] == '{' {
+ b[last] = '}'
+ } else {
+ if b[last] == '\n' {
+ // to remove ',' and '\n' characters
+ b = b[:len(b)-2]
+ }
+ b = append(b, '\n')
+ b = appendIndent(ctx, b, code.Indent-1)
+ b = append(b, '}')
+ }
+ return appendComma(b)
+}
+
+func restoreIndent(ctx *encoder.RuntimeContext, code *encoder.Opcode, ctxptr uintptr) {
+ ctx.BaseIndent = int(load(ctxptr, code.Length))
+}
+
+func storeIndent(ctxptr uintptr, code *encoder.Opcode, indent uintptr) {
+ store(ctxptr, code.End.Next.Length, indent)
+}
+
+func appendArrayElemIndent(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte {
+ return appendIndent(ctx, b, code.Indent+1)
+}
+
+func appendMapKeyIndent(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte {
+ return appendIndent(ctx, b, code.Indent)
+}
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/vm_escaped_indent/vm.go b/vendor/github.com/goccy/go-json/internal/encoder/vm_escaped_indent/vm.go
new file mode 100644
index 000000000..2288602c9
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/vm_escaped_indent/vm.go
@@ -0,0 +1,4993 @@
+// Code generated by internal/cmd/generator. DO NOT EDIT!
+package vm_escaped_indent
+
+import (
+ "math"
+ "sort"
+ "unsafe"
+
+ "github.com/goccy/go-json/internal/encoder"
+)
+
+func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet, opt encoder.Option) ([]byte, error) {
+ recursiveLevel := 0
+ ptrOffset := uintptr(0)
+ ctxptr := ctx.Ptr()
+ code := codeSet.Code
+
+ for {
+ switch code.Op {
+ default:
+ return nil, errUnimplementedOp(code.Op)
+ case encoder.OpPtr:
+ p := load(ctxptr, code.Idx)
+ code = code.Next
+ store(ctxptr, code.Idx, ptrToPtr(p))
+ case encoder.OpIntPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpInt:
+ b = appendInt(b, ptrToUint64(load(ctxptr, code.Idx)), code)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpUintPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpUint:
+ b = appendUint(b, ptrToUint64(load(ctxptr, code.Idx)), code)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpIntString:
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(load(ctxptr, code.Idx)), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpUintString:
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(load(ctxptr, code.Idx)), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpFloat32Ptr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpFloat32:
+ b = appendFloat32(b, ptrToFloat32(load(ctxptr, code.Idx)))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpFloat64Ptr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpFloat64:
+ v := ptrToFloat64(load(ctxptr, code.Idx))
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStringPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpString:
+ b = appendString(b, ptrToString(load(ctxptr, code.Idx)))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpBoolPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpBool:
+ b = appendBool(b, ptrToBool(load(ctxptr, code.Idx)))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpBytesPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpBytes:
+ b = appendByteSlice(b, ptrToBytes(load(ctxptr, code.Idx)))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpNumberPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpNumber:
+ bb, err := appendNumber(b, ptrToNumber(load(ctxptr, code.Idx)))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpInterfacePtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpInterface:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ for _, seen := range ctx.SeenPtr {
+ if p == seen {
+ return nil, errUnsupportedValue(code, p)
+ }
+ }
+ ctx.SeenPtr = append(ctx.SeenPtr, p)
+ iface := (*emptyInterface)(ptrToUnsafePtr(p))
+ if iface.ptr == nil {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ bb, err := appendInterface(ctx, codeSet, opt, code, b, iface, ptrOffset)
+ if err != nil {
+ return nil, err
+ }
+ ctxptr = ctx.Ptr()
+ ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
+
+ b = bb
+ code = code.Next
+ case encoder.OpMarshalJSONPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToPtr(p))
+ fallthrough
+ case encoder.OpMarshalJSON:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ if code.IsNilableType && code.Indirect {
+ p = ptrToPtr(p)
+ }
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpMarshalTextPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToPtr(p))
+ fallthrough
+ case encoder.OpMarshalText:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = append(b, `""`...)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ if code.IsNilableType && code.Indirect {
+ p = ptrToPtr(p)
+ }
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpSlicePtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpSlice:
+ p := load(ctxptr, code.Idx)
+ slice := ptrToSlice(p)
+ if p == 0 || slice.Data == nil {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.ElemIdx, 0)
+ store(ctxptr, code.Length, uintptr(slice.Len))
+ store(ctxptr, code.Idx, uintptr(slice.Data))
+ if slice.Len > 0 {
+ b = appendArrayHead(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, uintptr(slice.Data))
+ } else {
+ b = appendEmptyArray(b)
+ code = code.End.Next
+ }
+ case encoder.OpSliceElem:
+ idx := load(ctxptr, code.ElemIdx)
+ length := load(ctxptr, code.Length)
+ idx++
+ if idx < length {
+ b = appendArrayElemIndent(ctx, code, b)
+ store(ctxptr, code.ElemIdx, idx)
+ data := load(ctxptr, code.HeadIdx)
+ size := code.Size
+ code = code.Next
+ store(ctxptr, code.Idx, data+idx*size)
+ } else {
+ b = appendArrayEnd(ctx, code, b)
+ code = code.End.Next
+ }
+ case encoder.OpArrayPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpArray:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.End.Next
+ break
+ }
+ if code.Length > 0 {
+ b = appendArrayHead(ctx, code, b)
+ store(ctxptr, code.ElemIdx, 0)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ } else {
+ b = appendEmptyArray(b)
+ code = code.End.Next
+ }
+ case encoder.OpArrayElem:
+ idx := load(ctxptr, code.ElemIdx)
+ idx++
+ if idx < code.Length {
+ b = appendArrayElemIndent(ctx, code, b)
+ store(ctxptr, code.ElemIdx, idx)
+ p := load(ctxptr, code.HeadIdx)
+ size := code.Size
+ code = code.Next
+ store(ctxptr, code.Idx, p+idx*size)
+ } else {
+ b = appendArrayEnd(ctx, code, b)
+ code = code.End.Next
+ }
+ case encoder.OpMapPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpMap:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.End.Next
+ break
+ }
+ uptr := ptrToUnsafePtr(p)
+ mlen := maplen(uptr)
+ if mlen <= 0 {
+ b = appendEmptyObject(b)
+ code = code.End.Next
+ break
+ }
+ b = appendStructHead(b)
+ iter := mapiterinit(code.Type, uptr)
+ ctx.KeepRefs = append(ctx.KeepRefs, iter)
+ store(ctxptr, code.ElemIdx, 0)
+ store(ctxptr, code.Length, uintptr(mlen))
+ store(ctxptr, code.MapIter, uintptr(iter))
+ if (opt & encoder.UnorderedMapOption) == 0 {
+ mapCtx := encoder.NewMapContext(mlen)
+ mapCtx.Pos = append(mapCtx.Pos, len(b))
+ ctx.KeepRefs = append(ctx.KeepRefs, unsafe.Pointer(mapCtx))
+ store(ctxptr, code.End.MapPos, uintptr(unsafe.Pointer(mapCtx)))
+ } else {
+ b = appendMapKeyIndent(ctx, code.Next, b)
+ }
+ key := mapiterkey(iter)
+ store(ctxptr, code.Next.Idx, uintptr(key))
+ code = code.Next
+ case encoder.OpMapKey:
+ idx := load(ctxptr, code.ElemIdx)
+ length := load(ctxptr, code.Length)
+ idx++
+ if (opt & encoder.UnorderedMapOption) != 0 {
+ if idx < length {
+ b = appendMapKeyIndent(ctx, code, b)
+ store(ctxptr, code.ElemIdx, idx)
+ ptr := load(ctxptr, code.MapIter)
+ iter := ptrToUnsafePtr(ptr)
+ key := mapiterkey(iter)
+ store(ctxptr, code.Next.Idx, uintptr(key))
+ code = code.Next
+ } else {
+ b = appendObjectEnd(ctx, code, b)
+ code = code.End.Next
+ }
+ } else {
+ ptr := load(ctxptr, code.End.MapPos)
+ mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(ptr))
+ mapCtx.Pos = append(mapCtx.Pos, len(b))
+ if idx < length {
+ ptr := load(ctxptr, code.MapIter)
+ iter := ptrToUnsafePtr(ptr)
+ store(ctxptr, code.ElemIdx, idx)
+ key := mapiterkey(iter)
+ store(ctxptr, code.Next.Idx, uintptr(key))
+ code = code.Next
+ } else {
+ code = code.End
+ }
+ }
+ case encoder.OpMapValue:
+ if (opt & encoder.UnorderedMapOption) != 0 {
+ b = appendColon(b)
+ } else {
+ ptr := load(ctxptr, code.End.MapPos)
+ mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(ptr))
+ mapCtx.Pos = append(mapCtx.Pos, len(b))
+ }
+ ptr := load(ctxptr, code.MapIter)
+ iter := ptrToUnsafePtr(ptr)
+ value := mapitervalue(iter)
+ store(ctxptr, code.Next.Idx, uintptr(value))
+ mapiternext(iter)
+ code = code.Next
+ case encoder.OpMapEnd:
+ // this operation only used by sorted map.
+ length := int(load(ctxptr, code.Length))
+ ptr := load(ctxptr, code.MapPos)
+ mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(ptr))
+ pos := mapCtx.Pos
+ for i := 0; i < length; i++ {
+ startKey := pos[i*2]
+ startValue := pos[i*2+1]
+ var endValue int
+ if i+1 < length {
+ endValue = pos[i*2+2]
+ } else {
+ endValue = len(b)
+ }
+ mapCtx.Slice.Items = append(mapCtx.Slice.Items, encoder.MapItem{
+ Key: b[startKey:startValue],
+ Value: b[startValue:endValue],
+ })
+ }
+ sort.Sort(mapCtx.Slice)
+ buf := mapCtx.Buf
+ for _, item := range mapCtx.Slice.Items {
+ buf = appendMapKeyValue(ctx, code, buf, item.Key, item.Value)
+ }
+ buf = appendMapEnd(ctx, code, buf)
+ b = b[:pos[0]]
+ b = append(b, buf...)
+ mapCtx.Buf = buf
+ encoder.ReleaseMapContext(mapCtx)
+ code = code.Next
+ case encoder.OpRecursivePtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpRecursive:
+ ptr := load(ctxptr, code.Idx)
+ if ptr != 0 {
+ if recursiveLevel > encoder.StartDetectingCyclesAfter {
+ for _, seen := range ctx.SeenPtr {
+ if ptr == seen {
+ return nil, errUnsupportedValue(code, ptr)
+ }
+ }
+ }
+ }
+ ctx.SeenPtr = append(ctx.SeenPtr, ptr)
+ c := code.Jmp.Code
+ curlen := uintptr(len(ctx.Ptrs))
+ offsetNum := ptrOffset / uintptrSize
+ oldOffset := ptrOffset
+ ptrOffset += code.Jmp.CurLen * uintptrSize
+ oldBaseIndent := ctx.BaseIndent
+ ctx.BaseIndent += code.Indent - 1
+
+ newLen := offsetNum + code.Jmp.CurLen + code.Jmp.NextLen
+ if curlen < newLen {
+ ctx.Ptrs = append(ctx.Ptrs, make([]uintptr, newLen-curlen)...)
+ }
+ ctxptr = ctx.Ptr() + ptrOffset // assign new ctxptr
+
+ store(ctxptr, c.Idx, ptr)
+ store(ctxptr, c.End.Next.Idx, oldOffset)
+ store(ctxptr, c.End.Next.ElemIdx, uintptr(unsafe.Pointer(code.Next)))
+ storeIndent(ctxptr, c, uintptr(oldBaseIndent))
+ code = c
+ recursiveLevel++
+ case encoder.OpRecursiveEnd:
+ recursiveLevel--
+
+ // restore ctxptr
+ restoreIndent(ctx, code, ctxptr)
+ offset := load(ctxptr, code.Idx)
+ ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
+
+ codePtr := load(ctxptr, code.ElemIdx)
+ code = (*encoder.Opcode)(ptrToUnsafePtr(codePtr))
+ ctxptr = ctx.Ptr() + offset
+ ptrOffset = offset
+ case encoder.OpStructPtrHead:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHead:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && (code.Indirect || code.Next.Op == encoder.OpStructEnd) {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if !code.AnonymousKey && len(code.Key) > 0 {
+ b = appendStructKey(ctx, code, b)
+ }
+ p += code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructPtrHeadOmitEmpty:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmpty:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && (code.Indirect || code.Next.Op == encoder.OpStructEnd) {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ p += code.Offset
+ if p == 0 || (ptrToPtr(p) == 0 && code.IsNextOpPtrType) {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadInt:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadInt:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, ptrToUint64(p+code.Offset), code)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyInt:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyInt:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, u64, code)
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadIntString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadIntString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p+code.Offset), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyIntString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyIntString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, u64, code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadIntPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadIntPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendInt(b, ptrToUint64(p), code)
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyIntPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyIntPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, ptrToUint64(p), code)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadIntPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadIntPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyIntPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyIntPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadUint:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadUint:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, ptrToUint64(p+code.Offset), code)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyUint:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyUint:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, u64, code)
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadUintString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadUintString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p+code.Offset), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyUintString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyUintString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, u64, code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadUintPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadUintPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendUint(b, ptrToUint64(p), code)
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyUintPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyUintPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, ptrToUint64(p), code)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadUintPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadUintPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyUintPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyUintPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadFloat32:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadFloat32:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, ptrToFloat32(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat32:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat32:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToFloat32(p + code.Offset)
+ if v == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, v)
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadFloat32String:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadFloat32String:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p+code.Offset))
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat32String:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat32String:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToFloat32(p + code.Offset)
+ if v == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadFloat32Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadFloat32Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendFloat32(b, ptrToFloat32(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat32Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat32Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadFloat32PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadFloat32PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat32PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat32PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadFloat64:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadFloat64:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ v := ptrToFloat64(p + code.Offset)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat64:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat64:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToFloat64(p + code.Offset)
+ if v == 0 {
+ code = code.NextField
+ } else {
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadFloat64String:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadFloat64String:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToFloat64(p + code.Offset)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat64String:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat64String:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToFloat64(p + code.Offset)
+ if v == 0 {
+ code = code.NextField
+ } else {
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadFloat64Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadFloat64Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat64Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat64Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadFloat64PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadFloat64PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat64PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat64PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, ptrToString(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToString(p + code.Offset)
+ if v == "" {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, v)
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadStringString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadStringString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p+code.Offset))))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyStringString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyStringString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToString(p + code.Offset)
+ if v == "" {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, v)))
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadStringPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadStringPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendString(b, ptrToString(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyStringPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyStringPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, ptrToString(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadStringPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadStringPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p))))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyStringPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyStringPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p))))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadBool:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadBool:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, ptrToBool(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyBool:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyBool:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToBool(p + code.Offset)
+ if v {
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, v)
+ b = appendComma(b)
+ code = code.Next
+ } else {
+ code = code.NextField
+ }
+ case encoder.OpStructPtrHeadBoolString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadBoolString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p+code.Offset))
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyBoolString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyBoolString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToBool(p + code.Offset)
+ if v {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ } else {
+ code = code.NextField
+ }
+ case encoder.OpStructPtrHeadBoolPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadBoolPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendBool(b, ptrToBool(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyBoolPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyBoolPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, ptrToBool(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadBoolPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadBoolPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p))
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyBoolPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyBoolPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p))
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadBytes:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadBytes:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, ptrToBytes(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyBytes:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyBytes:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToBytes(p + code.Offset)
+ if len(v) == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, v)
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadBytesPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadBytesPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendByteSlice(b, ptrToBytes(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyBytesPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyBytesPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, ptrToBytes(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadNumber:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadNumber:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, ptrToNumber(p+code.Offset))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyNumber:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyNumber:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToNumber(p + code.Offset)
+ if v == "" {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, v)
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadNumberString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadNumberString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p+code.Offset))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyNumberString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyNumberString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToNumber(p + code.Offset)
+ if v == "" {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, v)
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadNumberPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadNumberPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyNumberPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyNumberPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadNumberPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadNumberPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyNumberPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyNumberPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadArray, encoder.OpStructPtrHeadSlice:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadArray, encoder.OpStructHeadSlice:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ p += code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructPtrHeadOmitEmptyArray:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyArray:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ p += code.Offset
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructPtrHeadOmitEmptySlice:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptySlice:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ p += code.Offset
+ slice := ptrToSlice(p)
+ if slice.Len == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadArrayPtr, encoder.OpStructPtrHeadSlicePtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadArrayPtr, encoder.OpStructHeadSlicePtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.NextField
+ } else {
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadOmitEmptyArrayPtr, encoder.OpStructPtrHeadOmitEmptySlicePtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyArrayPtr, encoder.OpStructHeadOmitEmptySlicePtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadMap:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadMap:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if p != 0 && code.Indirect {
+ p = ptrToPtr(p + code.Offset)
+ }
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructPtrHeadOmitEmptyMap:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyMap:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if p != 0 && code.Indirect {
+ p = ptrToPtr(p + code.Offset)
+ }
+ if maplen(ptrToUnsafePtr(p)) == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadMapPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadMapPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.NextField
+ break
+ }
+ p = ptrToPtr(p + code.Offset)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.NextField
+ } else {
+ if code.Indirect {
+ p = ptrToNPtr(p, code.PtrNum)
+ }
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadOmitEmptyMapPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyMapPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if p == 0 {
+ code = code.NextField
+ break
+ }
+ p = ptrToPtr(p + code.Offset)
+ if p == 0 {
+ code = code.NextField
+ } else {
+ if code.Indirect {
+ p = ptrToNPtr(p, code.PtrNum)
+ }
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadMarshalJSON:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if code.Indirect {
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadMarshalJSON:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.IsNilableType {
+ if code.Indirect || code.Op == encoder.OpStructPtrHeadMarshalJSON {
+ p = ptrToPtr(p + code.Offset)
+ }
+ }
+ if p == 0 && code.Nilcheck {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyMarshalJSON:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if code.Indirect {
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyMarshalJSON:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.IsNilableType {
+ if code.Indirect || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalJSON {
+ p = ptrToPtr(p + code.Offset)
+ }
+ }
+ iface := ptrToInterface(code, p)
+ if code.Nilcheck && encoder.IsNilForMarshaler(iface) {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalJSON(ctx, code, b, iface)
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadMarshalJSONPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadMarshalJSONPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyMarshalJSONPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyMarshalJSONPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if p == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadMarshalText:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if code.Indirect {
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadMarshalText:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.IsNilableType {
+ if code.Indirect || code.Op == encoder.OpStructPtrHeadMarshalText {
+ p = ptrToPtr(p + code.Offset)
+ }
+ }
+ if p == 0 && code.Nilcheck {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyMarshalText:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if code.Indirect {
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyMarshalText:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.IsNilableType {
+ if code.Indirect || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalText {
+ p = ptrToPtr(p + code.Offset)
+ }
+ }
+ if p == 0 && code.Nilcheck {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadMarshalTextPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadMarshalTextPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyMarshalTextPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyMarshalTextPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if p == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructField:
+ if !code.AnonymousKey {
+ b = appendStructKey(ctx, code, b)
+ }
+ p := load(ctxptr, code.HeadIdx) + code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmpty:
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ if ptrToPtr(p) == 0 && code.IsNextOpPtrType {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructFieldInt:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, ptrToUint64(p+code.Offset), code)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyInt:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, u64, code)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldIntString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p+code.Offset), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyIntString:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, u64, code)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldIntPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendInt(b, ptrToUint64(p), code)
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyIntPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, ptrToUint64(p), code)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldIntPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyIntPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldUint:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, ptrToUint64(p+code.Offset), code)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyUint:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, u64, code)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldUintString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p+code.Offset), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyUintString:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, u64, code)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldUintPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendUint(b, ptrToUint64(p), code)
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyUintPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, ptrToUint64(p), code)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldUintPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyUintPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat32:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, ptrToFloat32(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat32:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat32(p + code.Offset)
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat32String:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p+code.Offset))
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat32String:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat32(p + code.Offset)
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat32Ptr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendFloat32(b, ptrToFloat32(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat32Ptr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat32PtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat32PtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat64:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ v := ptrToFloat64(p + code.Offset)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat64:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if v != 0 {
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat64String:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat64String:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if v != 0 {
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat64Ptr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat64Ptr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat64PtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat64PtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, ptrToString(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToString(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldStringString:
+ p := load(ctxptr, code.HeadIdx)
+ s := ptrToString(p + code.Offset)
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, s)))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyStringString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToString(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, v)))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldStringPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendString(b, ptrToString(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyStringPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, ptrToString(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldStringPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p))))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyStringPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p))))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldBool:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, ptrToBool(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyBool:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToBool(p + code.Offset)
+ if v {
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldBoolString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p+code.Offset))
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyBoolString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToBool(p + code.Offset)
+ if v {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldBoolPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendBool(b, ptrToBool(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyBoolPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, ptrToBool(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldBoolPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p))
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyBoolPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p))
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldBytes:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, ptrToBytes(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyBytes:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToBytes(p + code.Offset)
+ if len(v) > 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldBytesPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendByteSlice(b, ptrToBytes(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyBytesPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, ptrToBytes(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldNumber:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, ptrToNumber(p+code.Offset))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyNumber:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToNumber(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, v)
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ }
+ code = code.Next
+ case encoder.OpStructFieldNumberString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p+code.Offset))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyNumberString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToNumber(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, v)
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldNumberPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyNumberPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ }
+ code = code.Next
+ case encoder.OpStructFieldNumberPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyNumberPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldMarshalJSON:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ p += code.Offset
+ if code.IsNilableType {
+ p = ptrToPtr(p)
+ }
+ if p == 0 && code.Nilcheck {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyMarshalJSON:
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ if code.IsNilableType {
+ p = ptrToPtr(p)
+ }
+ if p == 0 && code.Nilcheck {
+ code = code.NextField
+ break
+ }
+ iface := ptrToInterface(code, p)
+ if code.Nilcheck && encoder.IsNilForMarshaler(iface) {
+ code = code.NextField
+ break
+ }
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalJSON(ctx, code, b, iface)
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpStructFieldMarshalJSONPtr:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyMarshalJSONPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ }
+ code = code.Next
+ case encoder.OpStructFieldMarshalText:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ p += code.Offset
+ if code.IsNilableType {
+ p = ptrToPtr(p)
+ }
+ if p == 0 && code.Nilcheck {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyMarshalText:
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ if code.IsNilableType {
+ p = ptrToPtr(p)
+ }
+ if p == 0 && code.Nilcheck {
+ code = code.NextField
+ break
+ }
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpStructFieldMarshalTextPtr:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyMarshalTextPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ }
+ code = code.Next
+ case encoder.OpStructFieldArray:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptyArray:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldArrayPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptyArrayPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ } else {
+ code = code.NextField
+ }
+ case encoder.OpStructFieldSlice:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptySlice:
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ slice := ptrToSlice(p)
+ if slice.Len == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructFieldSlicePtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptySlicePtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ } else {
+ code = code.NextField
+ }
+ case encoder.OpStructFieldMap:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToPtr(p + code.Offset)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptyMap:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToPtr(p + code.Offset)
+ if p == 0 || maplen(ptrToUnsafePtr(p)) == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructFieldMapPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToPtr(p + code.Offset)
+ if p != 0 {
+ p = ptrToNPtr(p, code.PtrNum)
+ }
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptyMapPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToPtr(p + code.Offset)
+ if p != 0 {
+ p = ptrToNPtr(p, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ } else {
+ code = code.NextField
+ }
+ case encoder.OpStructFieldStruct:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptyStruct:
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ if ptrToPtr(p) == 0 && code.IsNextOpPtrType {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructAnonymousEnd:
+ code = code.Next
+ case encoder.OpStructEnd:
+ b = appendStructEndSkipLast(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndInt:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, ptrToUint64(p+code.Offset), code)
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyInt:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, u64, code)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndIntString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p+code.Offset), code)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyIntString:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, u64, code)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndIntPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendInt(b, ptrToUint64(p), code)
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyIntPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, ptrToUint64(p), code)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndIntPtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyIntPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndUint:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, ptrToUint64(p+code.Offset), code)
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyUint:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, u64, code)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndUintString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p+code.Offset), code)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyUintString:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, u64, code)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndUintPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendUint(b, ptrToUint64(p), code)
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyUintPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, ptrToUint64(p), code)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndUintPtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyUintPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat32:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, ptrToFloat32(p+code.Offset))
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat32:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat32(p + code.Offset)
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, v)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat32String:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p+code.Offset))
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat32String:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat32(p + code.Offset)
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, v)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat32Ptr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendFloat32(b, ptrToFloat32(p))
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat32Ptr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat32PtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = append(b, '"')
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat32PtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat64:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat64(b, v)
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat64:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if v != 0 {
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat64(b, v)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat64String:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat64String:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if v != 0 {
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat64Ptr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ break
+ }
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat64Ptr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat64PtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat64PtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, ptrToString(p+code.Offset))
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToString(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, v)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndStringString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ s := ptrToString(p + code.Offset)
+ b = appendString(b, string(appendString([]byte{}, s)))
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyStringString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToString(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, v)))
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndStringPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendString(b, ptrToString(p))
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyStringPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, ptrToString(p))
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndStringPtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p))))
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyStringPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p))))
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndBool:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, ptrToBool(p+code.Offset))
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyBool:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToBool(p + code.Offset)
+ if v {
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, v)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndBoolString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p+code.Offset))
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyBoolString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToBool(p + code.Offset)
+ if v {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, v)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndBoolPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendBool(b, ptrToBool(p))
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyBoolPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, ptrToBool(p))
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndBoolPtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p))
+ b = append(b, '"')
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyBoolPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p))
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndBytes:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, ptrToBytes(p+code.Offset))
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyBytes:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToBytes(p + code.Offset)
+ if len(v) > 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, v)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndBytesPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendByteSlice(b, ptrToBytes(p))
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyBytesPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, ptrToBytes(p))
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndNumber:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, ptrToNumber(p+code.Offset))
+ if err != nil {
+ return nil, err
+ }
+ b = appendStructEnd(ctx, code, bb)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyNumber:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToNumber(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, v)
+ if err != nil {
+ return nil, err
+ }
+ b = appendStructEnd(ctx, code, bb)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndNumberString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p+code.Offset))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyNumberString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToNumber(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, v)
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndNumberPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyNumberPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendStructEnd(ctx, code, bb)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndNumberPtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyNumberPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpEnd:
+ goto END
+ }
+ }
+END:
+ return b, nil
+}
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/vm_indent/debug_vm.go b/vendor/github.com/goccy/go-json/internal/encoder/vm_indent/debug_vm.go
new file mode 100644
index 000000000..4b78e9e33
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/vm_indent/debug_vm.go
@@ -0,0 +1,27 @@
+package vm_indent
+
+import (
+ "fmt"
+
+ "github.com/goccy/go-json/internal/encoder"
+)
+
+func DebugRun(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet, opt encoder.Option) ([]byte, error) {
+ defer func() {
+ if err := recover(); err != nil {
+ fmt.Println("=============[DEBUG]===============")
+ fmt.Println("* [TYPE]")
+ fmt.Println(codeSet.Type)
+ fmt.Printf("\n")
+ fmt.Println("* [ALL OPCODE]")
+ fmt.Println(codeSet.Code.Dump())
+ fmt.Printf("\n")
+ fmt.Println("* [CONTEXT]")
+ fmt.Printf("%+v\n", ctx)
+ fmt.Println("===================================")
+ panic(err)
+ }
+ }()
+
+ return Run(ctx, b, codeSet, opt)
+}
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/vm_indent/hack.go b/vendor/github.com/goccy/go-json/internal/encoder/vm_indent/hack.go
new file mode 100644
index 000000000..789ade895
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/vm_indent/hack.go
@@ -0,0 +1,9 @@
+package vm_indent
+
+import (
+ // HACK: compile order
+ // `vm`, `vm_escaped`, `vm_indent`, `vm_escaped_indent` packages uses a lot of memory to compile,
+ // so forcibly make dependencies and avoid compiling in concurrent.
+ // dependency order: vm => vm_escaped => vm_indent => vm_escaped_indent
+ _ "github.com/goccy/go-json/internal/encoder/vm_escaped_indent"
+)
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/vm_indent/util.go b/vendor/github.com/goccy/go-json/internal/encoder/vm_indent/util.go
new file mode 100644
index 000000000..d73fb7b83
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/vm_indent/util.go
@@ -0,0 +1,241 @@
+package vm_indent
+
+import (
+ "encoding/json"
+ "fmt"
+ "unsafe"
+
+ "github.com/goccy/go-json/internal/encoder"
+ "github.com/goccy/go-json/internal/runtime"
+)
+
+const uintptrSize = 4 << (^uintptr(0) >> 63)
+
+var (
+ appendInt = encoder.AppendInt
+ appendUint = encoder.AppendUint
+ appendFloat32 = encoder.AppendFloat32
+ appendFloat64 = encoder.AppendFloat64
+ appendString = encoder.AppendString
+ appendByteSlice = encoder.AppendByteSlice
+ appendNumber = encoder.AppendNumber
+ appendStructEnd = encoder.AppendStructEndIndent
+ appendIndent = encoder.AppendIndent
+ errUnsupportedValue = encoder.ErrUnsupportedValue
+ errUnsupportedFloat = encoder.ErrUnsupportedFloat
+ mapiterinit = encoder.MapIterInit
+ mapiterkey = encoder.MapIterKey
+ mapitervalue = encoder.MapIterValue
+ mapiternext = encoder.MapIterNext
+ maplen = encoder.MapLen
+)
+
+type emptyInterface struct {
+ typ *runtime.Type
+ ptr unsafe.Pointer
+}
+
+func errUnimplementedOp(op encoder.OpType) error {
+ return fmt.Errorf("encoder (indent): opcode %s has not been implemented", op)
+}
+
+func load(base uintptr, idx uintptr) uintptr {
+ addr := base + idx
+ return **(**uintptr)(unsafe.Pointer(&addr))
+}
+
+func store(base uintptr, idx uintptr, p uintptr) {
+ addr := base + idx
+ **(**uintptr)(unsafe.Pointer(&addr)) = p
+}
+
+func loadNPtr(base uintptr, idx uintptr, ptrNum int) uintptr {
+ addr := base + idx
+ p := **(**uintptr)(unsafe.Pointer(&addr))
+ for i := 0; i < ptrNum; i++ {
+ if p == 0 {
+ return 0
+ }
+ p = ptrToPtr(p)
+ }
+ return p
+}
+
+func ptrToUint64(p uintptr) uint64 { return **(**uint64)(unsafe.Pointer(&p)) }
+func ptrToFloat32(p uintptr) float32 { return **(**float32)(unsafe.Pointer(&p)) }
+func ptrToFloat64(p uintptr) float64 { return **(**float64)(unsafe.Pointer(&p)) }
+func ptrToBool(p uintptr) bool { return **(**bool)(unsafe.Pointer(&p)) }
+func ptrToBytes(p uintptr) []byte { return **(**[]byte)(unsafe.Pointer(&p)) }
+func ptrToNumber(p uintptr) json.Number { return **(**json.Number)(unsafe.Pointer(&p)) }
+func ptrToString(p uintptr) string { return **(**string)(unsafe.Pointer(&p)) }
+func ptrToSlice(p uintptr) *runtime.SliceHeader { return *(**runtime.SliceHeader)(unsafe.Pointer(&p)) }
+func ptrToPtr(p uintptr) uintptr {
+ return uintptr(**(**unsafe.Pointer)(unsafe.Pointer(&p)))
+}
+func ptrToNPtr(p uintptr, ptrNum int) uintptr {
+ for i := 0; i < ptrNum; i++ {
+ if p == 0 {
+ return 0
+ }
+ p = ptrToPtr(p)
+ }
+ return p
+}
+
+func ptrToUnsafePtr(p uintptr) unsafe.Pointer {
+ return *(*unsafe.Pointer)(unsafe.Pointer(&p))
+}
+func ptrToInterface(code *encoder.Opcode, p uintptr) interface{} {
+ return *(*interface{})(unsafe.Pointer(&emptyInterface{
+ typ: code.Type,
+ ptr: *(*unsafe.Pointer)(unsafe.Pointer(&p)),
+ }))
+}
+
+func appendBool(b []byte, v bool) []byte {
+ if v {
+ return append(b, "true"...)
+ }
+ return append(b, "false"...)
+}
+
+func appendNull(b []byte) []byte {
+ return append(b, "null"...)
+}
+
+func appendComma(b []byte) []byte {
+ return append(b, ',', '\n')
+}
+
+func appendColon(b []byte) []byte {
+ return append(b, ':', ' ')
+}
+
+func appendInterface(ctx *encoder.RuntimeContext, codeSet *encoder.OpcodeSet, opt encoder.Option, code *encoder.Opcode, b []byte, iface *emptyInterface, ptrOffset uintptr) ([]byte, error) {
+ ctx.KeepRefs = append(ctx.KeepRefs, unsafe.Pointer(iface))
+ ifaceCodeSet, err := encoder.CompileToGetCodeSet(uintptr(unsafe.Pointer(iface.typ)))
+ if err != nil {
+ return nil, err
+ }
+
+ totalLength := uintptr(codeSet.CodeLength)
+ nextTotalLength := uintptr(ifaceCodeSet.CodeLength)
+
+ curlen := uintptr(len(ctx.Ptrs))
+ offsetNum := ptrOffset / uintptrSize
+
+ newLen := offsetNum + totalLength + nextTotalLength
+ if curlen < newLen {
+ ctx.Ptrs = append(ctx.Ptrs, make([]uintptr, newLen-curlen)...)
+ }
+ oldPtrs := ctx.Ptrs
+
+ newPtrs := ctx.Ptrs[(ptrOffset+totalLength*uintptrSize)/uintptrSize:]
+ newPtrs[0] = uintptr(iface.ptr)
+
+ ctx.Ptrs = newPtrs
+
+ oldBaseIndent := ctx.BaseIndent
+ ctx.BaseIndent = code.Indent
+ bb, err := Run(ctx, b, ifaceCodeSet, opt)
+ if err != nil {
+ return nil, err
+ }
+ ctx.BaseIndent = oldBaseIndent
+
+ ctx.Ptrs = oldPtrs
+
+ return bb, nil
+}
+
+func appendMapKeyValue(ctx *encoder.RuntimeContext, code *encoder.Opcode, b, key, value []byte) []byte {
+ b = appendIndent(ctx, b, code.Indent+1)
+ b = append(b, key...)
+ b[len(b)-2] = ':'
+ b[len(b)-1] = ' '
+ return append(b, value...)
+}
+
+func appendMapEnd(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte {
+ b = b[:len(b)-2]
+ b = append(b, '\n')
+ b = appendIndent(ctx, b, code.Indent)
+ return append(b, '}', ',', '\n')
+}
+
+func appendArrayHead(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte {
+ b = append(b, '[', '\n')
+ return appendIndent(ctx, b, code.Indent+1)
+}
+
+func appendArrayEnd(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte {
+ b = b[:len(b)-2]
+ b = append(b, '\n')
+ b = appendIndent(ctx, b, code.Indent)
+ return append(b, ']', ',', '\n')
+}
+
+func appendEmptyArray(b []byte) []byte {
+ return append(b, '[', ']', ',', '\n')
+}
+
+func appendEmptyObject(b []byte) []byte {
+ return append(b, '{', '}', ',', '\n')
+}
+
+func appendObjectEnd(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte {
+ last := len(b) - 1
+ b[last] = '\n'
+ b = appendIndent(ctx, b, code.Indent-1)
+ return append(b, '}', ',', '\n')
+}
+
+func appendMarshalJSON(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte, v interface{}) ([]byte, error) {
+ return encoder.AppendMarshalJSONIndent(ctx, code, b, v, false)
+}
+
+func appendMarshalText(code *encoder.Opcode, b []byte, v interface{}) ([]byte, error) {
+ return encoder.AppendMarshalTextIndent(code, b, v, false)
+}
+
+func appendStructHead(b []byte) []byte {
+ return append(b, '{', '\n')
+}
+
+func appendStructKey(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte {
+ b = appendIndent(ctx, b, code.Indent)
+ b = append(b, code.Key...)
+ return append(b, ' ')
+}
+
+func appendStructEndSkipLast(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte {
+ last := len(b) - 1
+ if b[last-1] == '{' {
+ b[last] = '}'
+ } else {
+ if b[last] == '\n' {
+ // to remove ',' and '\n' characters
+ b = b[:len(b)-2]
+ }
+ b = append(b, '\n')
+ b = appendIndent(ctx, b, code.Indent-1)
+ b = append(b, '}')
+ }
+ return appendComma(b)
+}
+
+func restoreIndent(ctx *encoder.RuntimeContext, code *encoder.Opcode, ctxptr uintptr) {
+ ctx.BaseIndent = int(load(ctxptr, code.Length))
+}
+
+func storeIndent(ctxptr uintptr, code *encoder.Opcode, indent uintptr) {
+ store(ctxptr, code.End.Next.Length, indent)
+}
+
+func appendArrayElemIndent(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte {
+ return appendIndent(ctx, b, code.Indent+1)
+}
+
+func appendMapKeyIndent(ctx *encoder.RuntimeContext, code *encoder.Opcode, b []byte) []byte {
+ return appendIndent(ctx, b, code.Indent)
+}
diff --git a/vendor/github.com/goccy/go-json/internal/encoder/vm_indent/vm.go b/vendor/github.com/goccy/go-json/internal/encoder/vm_indent/vm.go
new file mode 100644
index 000000000..b470adaf4
--- /dev/null
+++ b/vendor/github.com/goccy/go-json/internal/encoder/vm_indent/vm.go
@@ -0,0 +1,4993 @@
+// Code generated by internal/cmd/generator. DO NOT EDIT!
+package vm_indent
+
+import (
+ "math"
+ "sort"
+ "unsafe"
+
+ "github.com/goccy/go-json/internal/encoder"
+)
+
+func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet, opt encoder.Option) ([]byte, error) {
+ recursiveLevel := 0
+ ptrOffset := uintptr(0)
+ ctxptr := ctx.Ptr()
+ code := codeSet.Code
+
+ for {
+ switch code.Op {
+ default:
+ return nil, errUnimplementedOp(code.Op)
+ case encoder.OpPtr:
+ p := load(ctxptr, code.Idx)
+ code = code.Next
+ store(ctxptr, code.Idx, ptrToPtr(p))
+ case encoder.OpIntPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpInt:
+ b = appendInt(b, ptrToUint64(load(ctxptr, code.Idx)), code)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpUintPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpUint:
+ b = appendUint(b, ptrToUint64(load(ctxptr, code.Idx)), code)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpIntString:
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(load(ctxptr, code.Idx)), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpUintString:
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(load(ctxptr, code.Idx)), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpFloat32Ptr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpFloat32:
+ b = appendFloat32(b, ptrToFloat32(load(ctxptr, code.Idx)))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpFloat64Ptr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpFloat64:
+ v := ptrToFloat64(load(ctxptr, code.Idx))
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStringPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpString:
+ b = appendString(b, ptrToString(load(ctxptr, code.Idx)))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpBoolPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpBool:
+ b = appendBool(b, ptrToBool(load(ctxptr, code.Idx)))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpBytesPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpBytes:
+ b = appendByteSlice(b, ptrToBytes(load(ctxptr, code.Idx)))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpNumberPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpNumber:
+ bb, err := appendNumber(b, ptrToNumber(load(ctxptr, code.Idx)))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpInterfacePtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpInterface:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ for _, seen := range ctx.SeenPtr {
+ if p == seen {
+ return nil, errUnsupportedValue(code, p)
+ }
+ }
+ ctx.SeenPtr = append(ctx.SeenPtr, p)
+ iface := (*emptyInterface)(ptrToUnsafePtr(p))
+ if iface.ptr == nil {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ bb, err := appendInterface(ctx, codeSet, opt, code, b, iface, ptrOffset)
+ if err != nil {
+ return nil, err
+ }
+ ctxptr = ctx.Ptr()
+ ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
+
+ b = bb
+ code = code.Next
+ case encoder.OpMarshalJSONPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToPtr(p))
+ fallthrough
+ case encoder.OpMarshalJSON:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ if code.IsNilableType && code.Indirect {
+ p = ptrToPtr(p)
+ }
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpMarshalTextPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToPtr(p))
+ fallthrough
+ case encoder.OpMarshalText:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = append(b, `""`...)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ if code.IsNilableType && code.Indirect {
+ p = ptrToPtr(p)
+ }
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpSlicePtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpSlice:
+ p := load(ctxptr, code.Idx)
+ slice := ptrToSlice(p)
+ if p == 0 || slice.Data == nil {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.ElemIdx, 0)
+ store(ctxptr, code.Length, uintptr(slice.Len))
+ store(ctxptr, code.Idx, uintptr(slice.Data))
+ if slice.Len > 0 {
+ b = appendArrayHead(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, uintptr(slice.Data))
+ } else {
+ b = appendEmptyArray(b)
+ code = code.End.Next
+ }
+ case encoder.OpSliceElem:
+ idx := load(ctxptr, code.ElemIdx)
+ length := load(ctxptr, code.Length)
+ idx++
+ if idx < length {
+ b = appendArrayElemIndent(ctx, code, b)
+ store(ctxptr, code.ElemIdx, idx)
+ data := load(ctxptr, code.HeadIdx)
+ size := code.Size
+ code = code.Next
+ store(ctxptr, code.Idx, data+idx*size)
+ } else {
+ b = appendArrayEnd(ctx, code, b)
+ code = code.End.Next
+ }
+ case encoder.OpArrayPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpArray:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.End.Next
+ break
+ }
+ if code.Length > 0 {
+ b = appendArrayHead(ctx, code, b)
+ store(ctxptr, code.ElemIdx, 0)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ } else {
+ b = appendEmptyArray(b)
+ code = code.End.Next
+ }
+ case encoder.OpArrayElem:
+ idx := load(ctxptr, code.ElemIdx)
+ idx++
+ if idx < code.Length {
+ b = appendArrayElemIndent(ctx, code, b)
+ store(ctxptr, code.ElemIdx, idx)
+ p := load(ctxptr, code.HeadIdx)
+ size := code.Size
+ code = code.Next
+ store(ctxptr, code.Idx, p+idx*size)
+ } else {
+ b = appendArrayEnd(ctx, code, b)
+ code = code.End.Next
+ }
+ case encoder.OpMapPtr:
+ p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, p)
+ fallthrough
+ case encoder.OpMap:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.End.Next
+ break
+ }
+ uptr := ptrToUnsafePtr(p)
+ mlen := maplen(uptr)
+ if mlen <= 0 {
+ b = appendEmptyObject(b)
+ code = code.End.Next
+ break
+ }
+ b = appendStructHead(b)
+ iter := mapiterinit(code.Type, uptr)
+ ctx.KeepRefs = append(ctx.KeepRefs, iter)
+ store(ctxptr, code.ElemIdx, 0)
+ store(ctxptr, code.Length, uintptr(mlen))
+ store(ctxptr, code.MapIter, uintptr(iter))
+ if (opt & encoder.UnorderedMapOption) == 0 {
+ mapCtx := encoder.NewMapContext(mlen)
+ mapCtx.Pos = append(mapCtx.Pos, len(b))
+ ctx.KeepRefs = append(ctx.KeepRefs, unsafe.Pointer(mapCtx))
+ store(ctxptr, code.End.MapPos, uintptr(unsafe.Pointer(mapCtx)))
+ } else {
+ b = appendMapKeyIndent(ctx, code.Next, b)
+ }
+ key := mapiterkey(iter)
+ store(ctxptr, code.Next.Idx, uintptr(key))
+ code = code.Next
+ case encoder.OpMapKey:
+ idx := load(ctxptr, code.ElemIdx)
+ length := load(ctxptr, code.Length)
+ idx++
+ if (opt & encoder.UnorderedMapOption) != 0 {
+ if idx < length {
+ b = appendMapKeyIndent(ctx, code, b)
+ store(ctxptr, code.ElemIdx, idx)
+ ptr := load(ctxptr, code.MapIter)
+ iter := ptrToUnsafePtr(ptr)
+ key := mapiterkey(iter)
+ store(ctxptr, code.Next.Idx, uintptr(key))
+ code = code.Next
+ } else {
+ b = appendObjectEnd(ctx, code, b)
+ code = code.End.Next
+ }
+ } else {
+ ptr := load(ctxptr, code.End.MapPos)
+ mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(ptr))
+ mapCtx.Pos = append(mapCtx.Pos, len(b))
+ if idx < length {
+ ptr := load(ctxptr, code.MapIter)
+ iter := ptrToUnsafePtr(ptr)
+ store(ctxptr, code.ElemIdx, idx)
+ key := mapiterkey(iter)
+ store(ctxptr, code.Next.Idx, uintptr(key))
+ code = code.Next
+ } else {
+ code = code.End
+ }
+ }
+ case encoder.OpMapValue:
+ if (opt & encoder.UnorderedMapOption) != 0 {
+ b = appendColon(b)
+ } else {
+ ptr := load(ctxptr, code.End.MapPos)
+ mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(ptr))
+ mapCtx.Pos = append(mapCtx.Pos, len(b))
+ }
+ ptr := load(ctxptr, code.MapIter)
+ iter := ptrToUnsafePtr(ptr)
+ value := mapitervalue(iter)
+ store(ctxptr, code.Next.Idx, uintptr(value))
+ mapiternext(iter)
+ code = code.Next
+ case encoder.OpMapEnd:
+ // this operation only used by sorted map.
+ length := int(load(ctxptr, code.Length))
+ ptr := load(ctxptr, code.MapPos)
+ mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(ptr))
+ pos := mapCtx.Pos
+ for i := 0; i < length; i++ {
+ startKey := pos[i*2]
+ startValue := pos[i*2+1]
+ var endValue int
+ if i+1 < length {
+ endValue = pos[i*2+2]
+ } else {
+ endValue = len(b)
+ }
+ mapCtx.Slice.Items = append(mapCtx.Slice.Items, encoder.MapItem{
+ Key: b[startKey:startValue],
+ Value: b[startValue:endValue],
+ })
+ }
+ sort.Sort(mapCtx.Slice)
+ buf := mapCtx.Buf
+ for _, item := range mapCtx.Slice.Items {
+ buf = appendMapKeyValue(ctx, code, buf, item.Key, item.Value)
+ }
+ buf = appendMapEnd(ctx, code, buf)
+ b = b[:pos[0]]
+ b = append(b, buf...)
+ mapCtx.Buf = buf
+ encoder.ReleaseMapContext(mapCtx)
+ code = code.Next
+ case encoder.OpRecursivePtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ code = code.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpRecursive:
+ ptr := load(ctxptr, code.Idx)
+ if ptr != 0 {
+ if recursiveLevel > encoder.StartDetectingCyclesAfter {
+ for _, seen := range ctx.SeenPtr {
+ if ptr == seen {
+ return nil, errUnsupportedValue(code, ptr)
+ }
+ }
+ }
+ }
+ ctx.SeenPtr = append(ctx.SeenPtr, ptr)
+ c := code.Jmp.Code
+ curlen := uintptr(len(ctx.Ptrs))
+ offsetNum := ptrOffset / uintptrSize
+ oldOffset := ptrOffset
+ ptrOffset += code.Jmp.CurLen * uintptrSize
+ oldBaseIndent := ctx.BaseIndent
+ ctx.BaseIndent += code.Indent - 1
+
+ newLen := offsetNum + code.Jmp.CurLen + code.Jmp.NextLen
+ if curlen < newLen {
+ ctx.Ptrs = append(ctx.Ptrs, make([]uintptr, newLen-curlen)...)
+ }
+ ctxptr = ctx.Ptr() + ptrOffset // assign new ctxptr
+
+ store(ctxptr, c.Idx, ptr)
+ store(ctxptr, c.End.Next.Idx, oldOffset)
+ store(ctxptr, c.End.Next.ElemIdx, uintptr(unsafe.Pointer(code.Next)))
+ storeIndent(ctxptr, c, uintptr(oldBaseIndent))
+ code = c
+ recursiveLevel++
+ case encoder.OpRecursiveEnd:
+ recursiveLevel--
+
+ // restore ctxptr
+ restoreIndent(ctx, code, ctxptr)
+ offset := load(ctxptr, code.Idx)
+ ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
+
+ codePtr := load(ctxptr, code.ElemIdx)
+ code = (*encoder.Opcode)(ptrToUnsafePtr(codePtr))
+ ctxptr = ctx.Ptr() + offset
+ ptrOffset = offset
+ case encoder.OpStructPtrHead:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHead:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && (code.Indirect || code.Next.Op == encoder.OpStructEnd) {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if !code.AnonymousKey && len(code.Key) > 0 {
+ b = appendStructKey(ctx, code, b)
+ }
+ p += code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructPtrHeadOmitEmpty:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmpty:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && (code.Indirect || code.Next.Op == encoder.OpStructEnd) {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ p += code.Offset
+ if p == 0 || (ptrToPtr(p) == 0 && code.IsNextOpPtrType) {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadInt:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadInt:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, ptrToUint64(p+code.Offset), code)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyInt:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyInt:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, u64, code)
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadIntString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadIntString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p+code.Offset), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyIntString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyIntString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, u64, code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadIntPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadIntPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendInt(b, ptrToUint64(p), code)
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyIntPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyIntPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, ptrToUint64(p), code)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadIntPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadIntPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyIntPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyIntPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadUint:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadUint:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, ptrToUint64(p+code.Offset), code)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyUint:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyUint:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, u64, code)
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadUintString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadUintString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p+code.Offset), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyUintString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyUintString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, u64, code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadUintPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadUintPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendUint(b, ptrToUint64(p), code)
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyUintPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyUintPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, ptrToUint64(p), code)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadUintPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadUintPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyUintPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyUintPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadFloat32:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadFloat32:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, ptrToFloat32(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat32:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat32:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToFloat32(p + code.Offset)
+ if v == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, v)
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadFloat32String:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadFloat32String:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p+code.Offset))
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat32String:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat32String:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToFloat32(p + code.Offset)
+ if v == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadFloat32Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadFloat32Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendFloat32(b, ptrToFloat32(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat32Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat32Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadFloat32PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadFloat32PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat32PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat32PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadFloat64:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadFloat64:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ v := ptrToFloat64(p + code.Offset)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat64:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat64:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToFloat64(p + code.Offset)
+ if v == 0 {
+ code = code.NextField
+ } else {
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadFloat64String:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadFloat64String:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToFloat64(p + code.Offset)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat64String:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat64String:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToFloat64(p + code.Offset)
+ if v == 0 {
+ code = code.NextField
+ } else {
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadFloat64Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadFloat64Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat64Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat64Ptr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadFloat64PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadFloat64PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyFloat64PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyFloat64PtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, ptrToString(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToString(p + code.Offset)
+ if v == "" {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, v)
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadStringString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadStringString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p+code.Offset))))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyStringString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyStringString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToString(p + code.Offset)
+ if v == "" {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, v)))
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadStringPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadStringPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendString(b, ptrToString(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyStringPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyStringPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, ptrToString(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadStringPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadStringPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p))))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyStringPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyStringPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p))))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadBool:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadBool:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, ptrToBool(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyBool:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyBool:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToBool(p + code.Offset)
+ if v {
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, v)
+ b = appendComma(b)
+ code = code.Next
+ } else {
+ code = code.NextField
+ }
+ case encoder.OpStructPtrHeadBoolString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadBoolString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p+code.Offset))
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyBoolString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyBoolString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToBool(p + code.Offset)
+ if v {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ } else {
+ code = code.NextField
+ }
+ case encoder.OpStructPtrHeadBoolPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadBoolPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendBool(b, ptrToBool(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyBoolPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyBoolPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, ptrToBool(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadBoolPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadBoolPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p))
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyBoolPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyBoolPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p))
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadBytes:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadBytes:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, ptrToBytes(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyBytes:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyBytes:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToBytes(p + code.Offset)
+ if len(v) == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, v)
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadBytesPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadBytesPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendByteSlice(b, ptrToBytes(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyBytesPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyBytesPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, ptrToBytes(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadNumber:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadNumber:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, ptrToNumber(p+code.Offset))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyNumber:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyNumber:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToNumber(p + code.Offset)
+ if v == "" {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, v)
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadNumberString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadNumberString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p+code.Offset))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyNumberString:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyNumberString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ v := ptrToNumber(p + code.Offset)
+ if v == "" {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, v)
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadNumberPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadNumberPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyNumberPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyNumberPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadNumberPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadNumberPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyNumberPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyNumberPtrString:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructPtrHeadArray, encoder.OpStructPtrHeadSlice:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadArray, encoder.OpStructHeadSlice:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ p += code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructPtrHeadOmitEmptyArray:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyArray:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ p += code.Offset
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructPtrHeadOmitEmptySlice:
+ if code.Indirect {
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptySlice:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ p += code.Offset
+ slice := ptrToSlice(p)
+ if slice.Len == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadArrayPtr, encoder.OpStructPtrHeadSlicePtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadArrayPtr, encoder.OpStructHeadSlicePtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.NextField
+ } else {
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadOmitEmptyArrayPtr, encoder.OpStructPtrHeadOmitEmptySlicePtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyArrayPtr, encoder.OpStructHeadOmitEmptySlicePtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadMap:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadMap:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if p != 0 && code.Indirect {
+ p = ptrToPtr(p + code.Offset)
+ }
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructPtrHeadOmitEmptyMap:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyMap:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if p != 0 && code.Indirect {
+ p = ptrToPtr(p + code.Offset)
+ }
+ if maplen(ptrToUnsafePtr(p)) == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadMapPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadMapPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.NextField
+ break
+ }
+ p = ptrToPtr(p + code.Offset)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.NextField
+ } else {
+ if code.Indirect {
+ p = ptrToNPtr(p, code.PtrNum)
+ }
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadOmitEmptyMapPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyMapPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if p == 0 {
+ code = code.NextField
+ break
+ }
+ p = ptrToPtr(p + code.Offset)
+ if p == 0 {
+ code = code.NextField
+ } else {
+ if code.Indirect {
+ p = ptrToNPtr(p, code.PtrNum)
+ }
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructPtrHeadMarshalJSON:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if code.Indirect {
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadMarshalJSON:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.IsNilableType {
+ if code.Indirect || code.Op == encoder.OpStructPtrHeadMarshalJSON {
+ p = ptrToPtr(p + code.Offset)
+ }
+ }
+ if p == 0 && code.Nilcheck {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyMarshalJSON:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if code.Indirect {
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyMarshalJSON:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.IsNilableType {
+ if code.Indirect || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalJSON {
+ p = ptrToPtr(p + code.Offset)
+ }
+ }
+ iface := ptrToInterface(code, p)
+ if code.Nilcheck && encoder.IsNilForMarshaler(iface) {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalJSON(ctx, code, b, iface)
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadMarshalJSONPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadMarshalJSONPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyMarshalJSONPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyMarshalJSONPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if p == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadMarshalText:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if code.Indirect {
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadMarshalText:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.IsNilableType {
+ if code.Indirect || code.Op == encoder.OpStructPtrHeadMarshalText {
+ p = ptrToPtr(p + code.Offset)
+ }
+ }
+ if p == 0 && code.Nilcheck {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyMarshalText:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if code.Indirect {
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ }
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyMarshalText:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if code.IsNilableType {
+ if code.Indirect || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalText {
+ p = ptrToPtr(p + code.Offset)
+ }
+ }
+ if p == 0 && code.Nilcheck {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructPtrHeadMarshalTextPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadMarshalTextPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ b = appendStructKey(ctx, code, b)
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructPtrHeadOmitEmptyMarshalTextPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
+ fallthrough
+ case encoder.OpStructHeadOmitEmptyMarshalTextPtr:
+ p := load(ctxptr, code.Idx)
+ if p == 0 && code.Indirect {
+ if !code.AnonymousHead {
+ b = appendNull(b)
+ b = appendComma(b)
+ }
+ code = code.End.Next
+ break
+ }
+ if code.Indirect {
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ }
+ if !code.AnonymousHead {
+ b = appendStructHead(b)
+ }
+ if p == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ b = appendComma(b)
+ code = code.Next
+ }
+ case encoder.OpStructField:
+ if !code.AnonymousKey {
+ b = appendStructKey(ctx, code, b)
+ }
+ p := load(ctxptr, code.HeadIdx) + code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmpty:
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ if ptrToPtr(p) == 0 && code.IsNextOpPtrType {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructFieldInt:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, ptrToUint64(p+code.Offset), code)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyInt:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, u64, code)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldIntString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p+code.Offset), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyIntString:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, u64, code)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldIntPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendInt(b, ptrToUint64(p), code)
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyIntPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, ptrToUint64(p), code)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldIntPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyIntPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldUint:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, ptrToUint64(p+code.Offset), code)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyUint:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, u64, code)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldUintString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p+code.Offset), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyUintString:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, u64, code)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldUintPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendUint(b, ptrToUint64(p), code)
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyUintPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, ptrToUint64(p), code)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldUintPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyUintPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat32:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, ptrToFloat32(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat32:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat32(p + code.Offset)
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat32String:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p+code.Offset))
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat32String:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat32(p + code.Offset)
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat32Ptr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendFloat32(b, ptrToFloat32(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat32Ptr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat32PtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat32PtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat64:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ v := ptrToFloat64(p + code.Offset)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat64:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if v != 0 {
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat64String:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat64String:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if v != 0 {
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat64Ptr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendComma(b)
+ code = code.Next
+ break
+ }
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat64Ptr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldFloat64PtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyFloat64PtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, ptrToString(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToString(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldStringString:
+ p := load(ctxptr, code.HeadIdx)
+ s := ptrToString(p + code.Offset)
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, s)))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyStringString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToString(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, v)))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldStringPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendString(b, ptrToString(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyStringPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, ptrToString(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldStringPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p))))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyStringPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p))))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldBool:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, ptrToBool(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyBool:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToBool(p + code.Offset)
+ if v {
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldBoolString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p+code.Offset))
+ b = append(b, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyBoolString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToBool(p + code.Offset)
+ if v {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, v)
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldBoolPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendBool(b, ptrToBool(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyBoolPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, ptrToBool(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldBoolPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p))
+ b = append(b, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyBoolPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p))
+ b = append(b, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldBytes:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, ptrToBytes(p+code.Offset))
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyBytes:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToBytes(p + code.Offset)
+ if len(v) > 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, v)
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldBytesPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendByteSlice(b, ptrToBytes(p))
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyBytesPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, ptrToBytes(p))
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldNumber:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, ptrToNumber(p+code.Offset))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyNumber:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToNumber(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, v)
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ }
+ code = code.Next
+ case encoder.OpStructFieldNumberString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p+code.Offset))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyNumberString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToNumber(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, v)
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldNumberPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyNumberPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ }
+ code = code.Next
+ case encoder.OpStructFieldNumberPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ b = appendStructKey(ctx, code, b)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyNumberPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendComma(b)
+ }
+ code = code.Next
+ case encoder.OpStructFieldMarshalJSON:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ p += code.Offset
+ if code.IsNilableType {
+ p = ptrToPtr(p)
+ }
+ if p == 0 && code.Nilcheck {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyMarshalJSON:
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ if code.IsNilableType {
+ p = ptrToPtr(p)
+ }
+ if p == 0 && code.Nilcheck {
+ code = code.NextField
+ break
+ }
+ iface := ptrToInterface(code, p)
+ if code.Nilcheck && encoder.IsNilForMarshaler(iface) {
+ code = code.NextField
+ break
+ }
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalJSON(ctx, code, b, iface)
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpStructFieldMarshalJSONPtr:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyMarshalJSONPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ }
+ code = code.Next
+ case encoder.OpStructFieldMarshalText:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ p += code.Offset
+ if code.IsNilableType {
+ p = ptrToPtr(p)
+ }
+ if p == 0 && code.Nilcheck {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyMarshalText:
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ if code.IsNilableType {
+ p = ptrToPtr(p)
+ }
+ if p == 0 && code.Nilcheck {
+ code = code.NextField
+ break
+ }
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ code = code.Next
+ case encoder.OpStructFieldMarshalTextPtr:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendComma(b)
+ code = code.Next
+ case encoder.OpStructFieldOmitEmptyMarshalTextPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendMarshalText(code, b, ptrToInterface(code, p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendComma(bb)
+ }
+ code = code.Next
+ case encoder.OpStructFieldArray:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptyArray:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldArrayPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptyArrayPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ } else {
+ code = code.NextField
+ }
+ case encoder.OpStructFieldSlice:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptySlice:
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ slice := ptrToSlice(p)
+ if slice.Len == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructFieldSlicePtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptySlicePtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ } else {
+ code = code.NextField
+ }
+ case encoder.OpStructFieldMap:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToPtr(p + code.Offset)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptyMap:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToPtr(p + code.Offset)
+ if p == 0 || maplen(ptrToUnsafePtr(p)) == 0 {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructFieldMapPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToPtr(p + code.Offset)
+ if p != 0 {
+ p = ptrToNPtr(p, code.PtrNum)
+ }
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptyMapPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToPtr(p + code.Offset)
+ if p != 0 {
+ p = ptrToNPtr(p, code.PtrNum)
+ }
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ } else {
+ code = code.NextField
+ }
+ case encoder.OpStructFieldStruct:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ case encoder.OpStructFieldOmitEmptyStruct:
+ p := load(ctxptr, code.HeadIdx)
+ p += code.Offset
+ if ptrToPtr(p) == 0 && code.IsNextOpPtrType {
+ code = code.NextField
+ } else {
+ b = appendStructKey(ctx, code, b)
+ code = code.Next
+ store(ctxptr, code.Idx, p)
+ }
+ case encoder.OpStructAnonymousEnd:
+ code = code.Next
+ case encoder.OpStructEnd:
+ b = appendStructEndSkipLast(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndInt:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, ptrToUint64(p+code.Offset), code)
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyInt:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, u64, code)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndIntString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p+code.Offset), code)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyIntString:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, u64, code)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndIntPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendInt(b, ptrToUint64(p), code)
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyIntPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendInt(b, ptrToUint64(p), code)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndIntPtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyIntPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendInt(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndUint:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, ptrToUint64(p+code.Offset), code)
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyUint:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, u64, code)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndUintString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p+code.Offset), code)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyUintString:
+ p := load(ctxptr, code.HeadIdx)
+ u64 := ptrToUint64(p + code.Offset)
+ v := u64 & code.Mask
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, u64, code)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndUintPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendUint(b, ptrToUint64(p), code)
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyUintPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendUint(b, ptrToUint64(p), code)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndUintPtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyUintPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendUint(b, ptrToUint64(p), code)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat32:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, ptrToFloat32(p+code.Offset))
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat32:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat32(p + code.Offset)
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, v)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat32String:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p+code.Offset))
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat32String:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat32(p + code.Offset)
+ if v != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, v)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat32Ptr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendFloat32(b, ptrToFloat32(p))
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat32Ptr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat32PtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = append(b, '"')
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat32PtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat32(b, ptrToFloat32(p))
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat64:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat64(b, v)
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat64:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if v != 0 {
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = appendFloat64(b, v)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat64String:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat64String:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToFloat64(p + code.Offset)
+ if v != 0 {
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat64Ptr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ break
+ }
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat64Ptr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndFloat64PtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyFloat64PtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ v := ptrToFloat64(p)
+ if math.IsInf(v, 0) || math.IsNaN(v) {
+ return nil, errUnsupportedFloat(v)
+ }
+ b = append(b, '"')
+ b = appendFloat64(b, v)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, ptrToString(p+code.Offset))
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToString(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, v)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndStringString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ s := ptrToString(p + code.Offset)
+ b = appendString(b, string(appendString([]byte{}, s)))
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyStringString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToString(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, v)))
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndStringPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendString(b, ptrToString(p))
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyStringPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, ptrToString(p))
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndStringPtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p))))
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyStringPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendString(b, string(appendString([]byte{}, ptrToString(p))))
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndBool:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, ptrToBool(p+code.Offset))
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyBool:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToBool(p + code.Offset)
+ if v {
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, v)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndBoolString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p+code.Offset))
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyBoolString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToBool(p + code.Offset)
+ if v {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, v)
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndBoolPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendBool(b, ptrToBool(p))
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyBoolPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendBool(b, ptrToBool(p))
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndBoolPtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p))
+ b = append(b, '"')
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyBoolPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ b = appendBool(b, ptrToBool(p))
+ b = append(b, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndBytes:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, ptrToBytes(p+code.Offset))
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyBytes:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToBytes(p + code.Offset)
+ if len(v) > 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, v)
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndBytesPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = appendByteSlice(b, ptrToBytes(p))
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyBytesPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = appendByteSlice(b, ptrToBytes(p))
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndNumber:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, ptrToNumber(p+code.Offset))
+ if err != nil {
+ return nil, err
+ }
+ b = appendStructEnd(ctx, code, bb)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyNumber:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToNumber(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, v)
+ if err != nil {
+ return nil, err
+ }
+ b = appendStructEnd(ctx, code, bb)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndNumberString:
+ p := load(ctxptr, code.HeadIdx)
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p+code.Offset))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyNumberString:
+ p := load(ctxptr, code.HeadIdx)
+ v := ptrToNumber(p + code.Offset)
+ if v != "" {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, v)
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndNumberPtr:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = bb
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyNumberPtr:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = appendStructEnd(ctx, code, bb)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpStructEndNumberPtrString:
+ b = appendStructKey(ctx, code, b)
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p == 0 {
+ b = appendNull(b)
+ } else {
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ }
+ b = appendStructEnd(ctx, code, b)
+ code = code.Next
+ case encoder.OpStructEndOmitEmptyNumberPtrString:
+ p := load(ctxptr, code.HeadIdx)
+ p = ptrToNPtr(p+code.Offset, code.PtrNum)
+ if p != 0 {
+ b = appendStructKey(ctx, code, b)
+ b = append(b, '"')
+ bb, err := appendNumber(b, ptrToNumber(p))
+ if err != nil {
+ return nil, err
+ }
+ b = append(bb, '"')
+ b = appendStructEnd(ctx, code, b)
+ } else {
+ b = appendStructEndSkipLast(ctx, code, b)
+ }
+ code = code.Next
+ case encoder.OpEnd:
+ goto END
+ }
+ }
+END:
+ return b, nil
+}