...

Text file src/github.com/goccy/go-json/internal/cmd/generator/vm.go.tmpl

Documentation: github.com/goccy/go-json/internal/cmd/generator

     1// Code generated by internal/cmd/generator. DO NOT EDIT!
     2package vm
     3
     4import (
     5	"math"
     6	"reflect"
     7	"sort"
     8	"unsafe"
     9
    10	"github.com/goccy/go-json/internal/encoder"
    11	"github.com/goccy/go-json/internal/runtime"
    12)
    13
    14func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]byte, error) {
    15	recursiveLevel := 0
    16	ptrOffset := uintptr(0)
    17	ctxptr := ctx.Ptr()
    18	var code *encoder.Opcode
    19	if (ctx.Option.Flag & encoder.HTMLEscapeOption) != 0 {
    20		code = codeSet.EscapeKeyCode
    21	} else {
    22		code = codeSet.NoescapeKeyCode
    23	}
    24
    25	for {
    26		switch code.Op {
    27		default:
    28			return nil, errUnimplementedOp(code.Op)
    29		case encoder.OpPtr:
    30			p := load(ctxptr, code.Idx)
    31			code = code.Next
    32			store(ctxptr, code.Idx, ptrToPtr(p))
    33		case encoder.OpIntPtr:
    34			p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
    35			if p == 0 {
    36				b = appendNullComma(ctx, b)
    37				code = code.Next
    38				break
    39			}
    40			store(ctxptr, code.Idx, p)
    41			fallthrough
    42		case encoder.OpInt:
    43			b = appendInt(ctx, b, load(ctxptr, code.Idx), code)
    44			b = appendComma(ctx, b)
    45			code = code.Next
    46		case encoder.OpUintPtr:
    47			p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
    48			if p == 0 {
    49				b = appendNullComma(ctx, b)
    50				code = code.Next
    51				break
    52			}
    53			store(ctxptr, code.Idx, p)
    54			fallthrough
    55		case encoder.OpUint:
    56			b = appendUint(ctx, b, load(ctxptr, code.Idx), code)
    57			b = appendComma(ctx, b)
    58			code = code.Next
    59		case encoder.OpIntString:
    60			b = append(b, '"')
    61			b = appendInt(ctx, b, load(ctxptr, code.Idx), code)
    62			b = append(b, '"')
    63			b = appendComma(ctx, b)
    64			code = code.Next
    65		case encoder.OpUintString:
    66			b = append(b, '"')
    67			b = appendUint(ctx, b, load(ctxptr, code.Idx), code)
    68			b = append(b, '"')
    69			b = appendComma(ctx, b)
    70			code = code.Next
    71		case encoder.OpFloat32Ptr:
    72			p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
    73			if p == 0 {
    74				b = appendNull(ctx, b)
    75				b = appendComma(ctx, b)
    76				code = code.Next
    77				break
    78			}
    79			store(ctxptr, code.Idx, p)
    80			fallthrough
    81		case encoder.OpFloat32:
    82			b = appendFloat32(ctx, b, ptrToFloat32(load(ctxptr, code.Idx)))
    83			b = appendComma(ctx, b)
    84			code = code.Next
    85		case encoder.OpFloat64Ptr:
    86			p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
    87			if p == 0 {
    88				b = appendNullComma(ctx, b)
    89				code = code.Next
    90				break
    91			}
    92			store(ctxptr, code.Idx, p)
    93			fallthrough
    94		case encoder.OpFloat64:
    95			v := ptrToFloat64(load(ctxptr, code.Idx))
    96			if math.IsInf(v, 0) || math.IsNaN(v) {
    97				return nil, errUnsupportedFloat(v)
    98			}
    99			b = appendFloat64(ctx, b, v)
   100			b = appendComma(ctx, b)
   101			code = code.Next
   102		case encoder.OpStringPtr:
   103			p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
   104			if p == 0 {
   105				b = appendNullComma(ctx, b)
   106				code = code.Next
   107				break
   108			}
   109			store(ctxptr, code.Idx, p)
   110			fallthrough
   111		case encoder.OpString:
   112			b = appendString(ctx, b, ptrToString(load(ctxptr, code.Idx)))
   113			b = appendComma(ctx, b)
   114			code = code.Next
   115		case encoder.OpBoolPtr:
   116			p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
   117			if p == 0 {
   118				b = appendNullComma(ctx, b)
   119				code = code.Next
   120				break
   121			}
   122			store(ctxptr, code.Idx, p)
   123			fallthrough
   124		case encoder.OpBool:
   125			b = appendBool(ctx, b, ptrToBool(load(ctxptr, code.Idx)))
   126			b = appendComma(ctx, b)
   127			code = code.Next
   128		case encoder.OpBytesPtr:
   129			p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
   130			if p == 0 {
   131				b = appendNullComma(ctx, b)
   132				code = code.Next
   133				break
   134			}
   135			store(ctxptr, code.Idx, p)
   136			fallthrough
   137		case encoder.OpBytes:
   138			b = appendByteSlice(ctx, b, ptrToBytes(load(ctxptr, code.Idx)))
   139			b = appendComma(ctx, b)
   140			code = code.Next
   141		case encoder.OpNumberPtr:
   142			p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
   143			if p == 0 {
   144				b = appendNullComma(ctx, b)
   145				code = code.Next
   146				break
   147			}
   148			store(ctxptr, code.Idx, p)
   149			fallthrough
   150		case encoder.OpNumber:
   151			bb, err := appendNumber(ctx, b, ptrToNumber(load(ctxptr, code.Idx)))
   152			if err != nil {
   153				return nil, err
   154			}
   155			b = appendComma(ctx, bb)
   156			code = code.Next
   157		case encoder.OpInterfacePtr:
   158			p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
   159			if p == 0 {
   160				b = appendNullComma(ctx, b)
   161				code = code.Next
   162				break
   163			}
   164			store(ctxptr, code.Idx, p)
   165			fallthrough
   166		case encoder.OpInterface:
   167			p := load(ctxptr, code.Idx)
   168			if p == 0 {
   169				b = appendNullComma(ctx, b)
   170				code = code.Next
   171				break
   172			}
   173			if recursiveLevel > encoder.StartDetectingCyclesAfter {
   174				for _, seen := range ctx.SeenPtr {
   175					if p == seen {
   176						return nil, errUnsupportedValue(code, p)
   177					}
   178				}
   179			}
   180			ctx.SeenPtr = append(ctx.SeenPtr, p)
   181			var (
   182				typ      *runtime.Type
   183				ifacePtr unsafe.Pointer
   184			)
   185			up := ptrToUnsafePtr(p)
   186			if code.Flags&encoder.NonEmptyInterfaceFlags != 0 {
   187				iface := (*nonEmptyInterface)(up)
   188				ifacePtr = iface.ptr
   189				if iface.itab != nil {
   190					typ = iface.itab.typ
   191				}
   192			} else {
   193				iface := (*emptyInterface)(up)
   194				ifacePtr = iface.ptr
   195				typ = iface.typ
   196			}
   197			if ifacePtr == nil {
   198				isDirectedNil := typ != nil && typ.Kind() == reflect.Struct && !runtime.IfaceIndir(typ)
   199				if !isDirectedNil {
   200					b = appendNullComma(ctx, b)
   201					code = code.Next
   202					break
   203				}
   204			}
   205			ctx.KeepRefs = append(ctx.KeepRefs, up)
   206			ifaceCodeSet, err := encoder.CompileToGetCodeSet(ctx, uintptr(unsafe.Pointer(typ)))
   207			if err != nil {
   208				return nil, err
   209			}
   210
   211			totalLength := uintptr(code.Length) + 3
   212			nextTotalLength := uintptr(ifaceCodeSet.CodeLength) + 3
   213
   214			var c *encoder.Opcode
   215			if (ctx.Option.Flag & encoder.HTMLEscapeOption) != 0 {
   216				c = ifaceCodeSet.InterfaceEscapeKeyCode
   217			} else {
   218				c = ifaceCodeSet.InterfaceNoescapeKeyCode
   219			}
   220			curlen := uintptr(len(ctx.Ptrs))
   221			offsetNum := ptrOffset / uintptrSize
   222			oldOffset := ptrOffset
   223			ptrOffset += totalLength * uintptrSize
   224			oldBaseIndent := ctx.BaseIndent
   225			ctx.BaseIndent += code.Indent
   226
   227			newLen := offsetNum + totalLength + nextTotalLength
   228			if curlen < newLen {
   229				ctx.Ptrs = append(ctx.Ptrs, make([]uintptr, newLen-curlen)...)
   230			}
   231			ctxptr = ctx.Ptr() + ptrOffset // assign new ctxptr
   232
   233			end := ifaceCodeSet.EndCode
   234			store(ctxptr, c.Idx, uintptr(ifacePtr))
   235			store(ctxptr, end.Idx, oldOffset)
   236			store(ctxptr, end.ElemIdx, uintptr(unsafe.Pointer(code.Next)))
   237			storeIndent(ctxptr, end, uintptr(oldBaseIndent))
   238			code = c
   239			recursiveLevel++
   240		case encoder.OpInterfaceEnd:
   241			recursiveLevel--
   242
   243			// restore ctxptr
   244			offset := load(ctxptr, code.Idx)
   245			restoreIndent(ctx, code, ctxptr)
   246			ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
   247
   248			codePtr := load(ctxptr, code.ElemIdx)
   249			code = (*encoder.Opcode)(ptrToUnsafePtr(codePtr))
   250			ctxptr = ctx.Ptr() + offset
   251			ptrOffset = offset
   252		case encoder.OpMarshalJSONPtr:
   253			p := load(ctxptr, code.Idx)
   254			if p == 0 {
   255				b = appendNullComma(ctx, b)
   256				code = code.Next
   257				break
   258			}
   259			store(ctxptr, code.Idx, ptrToPtr(p))
   260			fallthrough
   261		case encoder.OpMarshalJSON:
   262			p := load(ctxptr, code.Idx)
   263			if p == 0 {
   264				b = appendNullComma(ctx, b)
   265				code = code.Next
   266				break
   267			}
   268			if (code.Flags&encoder.IsNilableTypeFlags) != 0 && (code.Flags&encoder.IndirectFlags) != 0 {
   269				p = ptrToPtr(p)
   270			}
   271			bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
   272			if err != nil {
   273				return nil, err
   274			}
   275			b = appendComma(ctx, bb)
   276			code = code.Next
   277		case encoder.OpMarshalTextPtr:
   278			p := load(ctxptr, code.Idx)
   279			if p == 0 {
   280				b = appendNullComma(ctx, b)
   281				code = code.Next
   282				break
   283			}
   284			store(ctxptr, code.Idx, ptrToPtr(p))
   285			fallthrough
   286		case encoder.OpMarshalText:
   287			p := load(ctxptr, code.Idx)
   288			if p == 0 {
   289				b = append(b, `""`...)
   290				b = appendComma(ctx, b)
   291				code = code.Next
   292				break
   293			}
   294			if (code.Flags&encoder.IsNilableTypeFlags) != 0 && (code.Flags&encoder.IndirectFlags) != 0 {
   295				p = ptrToPtr(p)
   296			}
   297			bb, err := appendMarshalText(ctx, code, b, ptrToInterface(code, p))
   298			if err != nil {
   299				return nil, err
   300			}
   301			b = appendComma(ctx, bb)
   302			code = code.Next
   303		case encoder.OpSlicePtr:
   304			p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
   305			if p == 0 {
   306				b = appendNullComma(ctx, b)
   307				code = code.End.Next
   308				break
   309			}
   310			store(ctxptr, code.Idx, p)
   311			fallthrough
   312		case encoder.OpSlice:
   313			p := load(ctxptr, code.Idx)
   314			slice := ptrToSlice(p)
   315			if p == 0 || slice.Data == nil {
   316				b = appendNullComma(ctx, b)
   317				code = code.End.Next
   318				break
   319			}
   320			store(ctxptr, code.ElemIdx, 0)
   321			store(ctxptr, code.Length, uintptr(slice.Len))
   322			store(ctxptr, code.Idx, uintptr(slice.Data))
   323			if slice.Len > 0 {
   324				b = appendArrayHead(ctx, code, b)
   325				code = code.Next
   326				store(ctxptr, code.Idx, uintptr(slice.Data))
   327			} else {
   328				b = appendEmptyArray(ctx, b)
   329				code = code.End.Next
   330			}
   331		case encoder.OpSliceElem:
   332			idx := load(ctxptr, code.ElemIdx)
   333			length := load(ctxptr, code.Length)
   334			idx++
   335			if idx < length {
   336				b = appendArrayElemIndent(ctx, code, b)
   337				store(ctxptr, code.ElemIdx, idx)
   338				data := load(ctxptr, code.Idx)
   339				size := uintptr(code.Size)
   340				code = code.Next
   341				store(ctxptr, code.Idx, data+idx*size)
   342			} else {
   343				b = appendArrayEnd(ctx, code, b)
   344				code = code.End.Next
   345			}
   346		case encoder.OpArrayPtr:
   347			p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
   348			if p == 0 {
   349				b = appendNullComma(ctx, b)
   350				code = code.End.Next
   351				break
   352			}
   353			store(ctxptr, code.Idx, p)
   354			fallthrough
   355		case encoder.OpArray:
   356			p := load(ctxptr, code.Idx)
   357			if p == 0 {
   358				b = appendNullComma(ctx, b)
   359				code = code.End.Next
   360				break
   361			}
   362			if code.Length > 0 {
   363				b = appendArrayHead(ctx, code, b)
   364				store(ctxptr, code.ElemIdx, 0)
   365				code = code.Next
   366				store(ctxptr, code.Idx, p)
   367			} else {
   368				b = appendEmptyArray(ctx, b)
   369				code = code.End.Next
   370			}
   371		case encoder.OpArrayElem:
   372			idx := load(ctxptr, code.ElemIdx)
   373			idx++
   374			if idx < uintptr(code.Length) {
   375				b = appendArrayElemIndent(ctx, code, b)
   376				store(ctxptr, code.ElemIdx, idx)
   377				p := load(ctxptr, code.Idx)
   378				size := uintptr(code.Size)
   379				code = code.Next
   380				store(ctxptr, code.Idx, p+idx*size)
   381			} else {
   382				b = appendArrayEnd(ctx, code, b)
   383				code = code.End.Next
   384			}
   385		case encoder.OpMapPtr:
   386			p := loadNPtr(ctxptr, code.Idx, code.PtrNum)
   387			if p == 0 {
   388				b = appendNullComma(ctx, b)
   389				code = code.End.Next
   390				break
   391			}
   392			store(ctxptr, code.Idx, p)
   393			fallthrough
   394		case encoder.OpMap:
   395			p := load(ctxptr, code.Idx)
   396			if p == 0 {
   397				b = appendNullComma(ctx, b)
   398				code = code.End.Next
   399				break
   400			}
   401			uptr := ptrToUnsafePtr(p)
   402			mlen := maplen(uptr)
   403			if mlen <= 0 {
   404				b = appendEmptyObject(ctx, b)
   405				code = code.End.Next
   406				break
   407			}
   408			b = appendStructHead(ctx, b)
   409			unorderedMap := (ctx.Option.Flag & encoder.UnorderedMapOption) != 0
   410			mapCtx := encoder.NewMapContext(mlen, unorderedMap)
   411			mapiterinit(code.Type, uptr, &mapCtx.Iter)
   412			store(ctxptr, code.Idx, uintptr(unsafe.Pointer(mapCtx)))
   413			ctx.KeepRefs = append(ctx.KeepRefs, unsafe.Pointer(mapCtx))
   414			if unorderedMap {
   415				b = appendMapKeyIndent(ctx, code.Next, b)
   416			} else {
   417				mapCtx.Start = len(b)
   418				mapCtx.First = len(b)
   419			}
   420			key := mapiterkey(&mapCtx.Iter)
   421			store(ctxptr, code.Next.Idx, uintptr(key))
   422			code = code.Next
   423		case encoder.OpMapKey:
   424			mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(load(ctxptr, code.Idx)))
   425			idx := mapCtx.Idx
   426			idx++
   427			if (ctx.Option.Flag & encoder.UnorderedMapOption) != 0 {
   428				if idx < mapCtx.Len {
   429					b = appendMapKeyIndent(ctx, code, b)
   430					mapCtx.Idx = int(idx)
   431					key := mapiterkey(&mapCtx.Iter)
   432					store(ctxptr, code.Next.Idx, uintptr(key))
   433					code = code.Next
   434				} else {
   435					b = appendObjectEnd(ctx, code, b)
   436					encoder.ReleaseMapContext(mapCtx)
   437					code = code.End.Next
   438				}
   439			} else {
   440				mapCtx.Slice.Items[mapCtx.Idx].Value = b[mapCtx.Start:len(b)]
   441				if idx < mapCtx.Len {
   442					mapCtx.Idx = int(idx)
   443					mapCtx.Start = len(b)
   444					key := mapiterkey(&mapCtx.Iter)
   445					store(ctxptr, code.Next.Idx, uintptr(key))
   446					code = code.Next
   447				} else {
   448					code = code.End
   449				}
   450			}
   451		case encoder.OpMapValue:
   452			mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(load(ctxptr, code.Idx)))
   453			if (ctx.Option.Flag & encoder.UnorderedMapOption) != 0 {
   454				b = appendColon(ctx, b)
   455			} else {
   456				mapCtx.Slice.Items[mapCtx.Idx].Key = b[mapCtx.Start:len(b)]
   457				mapCtx.Start = len(b)
   458			}
   459			value := mapitervalue(&mapCtx.Iter)
   460			store(ctxptr, code.Next.Idx, uintptr(value))
   461			mapiternext(&mapCtx.Iter)
   462			code = code.Next
   463		case encoder.OpMapEnd:
   464			// this operation only used by sorted map.
   465			mapCtx := (*encoder.MapContext)(ptrToUnsafePtr(load(ctxptr, code.Idx)))
   466			sort.Sort(mapCtx.Slice)
   467			buf := mapCtx.Buf
   468			for _, item := range mapCtx.Slice.Items {
   469				buf = appendMapKeyValue(ctx, code, buf, item.Key, item.Value)
   470			}
   471			buf = appendMapEnd(ctx, code, buf)
   472			b = b[:mapCtx.First]
   473			b = append(b, buf...)
   474			mapCtx.Buf = buf
   475			encoder.ReleaseMapContext(mapCtx)
   476			code = code.Next
   477		case encoder.OpRecursivePtr:
   478			p := load(ctxptr, code.Idx)
   479			if p == 0 {
   480				code = code.Next
   481				break
   482			}
   483			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
   484			fallthrough
   485		case encoder.OpRecursive:
   486			ptr := load(ctxptr, code.Idx)
   487			if ptr != 0 {
   488				if recursiveLevel > encoder.StartDetectingCyclesAfter {
   489					for _, seen := range ctx.SeenPtr {
   490						if ptr == seen {
   491							return nil, errUnsupportedValue(code, ptr)
   492						}
   493					}
   494				}
   495			}
   496			ctx.SeenPtr = append(ctx.SeenPtr, ptr)
   497			c := code.Jmp.Code
   498			curlen := uintptr(len(ctx.Ptrs))
   499			offsetNum := ptrOffset / uintptrSize
   500			oldOffset := ptrOffset
   501			ptrOffset += code.Jmp.CurLen * uintptrSize
   502			oldBaseIndent := ctx.BaseIndent
   503			indentDiffFromTop := c.Indent - 1
   504			ctx.BaseIndent += code.Indent - indentDiffFromTop
   505
   506			newLen := offsetNum + code.Jmp.CurLen + code.Jmp.NextLen
   507			if curlen < newLen {
   508				ctx.Ptrs = append(ctx.Ptrs, make([]uintptr, newLen-curlen)...)
   509			}
   510			ctxptr = ctx.Ptr() + ptrOffset // assign new ctxptr
   511
   512			store(ctxptr, c.Idx, ptr)
   513			store(ctxptr, c.End.Next.Idx, oldOffset)
   514			store(ctxptr, c.End.Next.ElemIdx, uintptr(unsafe.Pointer(code.Next)))
   515			storeIndent(ctxptr, c.End.Next, uintptr(oldBaseIndent))
   516			code = c
   517			recursiveLevel++
   518		case encoder.OpRecursiveEnd:
   519			recursiveLevel--
   520
   521			// restore ctxptr
   522			restoreIndent(ctx, code, ctxptr)
   523			offset := load(ctxptr, code.Idx)
   524			ctx.SeenPtr = ctx.SeenPtr[:len(ctx.SeenPtr)-1]
   525
   526			codePtr := load(ctxptr, code.ElemIdx)
   527			code = (*encoder.Opcode)(ptrToUnsafePtr(codePtr))
   528			ctxptr = ctx.Ptr() + offset
   529			ptrOffset = offset
   530		case encoder.OpStructPtrHead:
   531			p := load(ctxptr, code.Idx)
   532			if p == 0 {
   533				if code.Flags&encoder.AnonymousHeadFlags == 0 {
   534					b = appendNullComma(ctx, b)
   535				}
   536				code = code.End.Next
   537				break
   538			}
   539			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
   540			fallthrough
   541		case encoder.OpStructHead:
   542			p := load(ctxptr, code.Idx)
   543			if p == 0 && ((code.Flags&encoder.IndirectFlags) != 0 || code.Next.Op == encoder.OpStructEnd) {
   544				if code.Flags&encoder.AnonymousHeadFlags == 0 {
   545					b = appendNullComma(ctx, b)
   546				}
   547				code = code.End.Next
   548				break
   549			}
   550			if code.Flags&encoder.AnonymousHeadFlags == 0 {
   551				b = appendStructHead(ctx, b)
   552			}
   553			if len(code.Key) > 0 {
   554				if (code.Flags&encoder.IsTaggedKeyFlags) != 0 || code.Flags&encoder.AnonymousKeyFlags == 0 {
   555					b = appendStructKey(ctx, code, b)
   556				}
   557			}
   558			p += uintptr(code.Offset)
   559			code = code.Next
   560			store(ctxptr, code.Idx, p)
   561		case encoder.OpStructPtrHeadOmitEmpty:
   562			p := load(ctxptr, code.Idx)
   563			if p == 0 {
   564				if code.Flags&encoder.AnonymousHeadFlags == 0 {
   565					b = appendNullComma(ctx, b)
   566				}
   567				code = code.End.Next
   568				break
   569			}
   570			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
   571			fallthrough
   572		case encoder.OpStructHeadOmitEmpty:
   573			p := load(ctxptr, code.Idx)
   574			if p == 0 && ((code.Flags&encoder.IndirectFlags) != 0 || code.Next.Op == encoder.OpStructEnd) {
   575				if code.Flags&encoder.AnonymousHeadFlags == 0 {
   576					b = appendNullComma(ctx, b)
   577				}
   578				code = code.End.Next
   579				break
   580			}
   581			if code.Flags&encoder.AnonymousHeadFlags == 0 {
   582				b = appendStructHead(ctx, b)
   583			}
   584			p += uintptr(code.Offset)
   585			if p == 0 || (ptrToPtr(p) == 0 && (code.Flags&encoder.IsNextOpPtrTypeFlags) != 0) {
   586				code = code.NextField
   587			} else {
   588				b = appendStructKey(ctx, code, b)
   589				code = code.Next
   590				store(ctxptr, code.Idx, p)
   591			}
   592		case encoder.OpStructPtrHeadInt:
   593			if (code.Flags & encoder.IndirectFlags) != 0 {
   594				p := load(ctxptr, code.Idx)
   595				if p == 0 {
   596					if code.Flags&encoder.AnonymousHeadFlags == 0 {
   597						b = appendNullComma(ctx, b)
   598					}
   599					code = code.End.Next
   600					break
   601				}
   602				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
   603			}
   604			fallthrough
   605		case encoder.OpStructHeadInt:
   606			p := load(ctxptr, code.Idx)
   607			if p == 0 {
   608				if code.Flags&encoder.AnonymousHeadFlags == 0 {
   609					b = appendNullComma(ctx, b)
   610				}
   611				code = code.End.Next
   612				break
   613			}
   614			if code.Flags&encoder.AnonymousHeadFlags == 0 {
   615				b = appendStructHead(ctx, b)
   616			}
   617			b = appendStructKey(ctx, code, b)
   618			b = appendInt(ctx, b, p+uintptr(code.Offset), code)
   619			b = appendComma(ctx, b)
   620			code = code.Next
   621		case encoder.OpStructPtrHeadOmitEmptyInt:
   622			if (code.Flags & encoder.IndirectFlags) != 0 {
   623				p := load(ctxptr, code.Idx)
   624				if p == 0 {
   625					if code.Flags&encoder.AnonymousHeadFlags == 0 {
   626						b = appendNullComma(ctx, b)
   627					}
   628					code = code.End.Next
   629					break
   630				}
   631				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
   632			}
   633			fallthrough
   634		case encoder.OpStructHeadOmitEmptyInt:
   635			p := load(ctxptr, code.Idx)
   636			if p == 0 {
   637				if code.Flags&encoder.AnonymousHeadFlags == 0 {
   638					b = appendNullComma(ctx, b)
   639				}
   640				code = code.End.Next
   641				break
   642			}
   643			if code.Flags&encoder.AnonymousHeadFlags == 0 {
   644				b = appendStructHead(ctx, b)
   645			}
   646			u64 := ptrToUint64(p+uintptr(code.Offset), code.NumBitSize)
   647			v := u64 & ((1 << code.NumBitSize) - 1)
   648			if v == 0 {
   649				code = code.NextField
   650			} else {
   651				b = appendStructKey(ctx, code, b)
   652				b = appendInt(ctx, b, p+uintptr(code.Offset), code)
   653				b = appendComma(ctx, b)
   654				code = code.Next
   655			}
   656		case encoder.OpStructPtrHeadIntString:
   657			if (code.Flags & encoder.IndirectFlags) != 0 {
   658				p := load(ctxptr, code.Idx)
   659				if p == 0 {
   660					if code.Flags&encoder.AnonymousHeadFlags == 0 {
   661						b = appendNullComma(ctx, b)
   662					}
   663					code = code.End.Next
   664					break
   665				}
   666				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
   667			}
   668			fallthrough
   669		case encoder.OpStructHeadIntString:
   670			p := load(ctxptr, code.Idx)
   671			if p == 0 {
   672				if code.Flags&encoder.AnonymousHeadFlags == 0 {
   673					b = appendNullComma(ctx, b)
   674				}
   675				code = code.End.Next
   676				break
   677			}
   678			if code.Flags&encoder.AnonymousHeadFlags == 0 {
   679				b = appendStructHead(ctx, b)
   680			}
   681			b = appendStructKey(ctx, code, b)
   682			b = append(b, '"')
   683			b = appendInt(ctx, b, p+uintptr(code.Offset), code)
   684			b = append(b, '"')
   685			b = appendComma(ctx, b)
   686			code = code.Next
   687		case encoder.OpStructPtrHeadOmitEmptyIntString:
   688			if (code.Flags & encoder.IndirectFlags) != 0 {
   689				p := load(ctxptr, code.Idx)
   690				if p == 0 {
   691					if code.Flags&encoder.AnonymousHeadFlags == 0 {
   692						b = appendNullComma(ctx, b)
   693					}
   694					code = code.End.Next
   695					break
   696				}
   697				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
   698			}
   699			fallthrough
   700		case encoder.OpStructHeadOmitEmptyIntString:
   701			p := load(ctxptr, code.Idx)
   702			if p == 0 {
   703				if code.Flags&encoder.AnonymousHeadFlags == 0 {
   704					b = appendNullComma(ctx, b)
   705				}
   706				code = code.End.Next
   707				break
   708			}
   709			if code.Flags&encoder.AnonymousHeadFlags == 0 {
   710				b = appendStructHead(ctx, b)
   711			}
   712			p += uintptr(code.Offset)
   713			u64 := ptrToUint64(p, code.NumBitSize)
   714			v := u64 & ((1 << code.NumBitSize) - 1)
   715			if v == 0 {
   716				code = code.NextField
   717			} else {
   718				b = appendStructKey(ctx, code, b)
   719				b = append(b, '"')
   720				b = appendInt(ctx, b, p, code)
   721				b = append(b, '"')
   722				b = appendComma(ctx, b)
   723				code = code.Next
   724			}
   725		case encoder.OpStructPtrHeadIntPtr:
   726			p := load(ctxptr, code.Idx)
   727			if p == 0 {
   728				if code.Flags&encoder.AnonymousHeadFlags == 0 {
   729					b = appendNullComma(ctx, b)
   730				}
   731				code = code.End.Next
   732				break
   733			}
   734			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
   735			fallthrough
   736		case encoder.OpStructHeadIntPtr:
   737			p := load(ctxptr, code.Idx)
   738			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
   739				if code.Flags&encoder.AnonymousHeadFlags == 0 {
   740					b = appendNullComma(ctx, b)
   741				}
   742				code = code.End.Next
   743				break
   744			}
   745			if code.Flags&encoder.AnonymousHeadFlags == 0 {
   746				b = appendStructHead(ctx, b)
   747			}
   748			b = appendStructKey(ctx, code, b)
   749			if (code.Flags & encoder.IndirectFlags) != 0 {
   750				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
   751			}
   752			if p == 0 {
   753				b = appendNull(ctx, b)
   754			} else {
   755				b = appendInt(ctx, b, p, code)
   756			}
   757			b = appendComma(ctx, b)
   758			code = code.Next
   759		case encoder.OpStructPtrHeadOmitEmptyIntPtr:
   760			p := load(ctxptr, code.Idx)
   761			if p == 0 {
   762				if code.Flags&encoder.AnonymousHeadFlags == 0 {
   763					b = appendNullComma(ctx, b)
   764				}
   765				code = code.End.Next
   766				break
   767			}
   768			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
   769			fallthrough
   770		case encoder.OpStructHeadOmitEmptyIntPtr:
   771			p := load(ctxptr, code.Idx)
   772			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
   773				if code.Flags&encoder.AnonymousHeadFlags == 0 {
   774					b = appendNullComma(ctx, b)
   775				}
   776				code = code.End.Next
   777				break
   778			}
   779			if code.Flags&encoder.AnonymousHeadFlags == 0 {
   780				b = appendStructHead(ctx, b)
   781			}
   782			if (code.Flags & encoder.IndirectFlags) != 0 {
   783				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
   784			}
   785			if p != 0 {
   786				b = appendStructKey(ctx, code, b)
   787				b = appendInt(ctx, b, p, code)
   788				b = appendComma(ctx, b)
   789			}
   790			code = code.Next
   791		case encoder.OpStructPtrHeadIntPtrString:
   792			p := load(ctxptr, code.Idx)
   793			if p == 0 {
   794				if code.Flags&encoder.AnonymousHeadFlags == 0 {
   795					b = appendNullComma(ctx, b)
   796				}
   797				code = code.End.Next
   798				break
   799			}
   800			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
   801			fallthrough
   802		case encoder.OpStructHeadIntPtrString:
   803			p := load(ctxptr, code.Idx)
   804			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
   805				if code.Flags&encoder.AnonymousHeadFlags == 0 {
   806					b = appendNullComma(ctx, b)
   807				}
   808				code = code.End.Next
   809				break
   810			}
   811			if code.Flags&encoder.AnonymousHeadFlags == 0 {
   812				b = appendStructHead(ctx, b)
   813			}
   814			b = appendStructKey(ctx, code, b)
   815			if (code.Flags & encoder.IndirectFlags) != 0 {
   816				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
   817			}
   818			if p == 0 {
   819				b = appendNull(ctx, b)
   820			} else {
   821				b = append(b, '"')
   822				b = appendInt(ctx, b, p, code)
   823				b = append(b, '"')
   824			}
   825			b = appendComma(ctx, b)
   826			code = code.Next
   827		case encoder.OpStructPtrHeadOmitEmptyIntPtrString:
   828			p := load(ctxptr, code.Idx)
   829			if p == 0 {
   830				if code.Flags&encoder.AnonymousHeadFlags == 0 {
   831					b = appendNullComma(ctx, b)
   832				}
   833				code = code.End.Next
   834				break
   835			}
   836			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
   837			fallthrough
   838		case encoder.OpStructHeadOmitEmptyIntPtrString:
   839			p := load(ctxptr, code.Idx)
   840			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
   841				if code.Flags&encoder.AnonymousHeadFlags == 0 {
   842					b = appendNullComma(ctx, b)
   843				}
   844				code = code.End.Next
   845				break
   846			}
   847			if code.Flags&encoder.AnonymousHeadFlags == 0 {
   848				b = appendStructHead(ctx, b)
   849			}
   850			if (code.Flags & encoder.IndirectFlags) != 0 {
   851				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
   852			}
   853			if p != 0 {
   854				b = appendStructKey(ctx, code, b)
   855				b = append(b, '"')
   856				b = appendInt(ctx, b, p, code)
   857				b = append(b, '"')
   858				b = appendComma(ctx, b)
   859			}
   860			code = code.Next
   861		case encoder.OpStructPtrHeadUint:
   862			if (code.Flags & encoder.IndirectFlags) != 0 {
   863				p := load(ctxptr, code.Idx)
   864				if p == 0 {
   865					if code.Flags&encoder.AnonymousHeadFlags == 0 {
   866						b = appendNullComma(ctx, b)
   867					}
   868					code = code.End.Next
   869					break
   870				}
   871				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
   872			}
   873			fallthrough
   874		case encoder.OpStructHeadUint:
   875			p := load(ctxptr, code.Idx)
   876			if p == 0 {
   877				if code.Flags&encoder.AnonymousHeadFlags == 0 {
   878					b = appendNullComma(ctx, b)
   879				}
   880				code = code.End.Next
   881				break
   882			}
   883			if code.Flags&encoder.AnonymousHeadFlags == 0 {
   884				b = appendStructHead(ctx, b)
   885			}
   886			b = appendStructKey(ctx, code, b)
   887			b = appendUint(ctx, b, p+uintptr(code.Offset), code)
   888			b = appendComma(ctx, b)
   889			code = code.Next
   890		case encoder.OpStructPtrHeadOmitEmptyUint:
   891			if (code.Flags & encoder.IndirectFlags) != 0 {
   892				p := load(ctxptr, code.Idx)
   893				if p == 0 {
   894					if code.Flags&encoder.AnonymousHeadFlags == 0 {
   895						b = appendNullComma(ctx, b)
   896					}
   897					code = code.End.Next
   898					break
   899				}
   900				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
   901			}
   902			fallthrough
   903		case encoder.OpStructHeadOmitEmptyUint:
   904			p := load(ctxptr, code.Idx)
   905			if p == 0 {
   906				if code.Flags&encoder.AnonymousHeadFlags == 0 {
   907					b = appendNullComma(ctx, b)
   908				}
   909				code = code.End.Next
   910				break
   911			}
   912			if code.Flags&encoder.AnonymousHeadFlags == 0 {
   913				b = appendStructHead(ctx, b)
   914			}
   915			u64 := ptrToUint64(p+uintptr(code.Offset), code.NumBitSize)
   916			v := u64 & ((1 << code.NumBitSize) - 1)
   917			if v == 0 {
   918				code = code.NextField
   919			} else {
   920				b = appendStructKey(ctx, code, b)
   921				b = appendUint(ctx, b, p+uintptr(code.Offset), code)
   922				b = appendComma(ctx, b)
   923				code = code.Next
   924			}
   925		case encoder.OpStructPtrHeadUintString:
   926			if (code.Flags & encoder.IndirectFlags) != 0 {
   927				p := load(ctxptr, code.Idx)
   928				if p == 0 {
   929					if code.Flags&encoder.AnonymousHeadFlags == 0 {
   930						b = appendNullComma(ctx, b)
   931					}
   932					code = code.End.Next
   933					break
   934				}
   935				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
   936			}
   937			fallthrough
   938		case encoder.OpStructHeadUintString:
   939			p := load(ctxptr, code.Idx)
   940			if p == 0 {
   941				if code.Flags&encoder.AnonymousHeadFlags == 0 {
   942					b = appendNullComma(ctx, b)
   943				}
   944				code = code.End.Next
   945				break
   946			}
   947			if code.Flags&encoder.AnonymousHeadFlags == 0 {
   948				b = appendStructHead(ctx, b)
   949			}
   950			b = appendStructKey(ctx, code, b)
   951			b = append(b, '"')
   952			b = appendUint(ctx, b, p+uintptr(code.Offset), code)
   953			b = append(b, '"')
   954			b = appendComma(ctx, b)
   955			code = code.Next
   956		case encoder.OpStructPtrHeadOmitEmptyUintString:
   957			if (code.Flags & encoder.IndirectFlags) != 0 {
   958				p := load(ctxptr, code.Idx)
   959				if p == 0 {
   960					if code.Flags&encoder.AnonymousHeadFlags == 0 {
   961						b = appendNullComma(ctx, b)
   962					}
   963					code = code.End.Next
   964					break
   965				}
   966				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
   967			}
   968			fallthrough
   969		case encoder.OpStructHeadOmitEmptyUintString:
   970			p := load(ctxptr, code.Idx)
   971			if p == 0 {
   972				if code.Flags&encoder.AnonymousHeadFlags == 0 {
   973					b = appendNullComma(ctx, b)
   974				}
   975				code = code.End.Next
   976				break
   977			}
   978			if code.Flags&encoder.AnonymousHeadFlags == 0 {
   979				b = appendStructHead(ctx, b)
   980			}
   981			u64 := ptrToUint64(p+uintptr(code.Offset), code.NumBitSize)
   982			v := u64 & ((1 << code.NumBitSize) - 1)
   983			if v == 0 {
   984				code = code.NextField
   985			} else {
   986				b = appendStructKey(ctx, code, b)
   987				b = append(b, '"')
   988				b = appendUint(ctx, b, p+uintptr(code.Offset), code)
   989				b = append(b, '"')
   990				b = appendComma(ctx, b)
   991				code = code.Next
   992			}
   993		case encoder.OpStructPtrHeadUintPtr:
   994			p := load(ctxptr, code.Idx)
   995			if p == 0 {
   996				if code.Flags&encoder.AnonymousHeadFlags == 0 {
   997					b = appendNullComma(ctx, b)
   998				}
   999				code = code.End.Next
  1000				break
  1001			}
  1002			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1003			fallthrough
  1004		case encoder.OpStructHeadUintPtr:
  1005			p := load(ctxptr, code.Idx)
  1006			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  1007				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1008					b = appendNullComma(ctx, b)
  1009				}
  1010				code = code.End.Next
  1011				break
  1012			}
  1013			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1014				b = appendStructHead(ctx, b)
  1015			}
  1016			b = appendStructKey(ctx, code, b)
  1017			if (code.Flags & encoder.IndirectFlags) != 0 {
  1018				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  1019			}
  1020			if p == 0 {
  1021				b = appendNull(ctx, b)
  1022			} else {
  1023				b = appendUint(ctx, b, p, code)
  1024			}
  1025			b = appendComma(ctx, b)
  1026			code = code.Next
  1027		case encoder.OpStructPtrHeadOmitEmptyUintPtr:
  1028			p := load(ctxptr, code.Idx)
  1029			if p == 0 {
  1030				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1031					b = appendNullComma(ctx, b)
  1032				}
  1033				code = code.End.Next
  1034				break
  1035			}
  1036			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1037			fallthrough
  1038		case encoder.OpStructHeadOmitEmptyUintPtr:
  1039			p := load(ctxptr, code.Idx)
  1040			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  1041				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1042					b = appendNullComma(ctx, b)
  1043				}
  1044				code = code.End.Next
  1045				break
  1046			}
  1047			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1048				b = appendStructHead(ctx, b)
  1049			}
  1050			if (code.Flags & encoder.IndirectFlags) != 0 {
  1051				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  1052			}
  1053			if p != 0 {
  1054				b = appendStructKey(ctx, code, b)
  1055				b = appendUint(ctx, b, p, code)
  1056				b = appendComma(ctx, b)
  1057			}
  1058			code = code.Next
  1059		case encoder.OpStructPtrHeadUintPtrString:
  1060			p := load(ctxptr, code.Idx)
  1061			if p == 0 {
  1062				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1063					b = appendNullComma(ctx, b)
  1064				}
  1065				code = code.End.Next
  1066				break
  1067			}
  1068			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1069			fallthrough
  1070		case encoder.OpStructHeadUintPtrString:
  1071			p := load(ctxptr, code.Idx)
  1072			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  1073				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1074					b = appendNullComma(ctx, b)
  1075				}
  1076				code = code.End.Next
  1077				break
  1078			}
  1079			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1080				b = appendStructHead(ctx, b)
  1081			}
  1082			b = appendStructKey(ctx, code, b)
  1083			if (code.Flags & encoder.IndirectFlags) != 0 {
  1084				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  1085			}
  1086			if p == 0 {
  1087				b = appendNull(ctx, b)
  1088			} else {
  1089				b = append(b, '"')
  1090				b = appendUint(ctx, b, p, code)
  1091				b = append(b, '"')
  1092			}
  1093			b = appendComma(ctx, b)
  1094			code = code.Next
  1095		case encoder.OpStructPtrHeadOmitEmptyUintPtrString:
  1096			p := load(ctxptr, code.Idx)
  1097			if p == 0 {
  1098				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1099					b = appendNullComma(ctx, b)
  1100				}
  1101				code = code.End.Next
  1102				break
  1103			}
  1104			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1105			fallthrough
  1106		case encoder.OpStructHeadOmitEmptyUintPtrString:
  1107			p := load(ctxptr, code.Idx)
  1108			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  1109				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1110					b = appendNullComma(ctx, b)
  1111				}
  1112				code = code.End.Next
  1113				break
  1114			}
  1115			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1116				b = appendStructHead(ctx, b)
  1117			}
  1118			if (code.Flags & encoder.IndirectFlags) != 0 {
  1119				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  1120			}
  1121			if p != 0 {
  1122				b = appendStructKey(ctx, code, b)
  1123				b = append(b, '"')
  1124				b = appendUint(ctx, b, p, code)
  1125				b = append(b, '"')
  1126				b = appendComma(ctx, b)
  1127			}
  1128			code = code.Next
  1129		case encoder.OpStructPtrHeadFloat32:
  1130			if (code.Flags & encoder.IndirectFlags) != 0 {
  1131				p := load(ctxptr, code.Idx)
  1132				if p == 0 {
  1133					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1134						b = appendNullComma(ctx, b)
  1135					}
  1136					code = code.End.Next
  1137					break
  1138				}
  1139				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1140			}
  1141			fallthrough
  1142		case encoder.OpStructHeadFloat32:
  1143			p := load(ctxptr, code.Idx)
  1144			if p == 0 {
  1145				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1146					b = appendNullComma(ctx, b)
  1147				}
  1148				code = code.End.Next
  1149				break
  1150			}
  1151			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1152				b = appendStructHead(ctx, b)
  1153			}
  1154			b = appendStructKey(ctx, code, b)
  1155			b = appendFloat32(ctx, b, ptrToFloat32(p+uintptr(code.Offset)))
  1156			b = appendComma(ctx, b)
  1157			code = code.Next
  1158		case encoder.OpStructPtrHeadOmitEmptyFloat32:
  1159			if (code.Flags & encoder.IndirectFlags) != 0 {
  1160				p := load(ctxptr, code.Idx)
  1161				if p == 0 {
  1162					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1163						b = appendNullComma(ctx, b)
  1164					}
  1165					code = code.End.Next
  1166					break
  1167				}
  1168				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1169			}
  1170			fallthrough
  1171		case encoder.OpStructHeadOmitEmptyFloat32:
  1172			p := load(ctxptr, code.Idx)
  1173			if p == 0 {
  1174				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1175					b = appendNullComma(ctx, b)
  1176				}
  1177				code = code.End.Next
  1178				break
  1179			}
  1180			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1181				b = appendStructHead(ctx, b)
  1182			}
  1183			v := ptrToFloat32(p + uintptr(code.Offset))
  1184			if v == 0 {
  1185				code = code.NextField
  1186			} else {
  1187				b = appendStructKey(ctx, code, b)
  1188				b = appendFloat32(ctx, b, v)
  1189				b = appendComma(ctx, b)
  1190				code = code.Next
  1191			}
  1192		case encoder.OpStructPtrHeadFloat32String:
  1193			if (code.Flags & encoder.IndirectFlags) != 0 {
  1194				p := load(ctxptr, code.Idx)
  1195				if p == 0 {
  1196					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1197						b = appendNullComma(ctx, b)
  1198					}
  1199					code = code.End.Next
  1200					break
  1201				}
  1202				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1203			}
  1204			fallthrough
  1205		case encoder.OpStructHeadFloat32String:
  1206			p := load(ctxptr, code.Idx)
  1207			if p == 0 {
  1208				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1209					b = appendNullComma(ctx, b)
  1210				}
  1211				code = code.End.Next
  1212				break
  1213			}
  1214			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1215				b = appendStructHead(ctx, b)
  1216			}
  1217			b = appendStructKey(ctx, code, b)
  1218			b = append(b, '"')
  1219			b = appendFloat32(ctx, b, ptrToFloat32(p+uintptr(code.Offset)))
  1220			b = append(b, '"')
  1221			b = appendComma(ctx, b)
  1222			code = code.Next
  1223		case encoder.OpStructPtrHeadOmitEmptyFloat32String:
  1224			if (code.Flags & encoder.IndirectFlags) != 0 {
  1225				p := load(ctxptr, code.Idx)
  1226				if p == 0 {
  1227					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1228						b = appendNullComma(ctx, b)
  1229					}
  1230					code = code.End.Next
  1231					break
  1232				}
  1233				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1234			}
  1235			fallthrough
  1236		case encoder.OpStructHeadOmitEmptyFloat32String:
  1237			p := load(ctxptr, code.Idx)
  1238			if p == 0 {
  1239				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1240					b = appendNullComma(ctx, b)
  1241				}
  1242				code = code.End.Next
  1243				break
  1244			}
  1245			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1246				b = appendStructHead(ctx, b)
  1247			}
  1248			v := ptrToFloat32(p + uintptr(code.Offset))
  1249			if v == 0 {
  1250				code = code.NextField
  1251			} else {
  1252				b = appendStructKey(ctx, code, b)
  1253				b = append(b, '"')
  1254				b = appendFloat32(ctx, b, v)
  1255				b = append(b, '"')
  1256				b = appendComma(ctx, b)
  1257				code = code.Next
  1258			}
  1259		case encoder.OpStructPtrHeadFloat32Ptr:
  1260			p := load(ctxptr, code.Idx)
  1261			if p == 0 {
  1262				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1263					b = appendNullComma(ctx, b)
  1264				}
  1265				code = code.End.Next
  1266				break
  1267			}
  1268			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1269			fallthrough
  1270		case encoder.OpStructHeadFloat32Ptr:
  1271			p := load(ctxptr, code.Idx)
  1272			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  1273				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1274					b = appendNullComma(ctx, b)
  1275				}
  1276				code = code.End.Next
  1277				break
  1278			}
  1279			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1280				b = appendStructHead(ctx, b)
  1281			}
  1282			b = appendStructKey(ctx, code, b)
  1283			if (code.Flags & encoder.IndirectFlags) != 0 {
  1284				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  1285			}
  1286			if p == 0 {
  1287				b = appendNull(ctx, b)
  1288			} else {
  1289				b = appendFloat32(ctx, b, ptrToFloat32(p))
  1290			}
  1291			b = appendComma(ctx, b)
  1292			code = code.Next
  1293		case encoder.OpStructPtrHeadOmitEmptyFloat32Ptr:
  1294			p := load(ctxptr, code.Idx)
  1295			if p == 0 {
  1296				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1297					b = appendNullComma(ctx, b)
  1298				}
  1299				code = code.End.Next
  1300				break
  1301			}
  1302			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1303			fallthrough
  1304		case encoder.OpStructHeadOmitEmptyFloat32Ptr:
  1305			p := load(ctxptr, code.Idx)
  1306			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  1307				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1308					b = appendNullComma(ctx, b)
  1309				}
  1310				code = code.End.Next
  1311				break
  1312			}
  1313			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1314				b = appendStructHead(ctx, b)
  1315			}
  1316			if (code.Flags & encoder.IndirectFlags) != 0 {
  1317				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  1318			}
  1319			if p != 0 {
  1320				b = appendStructKey(ctx, code, b)
  1321				b = appendFloat32(ctx, b, ptrToFloat32(p))
  1322				b = appendComma(ctx, b)
  1323			}
  1324			code = code.Next
  1325		case encoder.OpStructPtrHeadFloat32PtrString:
  1326			p := load(ctxptr, code.Idx)
  1327			if p == 0 {
  1328				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1329					b = appendNullComma(ctx, b)
  1330				}
  1331				code = code.End.Next
  1332				break
  1333			}
  1334			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1335			fallthrough
  1336		case encoder.OpStructHeadFloat32PtrString:
  1337			p := load(ctxptr, code.Idx)
  1338			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  1339				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1340					b = appendNullComma(ctx, b)
  1341				}
  1342				code = code.End.Next
  1343				break
  1344			}
  1345			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1346				b = appendStructHead(ctx, b)
  1347			}
  1348			b = appendStructKey(ctx, code, b)
  1349			if (code.Flags & encoder.IndirectFlags) != 0 {
  1350				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  1351			}
  1352			if p == 0 {
  1353				b = appendNull(ctx, b)
  1354			} else {
  1355				b = append(b, '"')
  1356				b = appendFloat32(ctx, b, ptrToFloat32(p))
  1357				b = append(b, '"')
  1358			}
  1359			b = appendComma(ctx, b)
  1360			code = code.Next
  1361		case encoder.OpStructPtrHeadOmitEmptyFloat32PtrString:
  1362			p := load(ctxptr, code.Idx)
  1363			if p == 0 {
  1364				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1365					b = appendNullComma(ctx, b)
  1366				}
  1367				code = code.End.Next
  1368				break
  1369			}
  1370			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1371			fallthrough
  1372		case encoder.OpStructHeadOmitEmptyFloat32PtrString:
  1373			p := load(ctxptr, code.Idx)
  1374			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  1375				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1376					b = appendNullComma(ctx, b)
  1377				}
  1378				code = code.End.Next
  1379				break
  1380			}
  1381			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1382				b = appendStructHead(ctx, b)
  1383			}
  1384			if (code.Flags & encoder.IndirectFlags) != 0 {
  1385				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  1386			}
  1387			if p != 0 {
  1388				b = appendStructKey(ctx, code, b)
  1389				b = append(b, '"')
  1390				b = appendFloat32(ctx, b, ptrToFloat32(p))
  1391				b = append(b, '"')
  1392				b = appendComma(ctx, b)
  1393			}
  1394			code = code.Next
  1395		case encoder.OpStructPtrHeadFloat64:
  1396			if (code.Flags & encoder.IndirectFlags) != 0 {
  1397				p := load(ctxptr, code.Idx)
  1398				if p == 0 {
  1399					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1400						b = appendNullComma(ctx, b)
  1401					}
  1402					code = code.End.Next
  1403					break
  1404				}
  1405				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1406			}
  1407			fallthrough
  1408		case encoder.OpStructHeadFloat64:
  1409			p := load(ctxptr, code.Idx)
  1410			if p == 0 {
  1411				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1412					b = appendNullComma(ctx, b)
  1413				}
  1414				code = code.End.Next
  1415				break
  1416			}
  1417			v := ptrToFloat64(p + uintptr(code.Offset))
  1418			if math.IsInf(v, 0) || math.IsNaN(v) {
  1419				return nil, errUnsupportedFloat(v)
  1420			}
  1421			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1422				b = appendStructHead(ctx, b)
  1423			}
  1424			b = appendStructKey(ctx, code, b)
  1425			b = appendFloat64(ctx, b, v)
  1426			b = appendComma(ctx, b)
  1427			code = code.Next
  1428		case encoder.OpStructPtrHeadOmitEmptyFloat64:
  1429			if (code.Flags & encoder.IndirectFlags) != 0 {
  1430				p := load(ctxptr, code.Idx)
  1431				if p == 0 {
  1432					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1433						b = appendNullComma(ctx, b)
  1434					}
  1435					code = code.End.Next
  1436					break
  1437				}
  1438				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1439			}
  1440			fallthrough
  1441		case encoder.OpStructHeadOmitEmptyFloat64:
  1442			p := load(ctxptr, code.Idx)
  1443			if p == 0 {
  1444				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1445					b = appendNullComma(ctx, b)
  1446				}
  1447				code = code.End.Next
  1448				break
  1449			}
  1450			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1451				b = appendStructHead(ctx, b)
  1452			}
  1453			v := ptrToFloat64(p + uintptr(code.Offset))
  1454			if v == 0 {
  1455				code = code.NextField
  1456			} else {
  1457				if math.IsInf(v, 0) || math.IsNaN(v) {
  1458					return nil, errUnsupportedFloat(v)
  1459				}
  1460				b = appendStructKey(ctx, code, b)
  1461				b = appendFloat64(ctx, b, v)
  1462				b = appendComma(ctx, b)
  1463				code = code.Next
  1464			}
  1465		case encoder.OpStructPtrHeadFloat64String:
  1466			if (code.Flags & encoder.IndirectFlags) != 0 {
  1467				p := load(ctxptr, code.Idx)
  1468				if p == 0 {
  1469					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1470						b = appendNullComma(ctx, b)
  1471					}
  1472					code = code.End.Next
  1473					break
  1474				}
  1475				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1476			}
  1477			fallthrough
  1478		case encoder.OpStructHeadFloat64String:
  1479			p := load(ctxptr, code.Idx)
  1480			if p == 0 {
  1481				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1482					b = appendNullComma(ctx, b)
  1483				}
  1484				code = code.End.Next
  1485				break
  1486			}
  1487			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1488				b = appendStructHead(ctx, b)
  1489			}
  1490			v := ptrToFloat64(p + uintptr(code.Offset))
  1491			if math.IsInf(v, 0) || math.IsNaN(v) {
  1492				return nil, errUnsupportedFloat(v)
  1493			}
  1494			b = appendStructKey(ctx, code, b)
  1495			b = append(b, '"')
  1496			b = appendFloat64(ctx, b, v)
  1497			b = append(b, '"')
  1498			b = appendComma(ctx, b)
  1499			code = code.Next
  1500		case encoder.OpStructPtrHeadOmitEmptyFloat64String:
  1501			if (code.Flags & encoder.IndirectFlags) != 0 {
  1502				p := load(ctxptr, code.Idx)
  1503				if p == 0 {
  1504					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1505						b = appendNullComma(ctx, b)
  1506					}
  1507					code = code.End.Next
  1508					break
  1509				}
  1510				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1511			}
  1512			fallthrough
  1513		case encoder.OpStructHeadOmitEmptyFloat64String:
  1514			p := load(ctxptr, code.Idx)
  1515			if p == 0 {
  1516				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1517					b = appendNullComma(ctx, b)
  1518				}
  1519				code = code.End.Next
  1520				break
  1521			}
  1522			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1523				b = appendStructHead(ctx, b)
  1524			}
  1525			v := ptrToFloat64(p + uintptr(code.Offset))
  1526			if v == 0 {
  1527				code = code.NextField
  1528			} else {
  1529				if math.IsInf(v, 0) || math.IsNaN(v) {
  1530					return nil, errUnsupportedFloat(v)
  1531				}
  1532				b = appendStructKey(ctx, code, b)
  1533				b = append(b, '"')
  1534				b = appendFloat64(ctx, b, v)
  1535				b = append(b, '"')
  1536				b = appendComma(ctx, b)
  1537				code = code.Next
  1538			}
  1539		case encoder.OpStructPtrHeadFloat64Ptr:
  1540			p := load(ctxptr, code.Idx)
  1541			if p == 0 {
  1542				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1543					b = appendNullComma(ctx, b)
  1544				}
  1545				code = code.End.Next
  1546				break
  1547			}
  1548			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1549			fallthrough
  1550		case encoder.OpStructHeadFloat64Ptr:
  1551			p := load(ctxptr, code.Idx)
  1552			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  1553				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1554					b = appendNullComma(ctx, b)
  1555				}
  1556				code = code.End.Next
  1557				break
  1558			}
  1559			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1560				b = appendStructHead(ctx, b)
  1561			}
  1562			b = appendStructKey(ctx, code, b)
  1563			if (code.Flags & encoder.IndirectFlags) != 0 {
  1564				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  1565			}
  1566			if p == 0 {
  1567				b = appendNull(ctx, b)
  1568			} else {
  1569				v := ptrToFloat64(p)
  1570				if math.IsInf(v, 0) || math.IsNaN(v) {
  1571					return nil, errUnsupportedFloat(v)
  1572				}
  1573				b = appendFloat64(ctx, b, v)
  1574			}
  1575			b = appendComma(ctx, b)
  1576			code = code.Next
  1577		case encoder.OpStructPtrHeadOmitEmptyFloat64Ptr:
  1578			p := load(ctxptr, code.Idx)
  1579			if p == 0 {
  1580				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1581					b = appendNullComma(ctx, b)
  1582				}
  1583				code = code.End.Next
  1584				break
  1585			}
  1586			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1587			fallthrough
  1588		case encoder.OpStructHeadOmitEmptyFloat64Ptr:
  1589			p := load(ctxptr, code.Idx)
  1590			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  1591				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1592					b = appendNullComma(ctx, b)
  1593				}
  1594				code = code.End.Next
  1595				break
  1596			}
  1597			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1598				b = appendStructHead(ctx, b)
  1599			}
  1600			if (code.Flags & encoder.IndirectFlags) != 0 {
  1601				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  1602			}
  1603			if p != 0 {
  1604				b = appendStructKey(ctx, code, b)
  1605				v := ptrToFloat64(p)
  1606				if math.IsInf(v, 0) || math.IsNaN(v) {
  1607					return nil, errUnsupportedFloat(v)
  1608				}
  1609				b = appendFloat64(ctx, b, v)
  1610				b = appendComma(ctx, b)
  1611			}
  1612			code = code.Next
  1613		case encoder.OpStructPtrHeadFloat64PtrString:
  1614			p := load(ctxptr, code.Idx)
  1615			if p == 0 {
  1616				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1617					b = appendNullComma(ctx, b)
  1618				}
  1619				code = code.End.Next
  1620				break
  1621			}
  1622			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1623			fallthrough
  1624		case encoder.OpStructHeadFloat64PtrString:
  1625			p := load(ctxptr, code.Idx)
  1626			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  1627				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1628					b = appendNullComma(ctx, b)
  1629				}
  1630				code = code.End.Next
  1631				break
  1632			}
  1633			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1634				b = appendStructHead(ctx, b)
  1635			}
  1636			b = appendStructKey(ctx, code, b)
  1637			if (code.Flags & encoder.IndirectFlags) != 0 {
  1638				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  1639			}
  1640			if p == 0 {
  1641				b = appendNull(ctx, b)
  1642			} else {
  1643				b = append(b, '"')
  1644				v := ptrToFloat64(p)
  1645				if math.IsInf(v, 0) || math.IsNaN(v) {
  1646					return nil, errUnsupportedFloat(v)
  1647				}
  1648				b = appendFloat64(ctx, b, v)
  1649				b = append(b, '"')
  1650			}
  1651			b = appendComma(ctx, b)
  1652			code = code.Next
  1653		case encoder.OpStructPtrHeadOmitEmptyFloat64PtrString:
  1654			p := load(ctxptr, code.Idx)
  1655			if p == 0 {
  1656				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1657					b = appendNullComma(ctx, b)
  1658				}
  1659				code = code.End.Next
  1660				break
  1661			}
  1662			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1663			fallthrough
  1664		case encoder.OpStructHeadOmitEmptyFloat64PtrString:
  1665			p := load(ctxptr, code.Idx)
  1666			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  1667				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1668					b = appendNullComma(ctx, b)
  1669				}
  1670				code = code.End.Next
  1671				break
  1672			}
  1673			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1674				b = appendStructHead(ctx, b)
  1675			}
  1676			if (code.Flags & encoder.IndirectFlags) != 0 {
  1677				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  1678			}
  1679			if p != 0 {
  1680				b = appendStructKey(ctx, code, b)
  1681				b = append(b, '"')
  1682				v := ptrToFloat64(p)
  1683				if math.IsInf(v, 0) || math.IsNaN(v) {
  1684					return nil, errUnsupportedFloat(v)
  1685				}
  1686				b = appendFloat64(ctx, b, v)
  1687				b = append(b, '"')
  1688				b = appendComma(ctx, b)
  1689			}
  1690			code = code.Next
  1691		case encoder.OpStructPtrHeadString:
  1692			if (code.Flags & encoder.IndirectFlags) != 0 {
  1693				p := load(ctxptr, code.Idx)
  1694				if p == 0 {
  1695					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1696						b = appendNullComma(ctx, b)
  1697					}
  1698					code = code.End.Next
  1699					break
  1700				}
  1701				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1702			}
  1703			fallthrough
  1704		case encoder.OpStructHeadString:
  1705			p := load(ctxptr, code.Idx)
  1706			if p == 0 {
  1707				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1708					b = appendNull(ctx, b)
  1709					b = appendComma(ctx, b)
  1710				}
  1711				code = code.End.Next
  1712				break
  1713			}
  1714			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1715				b = appendStructHead(ctx, b)
  1716			}
  1717			b = appendStructKey(ctx, code, b)
  1718			b = appendString(ctx, b, ptrToString(p+uintptr(code.Offset)))
  1719			b = appendComma(ctx, b)
  1720			code = code.Next
  1721		case encoder.OpStructPtrHeadOmitEmptyString:
  1722			if (code.Flags & encoder.IndirectFlags) != 0 {
  1723				p := load(ctxptr, code.Idx)
  1724				if p == 0 {
  1725					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1726						b = appendNullComma(ctx, b)
  1727					}
  1728					code = code.End.Next
  1729					break
  1730				}
  1731				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1732			}
  1733			fallthrough
  1734		case encoder.OpStructHeadOmitEmptyString:
  1735			p := load(ctxptr, code.Idx)
  1736			if p == 0 {
  1737				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1738					b = appendNullComma(ctx, b)
  1739				}
  1740				code = code.End.Next
  1741				break
  1742			}
  1743			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1744				b = appendStructHead(ctx, b)
  1745			}
  1746			v := ptrToString(p + uintptr(code.Offset))
  1747			if v == "" {
  1748				code = code.NextField
  1749			} else {
  1750				b = appendStructKey(ctx, code, b)
  1751				b = appendString(ctx, b, v)
  1752				b = appendComma(ctx, b)
  1753				code = code.Next
  1754			}
  1755		case encoder.OpStructPtrHeadStringString:
  1756			if (code.Flags & encoder.IndirectFlags) != 0 {
  1757				p := load(ctxptr, code.Idx)
  1758				if p == 0 {
  1759					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1760						b = appendNullComma(ctx, b)
  1761					}
  1762					code = code.End.Next
  1763					break
  1764				}
  1765				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1766			}
  1767			fallthrough
  1768		case encoder.OpStructHeadStringString:
  1769			p := load(ctxptr, code.Idx)
  1770			if p == 0 {
  1771				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1772					b = appendNullComma(ctx, b)
  1773				}
  1774				code = code.End.Next
  1775				break
  1776			}
  1777			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1778				b = appendStructHead(ctx, b)
  1779			}
  1780			b = appendStructKey(ctx, code, b)
  1781			b = appendString(ctx, b, string(appendString(ctx, []byte{}, ptrToString(p+uintptr(code.Offset)))))
  1782			b = appendComma(ctx, b)
  1783			code = code.Next
  1784		case encoder.OpStructPtrHeadOmitEmptyStringString:
  1785			if (code.Flags & encoder.IndirectFlags) != 0 {
  1786				p := load(ctxptr, code.Idx)
  1787				if p == 0 {
  1788					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1789						b = appendNullComma(ctx, b)
  1790					}
  1791					code = code.End.Next
  1792					break
  1793				}
  1794				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1795			}
  1796			fallthrough
  1797		case encoder.OpStructHeadOmitEmptyStringString:
  1798			p := load(ctxptr, code.Idx)
  1799			if p == 0 {
  1800				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1801					b = appendNullComma(ctx, b)
  1802				}
  1803				code = code.End.Next
  1804				break
  1805			}
  1806			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1807				b = appendStructHead(ctx, b)
  1808			}
  1809			v := ptrToString(p + uintptr(code.Offset))
  1810			if v == "" {
  1811				code = code.NextField
  1812			} else {
  1813				b = appendStructKey(ctx, code, b)
  1814				b = appendString(ctx, b, string(appendString(ctx, []byte{}, v)))
  1815				b = appendComma(ctx, b)
  1816				code = code.Next
  1817			}
  1818		case encoder.OpStructPtrHeadStringPtr:
  1819			p := load(ctxptr, code.Idx)
  1820			if p == 0 {
  1821				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1822					b = appendNullComma(ctx, b)
  1823				}
  1824				code = code.End.Next
  1825				break
  1826			}
  1827			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1828			fallthrough
  1829		case encoder.OpStructHeadStringPtr:
  1830			p := load(ctxptr, code.Idx)
  1831			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  1832				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1833					b = appendNullComma(ctx, b)
  1834				}
  1835				code = code.End.Next
  1836				break
  1837			}
  1838			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1839				b = appendStructHead(ctx, b)
  1840			}
  1841			b = appendStructKey(ctx, code, b)
  1842			if (code.Flags & encoder.IndirectFlags) != 0 {
  1843				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  1844			}
  1845			if p == 0 {
  1846				b = appendNull(ctx, b)
  1847			} else {
  1848				b = appendString(ctx, b, ptrToString(p))
  1849			}
  1850			b = appendComma(ctx, b)
  1851			code = code.Next
  1852		case encoder.OpStructPtrHeadOmitEmptyStringPtr:
  1853			p := load(ctxptr, code.Idx)
  1854			if p == 0 {
  1855				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1856					b = appendNullComma(ctx, b)
  1857				}
  1858				code = code.End.Next
  1859				break
  1860			}
  1861			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1862			fallthrough
  1863		case encoder.OpStructHeadOmitEmptyStringPtr:
  1864			p := load(ctxptr, code.Idx)
  1865			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  1866				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1867					b = appendNullComma(ctx, b)
  1868				}
  1869				code = code.End.Next
  1870				break
  1871			}
  1872			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1873				b = appendStructHead(ctx, b)
  1874			}
  1875			if (code.Flags & encoder.IndirectFlags) != 0 {
  1876				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  1877			}
  1878			if p != 0 {
  1879				b = appendStructKey(ctx, code, b)
  1880				b = appendString(ctx, b, ptrToString(p))
  1881				b = appendComma(ctx, b)
  1882			}
  1883			code = code.Next
  1884		case encoder.OpStructPtrHeadStringPtrString:
  1885			p := load(ctxptr, code.Idx)
  1886			if p == 0 {
  1887				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1888					b = appendNullComma(ctx, b)
  1889				}
  1890				code = code.End.Next
  1891				break
  1892			}
  1893			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1894			fallthrough
  1895		case encoder.OpStructHeadStringPtrString:
  1896			p := load(ctxptr, code.Idx)
  1897			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  1898				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1899					b = appendNullComma(ctx, b)
  1900				}
  1901				code = code.End.Next
  1902				break
  1903			}
  1904			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1905				b = appendStructHead(ctx, b)
  1906			}
  1907			b = appendStructKey(ctx, code, b)
  1908			if (code.Flags & encoder.IndirectFlags) != 0 {
  1909				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  1910			}
  1911			if p == 0 {
  1912				b = appendNull(ctx, b)
  1913			} else {
  1914				b = appendString(ctx, b, string(appendString(ctx, []byte{}, ptrToString(p))))
  1915			}
  1916			b = appendComma(ctx, b)
  1917			code = code.Next
  1918		case encoder.OpStructPtrHeadOmitEmptyStringPtrString:
  1919			p := load(ctxptr, code.Idx)
  1920			if p == 0 {
  1921				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1922					b = appendNullComma(ctx, b)
  1923				}
  1924				code = code.End.Next
  1925				break
  1926			}
  1927			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1928			fallthrough
  1929		case encoder.OpStructHeadOmitEmptyStringPtrString:
  1930			p := load(ctxptr, code.Idx)
  1931			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  1932				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1933					b = appendNullComma(ctx, b)
  1934				}
  1935				code = code.End.Next
  1936				break
  1937			}
  1938			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1939				b = appendStructHead(ctx, b)
  1940			}
  1941			if (code.Flags & encoder.IndirectFlags) != 0 {
  1942				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  1943			}
  1944			if p != 0 {
  1945				b = appendStructKey(ctx, code, b)
  1946				b = appendString(ctx, b, string(appendString(ctx, []byte{}, ptrToString(p))))
  1947				b = appendComma(ctx, b)
  1948			}
  1949			code = code.Next
  1950		case encoder.OpStructPtrHeadBool:
  1951			if (code.Flags & encoder.IndirectFlags) != 0 {
  1952				p := load(ctxptr, code.Idx)
  1953				if p == 0 {
  1954					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1955						b = appendNullComma(ctx, b)
  1956					}
  1957					code = code.End.Next
  1958					break
  1959				}
  1960				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1961			}
  1962			fallthrough
  1963		case encoder.OpStructHeadBool:
  1964			p := load(ctxptr, code.Idx)
  1965			if p == 0 {
  1966				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1967					b = appendNullComma(ctx, b)
  1968				}
  1969				code = code.End.Next
  1970				break
  1971			}
  1972			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1973				b = appendStructHead(ctx, b)
  1974			}
  1975			b = appendStructKey(ctx, code, b)
  1976			b = appendBool(ctx, b, ptrToBool(p+uintptr(code.Offset)))
  1977			b = appendComma(ctx, b)
  1978			code = code.Next
  1979		case encoder.OpStructPtrHeadOmitEmptyBool:
  1980			if (code.Flags & encoder.IndirectFlags) != 0 {
  1981				p := load(ctxptr, code.Idx)
  1982				if p == 0 {
  1983					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1984						b = appendNullComma(ctx, b)
  1985					}
  1986					code = code.End.Next
  1987					break
  1988				}
  1989				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  1990			}
  1991			fallthrough
  1992		case encoder.OpStructHeadOmitEmptyBool:
  1993			p := load(ctxptr, code.Idx)
  1994			if p == 0 {
  1995				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  1996					b = appendNullComma(ctx, b)
  1997				}
  1998				code = code.End.Next
  1999				break
  2000			}
  2001			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2002				b = appendStructHead(ctx, b)
  2003			}
  2004			v := ptrToBool(p + uintptr(code.Offset))
  2005			if v {
  2006				b = appendStructKey(ctx, code, b)
  2007				b = appendBool(ctx, b, v)
  2008				b = appendComma(ctx, b)
  2009				code = code.Next
  2010			} else {
  2011				code = code.NextField
  2012			}
  2013		case encoder.OpStructPtrHeadBoolString:
  2014			if (code.Flags & encoder.IndirectFlags) != 0 {
  2015				p := load(ctxptr, code.Idx)
  2016				if p == 0 {
  2017					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2018						b = appendNullComma(ctx, b)
  2019					}
  2020					code = code.End.Next
  2021					break
  2022				}
  2023				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2024			}
  2025			fallthrough
  2026		case encoder.OpStructHeadBoolString:
  2027			p := load(ctxptr, code.Idx)
  2028			if p == 0 {
  2029				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2030					b = appendNullComma(ctx, b)
  2031				}
  2032				code = code.End.Next
  2033				break
  2034			}
  2035			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2036				b = appendStructHead(ctx, b)
  2037			}
  2038			b = appendStructKey(ctx, code, b)
  2039			b = append(b, '"')
  2040			b = appendBool(ctx, b, ptrToBool(p+uintptr(code.Offset)))
  2041			b = append(b, '"')
  2042			b = appendComma(ctx, b)
  2043			code = code.Next
  2044		case encoder.OpStructPtrHeadOmitEmptyBoolString:
  2045			if (code.Flags & encoder.IndirectFlags) != 0 {
  2046				p := load(ctxptr, code.Idx)
  2047				if p == 0 {
  2048					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2049						b = appendNullComma(ctx, b)
  2050					}
  2051					code = code.End.Next
  2052					break
  2053				}
  2054				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2055			}
  2056			fallthrough
  2057		case encoder.OpStructHeadOmitEmptyBoolString:
  2058			p := load(ctxptr, code.Idx)
  2059			if p == 0 {
  2060				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2061					b = appendNullComma(ctx, b)
  2062				}
  2063				code = code.End.Next
  2064				break
  2065			}
  2066			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2067				b = appendStructHead(ctx, b)
  2068			}
  2069			v := ptrToBool(p + uintptr(code.Offset))
  2070			if v {
  2071				b = appendStructKey(ctx, code, b)
  2072				b = append(b, '"')
  2073				b = appendBool(ctx, b, v)
  2074				b = append(b, '"')
  2075				b = appendComma(ctx, b)
  2076				code = code.Next
  2077			} else {
  2078				code = code.NextField
  2079			}
  2080		case encoder.OpStructPtrHeadBoolPtr:
  2081			p := load(ctxptr, code.Idx)
  2082			if p == 0 {
  2083				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2084					b = appendNullComma(ctx, b)
  2085				}
  2086				code = code.End.Next
  2087				break
  2088			}
  2089			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2090			fallthrough
  2091		case encoder.OpStructHeadBoolPtr:
  2092			p := load(ctxptr, code.Idx)
  2093			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  2094				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2095					b = appendNullComma(ctx, b)
  2096				}
  2097				code = code.End.Next
  2098				break
  2099			}
  2100			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2101				b = appendStructHead(ctx, b)
  2102			}
  2103			b = appendStructKey(ctx, code, b)
  2104			if (code.Flags & encoder.IndirectFlags) != 0 {
  2105				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  2106			}
  2107			if p == 0 {
  2108				b = appendNull(ctx, b)
  2109			} else {
  2110				b = appendBool(ctx, b, ptrToBool(p))
  2111			}
  2112			b = appendComma(ctx, b)
  2113			code = code.Next
  2114		case encoder.OpStructPtrHeadOmitEmptyBoolPtr:
  2115			p := load(ctxptr, code.Idx)
  2116			if p == 0 {
  2117				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2118					b = appendNullComma(ctx, b)
  2119				}
  2120				code = code.End.Next
  2121				break
  2122			}
  2123			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2124			fallthrough
  2125		case encoder.OpStructHeadOmitEmptyBoolPtr:
  2126			p := load(ctxptr, code.Idx)
  2127			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  2128				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2129					b = appendNullComma(ctx, b)
  2130				}
  2131				code = code.End.Next
  2132				break
  2133			}
  2134			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2135				b = appendStructHead(ctx, b)
  2136			}
  2137			if (code.Flags & encoder.IndirectFlags) != 0 {
  2138				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  2139			}
  2140			if p != 0 {
  2141				b = appendStructKey(ctx, code, b)
  2142				b = appendBool(ctx, b, ptrToBool(p))
  2143				b = appendComma(ctx, b)
  2144			}
  2145			code = code.Next
  2146		case encoder.OpStructPtrHeadBoolPtrString:
  2147			p := load(ctxptr, code.Idx)
  2148			if p == 0 {
  2149				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2150					b = appendNullComma(ctx, b)
  2151				}
  2152				code = code.End.Next
  2153				break
  2154			}
  2155			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2156			fallthrough
  2157		case encoder.OpStructHeadBoolPtrString:
  2158			p := load(ctxptr, code.Idx)
  2159			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  2160				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2161					b = appendNullComma(ctx, b)
  2162				}
  2163				code = code.End.Next
  2164				break
  2165			}
  2166			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2167				b = appendStructHead(ctx, b)
  2168			}
  2169			b = appendStructKey(ctx, code, b)
  2170			if (code.Flags & encoder.IndirectFlags) != 0 {
  2171				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  2172			}
  2173			if p == 0 {
  2174				b = appendNull(ctx, b)
  2175			} else {
  2176				b = append(b, '"')
  2177				b = appendBool(ctx, b, ptrToBool(p))
  2178				b = append(b, '"')
  2179			}
  2180			b = appendComma(ctx, b)
  2181			code = code.Next
  2182		case encoder.OpStructPtrHeadOmitEmptyBoolPtrString:
  2183			p := load(ctxptr, code.Idx)
  2184			if p == 0 {
  2185				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2186					b = appendNullComma(ctx, b)
  2187				}
  2188				code = code.End.Next
  2189				break
  2190			}
  2191			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2192			fallthrough
  2193		case encoder.OpStructHeadOmitEmptyBoolPtrString:
  2194			p := load(ctxptr, code.Idx)
  2195			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  2196				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2197					b = appendNullComma(ctx, b)
  2198				}
  2199				code = code.End.Next
  2200				break
  2201			}
  2202			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2203				b = appendStructHead(ctx, b)
  2204			}
  2205			if (code.Flags & encoder.IndirectFlags) != 0 {
  2206				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  2207			}
  2208			if p != 0 {
  2209				b = appendStructKey(ctx, code, b)
  2210				b = append(b, '"')
  2211				b = appendBool(ctx, b, ptrToBool(p))
  2212				b = append(b, '"')
  2213				b = appendComma(ctx, b)
  2214			}
  2215			code = code.Next
  2216		case encoder.OpStructPtrHeadBytes:
  2217			if (code.Flags & encoder.IndirectFlags) != 0 {
  2218				p := load(ctxptr, code.Idx)
  2219				if p == 0 {
  2220					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2221						b = appendNullComma(ctx, b)
  2222					}
  2223					code = code.End.Next
  2224					break
  2225				}
  2226				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2227			}
  2228			fallthrough
  2229		case encoder.OpStructHeadBytes:
  2230			p := load(ctxptr, code.Idx)
  2231			if p == 0 {
  2232				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2233					b = appendNullComma(ctx, b)
  2234				}
  2235				code = code.End.Next
  2236				break
  2237			}
  2238			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2239				b = appendStructHead(ctx, b)
  2240			}
  2241			b = appendStructKey(ctx, code, b)
  2242			b = appendByteSlice(ctx, b, ptrToBytes(p+uintptr(code.Offset)))
  2243			b = appendComma(ctx, b)
  2244			code = code.Next
  2245		case encoder.OpStructPtrHeadOmitEmptyBytes:
  2246			if (code.Flags & encoder.IndirectFlags) != 0 {
  2247				p := load(ctxptr, code.Idx)
  2248				if p == 0 {
  2249					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2250						b = appendNullComma(ctx, b)
  2251					}
  2252					code = code.End.Next
  2253					break
  2254				}
  2255				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2256			}
  2257			fallthrough
  2258		case encoder.OpStructHeadOmitEmptyBytes:
  2259			p := load(ctxptr, code.Idx)
  2260			if p == 0 {
  2261				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2262					b = appendNullComma(ctx, b)
  2263				}
  2264				code = code.End.Next
  2265				break
  2266			}
  2267			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2268				b = appendStructHead(ctx, b)
  2269			}
  2270			v := ptrToBytes(p + uintptr(code.Offset))
  2271			if len(v) == 0 {
  2272				code = code.NextField
  2273			} else {
  2274				b = appendStructKey(ctx, code, b)
  2275				b = appendByteSlice(ctx, b, v)
  2276				b = appendComma(ctx, b)
  2277				code = code.Next
  2278			}
  2279		case encoder.OpStructPtrHeadBytesPtr:
  2280			p := load(ctxptr, code.Idx)
  2281			if p == 0 {
  2282				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2283					b = appendNullComma(ctx, b)
  2284				}
  2285				code = code.End.Next
  2286				break
  2287			}
  2288			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2289			fallthrough
  2290		case encoder.OpStructHeadBytesPtr:
  2291			p := load(ctxptr, code.Idx)
  2292			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  2293				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2294					b = appendNullComma(ctx, b)
  2295				}
  2296				code = code.End.Next
  2297				break
  2298			}
  2299			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2300				b = appendStructHead(ctx, b)
  2301			}
  2302			b = appendStructKey(ctx, code, b)
  2303			if (code.Flags & encoder.IndirectFlags) != 0 {
  2304				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  2305			}
  2306			if p == 0 {
  2307				b = appendNull(ctx, b)
  2308			} else {
  2309				b = appendByteSlice(ctx, b, ptrToBytes(p))
  2310			}
  2311			b = appendComma(ctx, b)
  2312			code = code.Next
  2313		case encoder.OpStructPtrHeadOmitEmptyBytesPtr:
  2314			p := load(ctxptr, code.Idx)
  2315			if p == 0 {
  2316				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2317					b = appendNullComma(ctx, b)
  2318				}
  2319				code = code.End.Next
  2320				break
  2321			}
  2322			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2323			fallthrough
  2324		case encoder.OpStructHeadOmitEmptyBytesPtr:
  2325			p := load(ctxptr, code.Idx)
  2326			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  2327				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2328					b = appendNullComma(ctx, b)
  2329				}
  2330				code = code.End.Next
  2331				break
  2332			}
  2333			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2334				b = appendStructHead(ctx, b)
  2335			}
  2336			if (code.Flags & encoder.IndirectFlags) != 0 {
  2337				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  2338			}
  2339			if p != 0 {
  2340				b = appendStructKey(ctx, code, b)
  2341				b = appendByteSlice(ctx, b, ptrToBytes(p))
  2342				b = appendComma(ctx, b)
  2343			}
  2344			code = code.Next
  2345		case encoder.OpStructPtrHeadNumber:
  2346			if (code.Flags & encoder.IndirectFlags) != 0 {
  2347				p := load(ctxptr, code.Idx)
  2348				if p == 0 {
  2349					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2350						b = appendNullComma(ctx, b)
  2351					}
  2352					code = code.End.Next
  2353					break
  2354				}
  2355				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2356			}
  2357			fallthrough
  2358		case encoder.OpStructHeadNumber:
  2359			p := load(ctxptr, code.Idx)
  2360			if p == 0 {
  2361				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2362					b = appendNullComma(ctx, b)
  2363				}
  2364				code = code.End.Next
  2365				break
  2366			}
  2367			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2368				b = appendStructHead(ctx, b)
  2369			}
  2370			b = appendStructKey(ctx, code, b)
  2371			bb, err := appendNumber(ctx, b, ptrToNumber(p+uintptr(code.Offset)))
  2372			if err != nil {
  2373				return nil, err
  2374			}
  2375			b = appendComma(ctx, bb)
  2376			code = code.Next
  2377		case encoder.OpStructPtrHeadOmitEmptyNumber:
  2378			if (code.Flags & encoder.IndirectFlags) != 0 {
  2379				p := load(ctxptr, code.Idx)
  2380				if p == 0 {
  2381					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2382						b = appendNullComma(ctx, b)
  2383					}
  2384					code = code.End.Next
  2385					break
  2386				}
  2387				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2388			}
  2389			fallthrough
  2390		case encoder.OpStructHeadOmitEmptyNumber:
  2391			p := load(ctxptr, code.Idx)
  2392			if p == 0 {
  2393				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2394					b = appendNullComma(ctx, b)
  2395				}
  2396				code = code.End.Next
  2397				break
  2398			}
  2399			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2400				b = appendStructHead(ctx, b)
  2401			}
  2402			v := ptrToNumber(p + uintptr(code.Offset))
  2403			if v == "" {
  2404				code = code.NextField
  2405			} else {
  2406				b = appendStructKey(ctx, code, b)
  2407				bb, err := appendNumber(ctx, b, v)
  2408				if err != nil {
  2409					return nil, err
  2410				}
  2411				b = appendComma(ctx, bb)
  2412				code = code.Next
  2413			}
  2414		case encoder.OpStructPtrHeadNumberString:
  2415			if (code.Flags & encoder.IndirectFlags) != 0 {
  2416				p := load(ctxptr, code.Idx)
  2417				if p == 0 {
  2418					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2419						b = appendNullComma(ctx, b)
  2420					}
  2421					code = code.End.Next
  2422					break
  2423				}
  2424				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2425			}
  2426			fallthrough
  2427		case encoder.OpStructHeadNumberString:
  2428			p := load(ctxptr, code.Idx)
  2429			if p == 0 {
  2430				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2431					b = appendNullComma(ctx, b)
  2432				}
  2433				code = code.End.Next
  2434				break
  2435			}
  2436			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2437				b = appendStructHead(ctx, b)
  2438			}
  2439			b = appendStructKey(ctx, code, b)
  2440			b = append(b, '"')
  2441			bb, err := appendNumber(ctx, b, ptrToNumber(p+uintptr(code.Offset)))
  2442			if err != nil {
  2443				return nil, err
  2444			}
  2445			b = append(bb, '"')
  2446			b = appendComma(ctx, b)
  2447			code = code.Next
  2448		case encoder.OpStructPtrHeadOmitEmptyNumberString:
  2449			if (code.Flags & encoder.IndirectFlags) != 0 {
  2450				p := load(ctxptr, code.Idx)
  2451				if p == 0 {
  2452					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2453						b = appendNullComma(ctx, b)
  2454					}
  2455					code = code.End.Next
  2456					break
  2457				}
  2458				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2459			}
  2460			fallthrough
  2461		case encoder.OpStructHeadOmitEmptyNumberString:
  2462			p := load(ctxptr, code.Idx)
  2463			if p == 0 {
  2464				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2465					b = appendNullComma(ctx, b)
  2466				}
  2467				code = code.End.Next
  2468				break
  2469			}
  2470			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2471				b = appendStructHead(ctx, b)
  2472			}
  2473			v := ptrToNumber(p + uintptr(code.Offset))
  2474			if v == "" {
  2475				code = code.NextField
  2476			} else {
  2477				b = appendStructKey(ctx, code, b)
  2478				b = append(b, '"')
  2479				bb, err := appendNumber(ctx, b, v)
  2480				if err != nil {
  2481					return nil, err
  2482				}
  2483				b = append(bb, '"')
  2484				b = appendComma(ctx, b)
  2485				code = code.Next
  2486			}
  2487		case encoder.OpStructPtrHeadNumberPtr:
  2488			p := load(ctxptr, code.Idx)
  2489			if p == 0 {
  2490				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2491					b = appendNullComma(ctx, b)
  2492				}
  2493				code = code.End.Next
  2494				break
  2495			}
  2496			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2497			fallthrough
  2498		case encoder.OpStructHeadNumberPtr:
  2499			p := load(ctxptr, code.Idx)
  2500			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  2501				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2502					b = appendNullComma(ctx, b)
  2503				}
  2504				code = code.End.Next
  2505				break
  2506			}
  2507			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2508				b = appendStructHead(ctx, b)
  2509			}
  2510			b = appendStructKey(ctx, code, b)
  2511			if (code.Flags & encoder.IndirectFlags) != 0 {
  2512				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  2513			}
  2514			if p == 0 {
  2515				b = appendNull(ctx, b)
  2516			} else {
  2517				bb, err := appendNumber(ctx, b, ptrToNumber(p))
  2518				if err != nil {
  2519					return nil, err
  2520				}
  2521				b = bb
  2522			}
  2523			b = appendComma(ctx, b)
  2524			code = code.Next
  2525		case encoder.OpStructPtrHeadOmitEmptyNumberPtr:
  2526			p := load(ctxptr, code.Idx)
  2527			if p == 0 {
  2528				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2529					b = appendNullComma(ctx, b)
  2530				}
  2531				code = code.End.Next
  2532				break
  2533			}
  2534			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2535			fallthrough
  2536		case encoder.OpStructHeadOmitEmptyNumberPtr:
  2537			p := load(ctxptr, code.Idx)
  2538			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  2539				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2540					b = appendNullComma(ctx, b)
  2541				}
  2542				code = code.End.Next
  2543				break
  2544			}
  2545			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2546				b = appendStructHead(ctx, b)
  2547			}
  2548			if (code.Flags & encoder.IndirectFlags) != 0 {
  2549				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  2550			}
  2551			if p != 0 {
  2552				b = appendStructKey(ctx, code, b)
  2553				bb, err := appendNumber(ctx, b, ptrToNumber(p))
  2554				if err != nil {
  2555					return nil, err
  2556				}
  2557				b = appendComma(ctx, bb)
  2558			}
  2559			code = code.Next
  2560		case encoder.OpStructPtrHeadNumberPtrString:
  2561			p := load(ctxptr, code.Idx)
  2562			if p == 0 {
  2563				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2564					b = appendNullComma(ctx, b)
  2565				}
  2566				code = code.End.Next
  2567				break
  2568			}
  2569			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2570			fallthrough
  2571		case encoder.OpStructHeadNumberPtrString:
  2572			p := load(ctxptr, code.Idx)
  2573			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  2574				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2575					b = appendNullComma(ctx, b)
  2576				}
  2577				code = code.End.Next
  2578				break
  2579			}
  2580			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2581				b = appendStructHead(ctx, b)
  2582			}
  2583			b = appendStructKey(ctx, code, b)
  2584			if (code.Flags & encoder.IndirectFlags) != 0 {
  2585				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  2586			}
  2587			if p == 0 {
  2588				b = appendNull(ctx, b)
  2589			} else {
  2590				b = append(b, '"')
  2591				bb, err := appendNumber(ctx, b, ptrToNumber(p))
  2592				if err != nil {
  2593					return nil, err
  2594				}
  2595				b = append(bb, '"')
  2596			}
  2597			b = appendComma(ctx, b)
  2598			code = code.Next
  2599		case encoder.OpStructPtrHeadOmitEmptyNumberPtrString:
  2600			p := load(ctxptr, code.Idx)
  2601			if p == 0 {
  2602				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2603					b = appendNullComma(ctx, b)
  2604				}
  2605				code = code.End.Next
  2606				break
  2607			}
  2608			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2609			fallthrough
  2610		case encoder.OpStructHeadOmitEmptyNumberPtrString:
  2611			p := load(ctxptr, code.Idx)
  2612			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  2613				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2614					b = appendNullComma(ctx, b)
  2615				}
  2616				code = code.End.Next
  2617				break
  2618			}
  2619			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2620				b = appendStructHead(ctx, b)
  2621			}
  2622			if (code.Flags & encoder.IndirectFlags) != 0 {
  2623				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  2624			}
  2625			if p != 0 {
  2626				b = appendStructKey(ctx, code, b)
  2627				b = append(b, '"')
  2628				bb, err := appendNumber(ctx, b, ptrToNumber(p))
  2629				if err != nil {
  2630					return nil, err
  2631				}
  2632				b = append(bb, '"')
  2633				b = appendComma(ctx, b)
  2634			}
  2635			code = code.Next
  2636		case encoder.OpStructPtrHeadArray, encoder.OpStructPtrHeadSlice:
  2637			if (code.Flags & encoder.IndirectFlags) != 0 {
  2638				p := load(ctxptr, code.Idx)
  2639				if p == 0 {
  2640					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2641						b = appendNullComma(ctx, b)
  2642					}
  2643					code = code.End.Next
  2644					break
  2645				}
  2646				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2647			}
  2648			fallthrough
  2649		case encoder.OpStructHeadArray, encoder.OpStructHeadSlice:
  2650			p := load(ctxptr, code.Idx)
  2651			if p == 0 {
  2652				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2653					b = appendNullComma(ctx, b)
  2654				}
  2655				code = code.End.Next
  2656				break
  2657			}
  2658			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2659				b = appendStructHead(ctx, b)
  2660			}
  2661			b = appendStructKey(ctx, code, b)
  2662			p += uintptr(code.Offset)
  2663			code = code.Next
  2664			store(ctxptr, code.Idx, p)
  2665		case encoder.OpStructPtrHeadOmitEmptyArray:
  2666			if (code.Flags & encoder.IndirectFlags) != 0 {
  2667				p := load(ctxptr, code.Idx)
  2668				if p == 0 {
  2669					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2670						b = appendNullComma(ctx, b)
  2671					}
  2672					code = code.End.Next
  2673					break
  2674				}
  2675				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2676			}
  2677			fallthrough
  2678		case encoder.OpStructHeadOmitEmptyArray:
  2679			p := load(ctxptr, code.Idx)
  2680			if p == 0 {
  2681				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2682					b = appendNullComma(ctx, b)
  2683				}
  2684				code = code.End.Next
  2685				break
  2686			}
  2687			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2688				b = appendStructHead(ctx, b)
  2689			}
  2690			p += uintptr(code.Offset)
  2691			b = appendStructKey(ctx, code, b)
  2692			code = code.Next
  2693			store(ctxptr, code.Idx, p)
  2694		case encoder.OpStructPtrHeadOmitEmptySlice:
  2695			if (code.Flags & encoder.IndirectFlags) != 0 {
  2696				p := load(ctxptr, code.Idx)
  2697				if p == 0 {
  2698					if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2699						b = appendNullComma(ctx, b)
  2700					}
  2701					code = code.End.Next
  2702					break
  2703				}
  2704				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2705			}
  2706			fallthrough
  2707		case encoder.OpStructHeadOmitEmptySlice:
  2708			p := load(ctxptr, code.Idx)
  2709			if p == 0 {
  2710				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2711					b = appendNullComma(ctx, b)
  2712				}
  2713				code = code.End.Next
  2714				break
  2715			}
  2716			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2717				b = appendStructHead(ctx, b)
  2718			}
  2719			p += uintptr(code.Offset)
  2720			slice := ptrToSlice(p)
  2721			if slice.Len == 0 {
  2722				code = code.NextField
  2723			} else {
  2724				b = appendStructKey(ctx, code, b)
  2725				code = code.Next
  2726				store(ctxptr, code.Idx, p)
  2727			}
  2728		case encoder.OpStructPtrHeadArrayPtr, encoder.OpStructPtrHeadSlicePtr:
  2729			p := load(ctxptr, code.Idx)
  2730			if p == 0 {
  2731				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2732					b = appendNullComma(ctx, b)
  2733				}
  2734				code = code.End.Next
  2735				break
  2736			}
  2737			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2738			fallthrough
  2739		case encoder.OpStructHeadArrayPtr, encoder.OpStructHeadSlicePtr:
  2740			p := load(ctxptr, code.Idx)
  2741			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  2742				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2743					b = appendNullComma(ctx, b)
  2744				}
  2745				code = code.End.Next
  2746				break
  2747			}
  2748			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2749				b = appendStructHead(ctx, b)
  2750			}
  2751			b = appendStructKey(ctx, code, b)
  2752			if (code.Flags & encoder.IndirectFlags) != 0 {
  2753				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  2754			}
  2755			if p == 0 {
  2756				b = appendNullComma(ctx, b)
  2757				code = code.NextField
  2758			} else {
  2759				code = code.Next
  2760				store(ctxptr, code.Idx, p)
  2761			}
  2762		case encoder.OpStructPtrHeadOmitEmptyArrayPtr, encoder.OpStructPtrHeadOmitEmptySlicePtr:
  2763			p := load(ctxptr, code.Idx)
  2764			if p == 0 {
  2765				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2766					b = appendNullComma(ctx, b)
  2767				}
  2768				code = code.End.Next
  2769				break
  2770			}
  2771			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2772			fallthrough
  2773		case encoder.OpStructHeadOmitEmptyArrayPtr, encoder.OpStructHeadOmitEmptySlicePtr:
  2774			p := load(ctxptr, code.Idx)
  2775			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  2776				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2777					b = appendNullComma(ctx, b)
  2778				}
  2779				code = code.End.Next
  2780				break
  2781			}
  2782			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2783				b = appendStructHead(ctx, b)
  2784			}
  2785			if (code.Flags & encoder.IndirectFlags) != 0 {
  2786				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  2787			}
  2788			if p == 0 {
  2789				code = code.NextField
  2790			} else {
  2791				b = appendStructKey(ctx, code, b)
  2792				code = code.Next
  2793				store(ctxptr, code.Idx, p)
  2794			}
  2795		case encoder.OpStructPtrHeadMap:
  2796			p := load(ctxptr, code.Idx)
  2797			if p == 0 {
  2798				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2799					b = appendNullComma(ctx, b)
  2800				}
  2801				code = code.End.Next
  2802				break
  2803			}
  2804			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2805			fallthrough
  2806		case encoder.OpStructHeadMap:
  2807			p := load(ctxptr, code.Idx)
  2808			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  2809				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2810					b = appendNullComma(ctx, b)
  2811				}
  2812				code = code.End.Next
  2813				break
  2814			}
  2815			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2816				b = appendStructHead(ctx, b)
  2817			}
  2818			b = appendStructKey(ctx, code, b)
  2819			if p != 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  2820				p = ptrToPtr(p + uintptr(code.Offset))
  2821			}
  2822			code = code.Next
  2823			store(ctxptr, code.Idx, p)
  2824		case encoder.OpStructPtrHeadOmitEmptyMap:
  2825			p := load(ctxptr, code.Idx)
  2826			if p == 0 {
  2827				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2828					b = appendNullComma(ctx, b)
  2829				}
  2830				code = code.End.Next
  2831				break
  2832			}
  2833			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2834			fallthrough
  2835		case encoder.OpStructHeadOmitEmptyMap:
  2836			p := load(ctxptr, code.Idx)
  2837			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  2838				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2839					b = appendNullComma(ctx, b)
  2840				}
  2841				code = code.End.Next
  2842				break
  2843			}
  2844			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2845				b = appendStructHead(ctx, b)
  2846			}
  2847			if p != 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  2848				p = ptrToPtr(p + uintptr(code.Offset))
  2849			}
  2850			if maplen(ptrToUnsafePtr(p)) == 0 {
  2851				code = code.NextField
  2852			} else {
  2853				b = appendStructKey(ctx, code, b)
  2854				code = code.Next
  2855				store(ctxptr, code.Idx, p)
  2856			}
  2857		case encoder.OpStructPtrHeadMapPtr:
  2858			p := load(ctxptr, code.Idx)
  2859			if p == 0 {
  2860				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2861					b = appendNullComma(ctx, b)
  2862				}
  2863				code = code.End.Next
  2864				break
  2865			}
  2866			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2867			fallthrough
  2868		case encoder.OpStructHeadMapPtr:
  2869			p := load(ctxptr, code.Idx)
  2870			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  2871				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2872					b = appendNullComma(ctx, b)
  2873				}
  2874				code = code.End.Next
  2875				break
  2876			}
  2877			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2878				b = appendStructHead(ctx, b)
  2879			}
  2880			b = appendStructKey(ctx, code, b)
  2881			if p == 0 {
  2882				b = appendNullComma(ctx, b)
  2883				code = code.NextField
  2884				break
  2885			}
  2886			p = ptrToPtr(p + uintptr(code.Offset))
  2887			if p == 0 {
  2888				b = appendNullComma(ctx, b)
  2889				code = code.NextField
  2890			} else {
  2891				if (code.Flags & encoder.IndirectFlags) != 0 {
  2892					p = ptrToNPtr(p, code.PtrNum)
  2893				}
  2894				code = code.Next
  2895				store(ctxptr, code.Idx, p)
  2896			}
  2897		case encoder.OpStructPtrHeadOmitEmptyMapPtr:
  2898			p := load(ctxptr, code.Idx)
  2899			if p == 0 {
  2900				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2901					b = appendNullComma(ctx, b)
  2902				}
  2903				code = code.End.Next
  2904				break
  2905			}
  2906			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2907			fallthrough
  2908		case encoder.OpStructHeadOmitEmptyMapPtr:
  2909			p := load(ctxptr, code.Idx)
  2910			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  2911				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2912					b = appendNullComma(ctx, b)
  2913				}
  2914				code = code.End.Next
  2915				break
  2916			}
  2917			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2918				b = appendStructHead(ctx, b)
  2919			}
  2920			if p == 0 {
  2921				code = code.NextField
  2922				break
  2923			}
  2924			p = ptrToPtr(p + uintptr(code.Offset))
  2925			if p == 0 {
  2926				code = code.NextField
  2927			} else {
  2928				if (code.Flags & encoder.IndirectFlags) != 0 {
  2929					p = ptrToNPtr(p, code.PtrNum)
  2930				}
  2931				b = appendStructKey(ctx, code, b)
  2932				code = code.Next
  2933				store(ctxptr, code.Idx, p)
  2934			}
  2935		case encoder.OpStructPtrHeadMarshalJSON:
  2936			p := load(ctxptr, code.Idx)
  2937			if p == 0 {
  2938				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2939					b = appendNullComma(ctx, b)
  2940				}
  2941				code = code.End.Next
  2942				break
  2943			}
  2944			if (code.Flags & encoder.IndirectFlags) != 0 {
  2945				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2946			}
  2947			fallthrough
  2948		case encoder.OpStructHeadMarshalJSON:
  2949			p := load(ctxptr, code.Idx)
  2950			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  2951				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2952					b = appendNullComma(ctx, b)
  2953				}
  2954				code = code.End.Next
  2955				break
  2956			}
  2957			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2958				b = appendStructHead(ctx, b)
  2959			}
  2960			b = appendStructKey(ctx, code, b)
  2961			p += uintptr(code.Offset)
  2962			if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
  2963				if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalJSON {
  2964					p = ptrToPtr(p)
  2965				}
  2966			}
  2967			if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
  2968				b = appendNull(ctx, b)
  2969			} else {
  2970				bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
  2971				if err != nil {
  2972					return nil, err
  2973				}
  2974				b = bb
  2975			}
  2976			b = appendComma(ctx, b)
  2977			code = code.Next
  2978		case encoder.OpStructPtrHeadOmitEmptyMarshalJSON:
  2979			p := load(ctxptr, code.Idx)
  2980			if p == 0 {
  2981				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2982					b = appendNullComma(ctx, b)
  2983				}
  2984				code = code.End.Next
  2985				break
  2986			}
  2987			if (code.Flags & encoder.IndirectFlags) != 0 {
  2988				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  2989			}
  2990			fallthrough
  2991		case encoder.OpStructHeadOmitEmptyMarshalJSON:
  2992			p := load(ctxptr, code.Idx)
  2993			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  2994				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  2995					b = appendNullComma(ctx, b)
  2996				}
  2997				code = code.End.Next
  2998				break
  2999			}
  3000			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  3001				b = appendStructHead(ctx, b)
  3002			}
  3003			p += uintptr(code.Offset)
  3004			if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
  3005				if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalJSON {
  3006					p = ptrToPtr(p)
  3007				}
  3008			}
  3009			iface := ptrToInterface(code, p)
  3010			if (code.Flags&encoder.NilCheckFlags) != 0 && encoder.IsNilForMarshaler(iface) {
  3011				code = code.NextField
  3012			} else {
  3013				b = appendStructKey(ctx, code, b)
  3014				bb, err := appendMarshalJSON(ctx, code, b, iface)
  3015				if err != nil {
  3016					return nil, err
  3017				}
  3018				b = bb
  3019				b = appendComma(ctx, b)
  3020				code = code.Next
  3021			}
  3022		case encoder.OpStructPtrHeadMarshalJSONPtr:
  3023			p := load(ctxptr, code.Idx)
  3024			if p == 0 {
  3025				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  3026					b = appendNullComma(ctx, b)
  3027				}
  3028				code = code.End.Next
  3029				break
  3030			}
  3031			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  3032			fallthrough
  3033		case encoder.OpStructHeadMarshalJSONPtr:
  3034			p := load(ctxptr, code.Idx)
  3035			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  3036				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  3037					b = appendNullComma(ctx, b)
  3038				}
  3039				code = code.End.Next
  3040				break
  3041			}
  3042			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  3043				b = appendStructHead(ctx, b)
  3044			}
  3045			b = appendStructKey(ctx, code, b)
  3046			if (code.Flags & encoder.IndirectFlags) != 0 {
  3047				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3048			}
  3049			if p == 0 {
  3050				b = appendNull(ctx, b)
  3051			} else {
  3052				bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
  3053				if err != nil {
  3054					return nil, err
  3055				}
  3056				b = bb
  3057			}
  3058			b = appendComma(ctx, b)
  3059			code = code.Next
  3060		case encoder.OpStructPtrHeadOmitEmptyMarshalJSONPtr:
  3061			p := load(ctxptr, code.Idx)
  3062			if p == 0 {
  3063				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  3064					b = appendNullComma(ctx, b)
  3065				}
  3066				code = code.End.Next
  3067				break
  3068			}
  3069			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  3070			fallthrough
  3071		case encoder.OpStructHeadOmitEmptyMarshalJSONPtr:
  3072			p := load(ctxptr, code.Idx)
  3073			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  3074				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  3075					b = appendNullComma(ctx, b)
  3076				}
  3077				code = code.End.Next
  3078				break
  3079			}
  3080			if (code.Flags & encoder.IndirectFlags) != 0 {
  3081				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3082			}
  3083			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  3084				b = appendStructHead(ctx, b)
  3085			}
  3086			if p == 0 {
  3087				code = code.NextField
  3088			} else {
  3089				b = appendStructKey(ctx, code, b)
  3090				bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
  3091				if err != nil {
  3092					return nil, err
  3093				}
  3094				b = bb
  3095				b = appendComma(ctx, b)
  3096				code = code.Next
  3097			}
  3098		case encoder.OpStructPtrHeadMarshalText:
  3099			p := load(ctxptr, code.Idx)
  3100			if p == 0 {
  3101				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  3102					b = appendNullComma(ctx, b)
  3103				}
  3104				code = code.End.Next
  3105				break
  3106			}
  3107			if (code.Flags & encoder.IndirectFlags) != 0 {
  3108				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  3109			}
  3110			fallthrough
  3111		case encoder.OpStructHeadMarshalText:
  3112			p := load(ctxptr, code.Idx)
  3113			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  3114				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  3115					b = appendNullComma(ctx, b)
  3116				}
  3117				code = code.End.Next
  3118				break
  3119			}
  3120			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  3121				b = appendStructHead(ctx, b)
  3122			}
  3123			b = appendStructKey(ctx, code, b)
  3124			p += uintptr(code.Offset)
  3125			if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
  3126				if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalText {
  3127					p = ptrToPtr(p)
  3128				}
  3129			}
  3130			if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
  3131				b = appendNull(ctx, b)
  3132			} else {
  3133				bb, err := appendMarshalText(ctx, code, b, ptrToInterface(code, p))
  3134				if err != nil {
  3135					return nil, err
  3136				}
  3137				b = bb
  3138			}
  3139			b = appendComma(ctx, b)
  3140			code = code.Next
  3141		case encoder.OpStructPtrHeadOmitEmptyMarshalText:
  3142			p := load(ctxptr, code.Idx)
  3143			if p == 0 {
  3144				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  3145					b = appendNullComma(ctx, b)
  3146				}
  3147				code = code.End.Next
  3148				break
  3149			}
  3150			if (code.Flags & encoder.IndirectFlags) != 0 {
  3151				store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  3152			}
  3153			fallthrough
  3154		case encoder.OpStructHeadOmitEmptyMarshalText:
  3155			p := load(ctxptr, code.Idx)
  3156			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  3157				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  3158					b = appendNullComma(ctx, b)
  3159				}
  3160				code = code.End.Next
  3161				break
  3162			}
  3163			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  3164				b = appendStructHead(ctx, b)
  3165			}
  3166			p += uintptr(code.Offset)
  3167			if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
  3168				if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalText {
  3169					p = ptrToPtr(p)
  3170				}
  3171			}
  3172			if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
  3173				code = code.NextField
  3174			} else {
  3175				b = appendStructKey(ctx, code, b)
  3176				bb, err := appendMarshalText(ctx, code, b, ptrToInterface(code, p))
  3177				if err != nil {
  3178					return nil, err
  3179				}
  3180				b = bb
  3181				b = appendComma(ctx, b)
  3182				code = code.Next
  3183			}
  3184		case encoder.OpStructPtrHeadMarshalTextPtr:
  3185			p := load(ctxptr, code.Idx)
  3186			if p == 0 {
  3187				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  3188					b = appendNullComma(ctx, b)
  3189				}
  3190				code = code.End.Next
  3191				break
  3192			}
  3193			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  3194			fallthrough
  3195		case encoder.OpStructHeadMarshalTextPtr:
  3196			p := load(ctxptr, code.Idx)
  3197			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  3198				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  3199					b = appendNullComma(ctx, b)
  3200				}
  3201				code = code.End.Next
  3202				break
  3203			}
  3204			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  3205				b = appendStructHead(ctx, b)
  3206			}
  3207			b = appendStructKey(ctx, code, b)
  3208			if (code.Flags & encoder.IndirectFlags) != 0 {
  3209				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3210			}
  3211			if p == 0 {
  3212				b = appendNull(ctx, b)
  3213			} else {
  3214				bb, err := appendMarshalText(ctx, code, b, ptrToInterface(code, p))
  3215				if err != nil {
  3216					return nil, err
  3217				}
  3218				b = bb
  3219			}
  3220			b = appendComma(ctx, b)
  3221			code = code.Next
  3222		case encoder.OpStructPtrHeadOmitEmptyMarshalTextPtr:
  3223			p := load(ctxptr, code.Idx)
  3224			if p == 0 {
  3225				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  3226					b = appendNullComma(ctx, b)
  3227				}
  3228				code = code.End.Next
  3229				break
  3230			}
  3231			store(ctxptr, code.Idx, ptrToNPtr(p, code.PtrNum))
  3232			fallthrough
  3233		case encoder.OpStructHeadOmitEmptyMarshalTextPtr:
  3234			p := load(ctxptr, code.Idx)
  3235			if p == 0 && (code.Flags&encoder.IndirectFlags) != 0 {
  3236				if code.Flags&encoder.AnonymousHeadFlags == 0 {
  3237					b = appendNullComma(ctx, b)
  3238				}
  3239				code = code.End.Next
  3240				break
  3241			}
  3242			if (code.Flags & encoder.IndirectFlags) != 0 {
  3243				p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3244			}
  3245			if code.Flags&encoder.AnonymousHeadFlags == 0 {
  3246				b = appendStructHead(ctx, b)
  3247			}
  3248			if p == 0 {
  3249				code = code.NextField
  3250			} else {
  3251				b = appendStructKey(ctx, code, b)
  3252				bb, err := appendMarshalText(ctx, code, b, ptrToInterface(code, p))
  3253				if err != nil {
  3254					return nil, err
  3255				}
  3256				b = bb
  3257				b = appendComma(ctx, b)
  3258				code = code.Next
  3259			}
  3260		case encoder.OpStructField:
  3261			if code.Flags&encoder.IsTaggedKeyFlags != 0 || code.Flags&encoder.AnonymousKeyFlags == 0 {
  3262				b = appendStructKey(ctx, code, b)
  3263			}
  3264			p := load(ctxptr, code.Idx) + uintptr(code.Offset)
  3265			code = code.Next
  3266			store(ctxptr, code.Idx, p)
  3267		case encoder.OpStructFieldOmitEmpty:
  3268			p := load(ctxptr, code.Idx)
  3269			p += uintptr(code.Offset)
  3270			if ptrToPtr(p) == 0 && (code.Flags&encoder.IsNextOpPtrTypeFlags) != 0 {
  3271				code = code.NextField
  3272			} else {
  3273				b = appendStructKey(ctx, code, b)
  3274				code = code.Next
  3275				store(ctxptr, code.Idx, p)
  3276			}
  3277		case encoder.OpStructFieldInt:
  3278			p := load(ctxptr, code.Idx)
  3279			b = appendStructKey(ctx, code, b)
  3280			b = appendInt(ctx, b, p+uintptr(code.Offset), code)
  3281			b = appendComma(ctx, b)
  3282			code = code.Next
  3283		case encoder.OpStructFieldOmitEmptyInt:
  3284			p := load(ctxptr, code.Idx)
  3285			u64 := ptrToUint64(p+uintptr(code.Offset), code.NumBitSize)
  3286			v := u64 & ((1 << code.NumBitSize) - 1)
  3287			if v != 0 {
  3288				b = appendStructKey(ctx, code, b)
  3289				b = appendInt(ctx, b, p+uintptr(code.Offset), code)
  3290				b = appendComma(ctx, b)
  3291			}
  3292			code = code.Next
  3293		case encoder.OpStructFieldIntString:
  3294			p := load(ctxptr, code.Idx)
  3295			b = appendStructKey(ctx, code, b)
  3296			b = append(b, '"')
  3297			b = appendInt(ctx, b, p+uintptr(code.Offset), code)
  3298			b = append(b, '"')
  3299			b = appendComma(ctx, b)
  3300			code = code.Next
  3301		case encoder.OpStructFieldOmitEmptyIntString:
  3302			p := load(ctxptr, code.Idx)
  3303			u64 := ptrToUint64(p+uintptr(code.Offset), code.NumBitSize)
  3304			v := u64 & ((1 << code.NumBitSize) - 1)
  3305			if v != 0 {
  3306				b = appendStructKey(ctx, code, b)
  3307				b = append(b, '"')
  3308				b = appendInt(ctx, b, p+uintptr(code.Offset), code)
  3309				b = append(b, '"')
  3310				b = appendComma(ctx, b)
  3311			}
  3312			code = code.Next
  3313		case encoder.OpStructFieldIntPtr:
  3314			p := load(ctxptr, code.Idx)
  3315			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3316			b = appendStructKey(ctx, code, b)
  3317			if p == 0 {
  3318				b = appendNull(ctx, b)
  3319			} else {
  3320				b = appendInt(ctx, b, p, code)
  3321			}
  3322			b = appendComma(ctx, b)
  3323			code = code.Next
  3324		case encoder.OpStructFieldOmitEmptyIntPtr:
  3325			p := load(ctxptr, code.Idx)
  3326			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3327			if p != 0 {
  3328				b = appendStructKey(ctx, code, b)
  3329				b = appendInt(ctx, b, p, code)
  3330				b = appendComma(ctx, b)
  3331			}
  3332			code = code.Next
  3333		case encoder.OpStructFieldIntPtrString:
  3334			p := load(ctxptr, code.Idx)
  3335			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3336			b = appendStructKey(ctx, code, b)
  3337			if p == 0 {
  3338				b = appendNull(ctx, b)
  3339			} else {
  3340				b = append(b, '"')
  3341				b = appendInt(ctx, b, p, code)
  3342				b = append(b, '"')
  3343			}
  3344			b = appendComma(ctx, b)
  3345			code = code.Next
  3346		case encoder.OpStructFieldOmitEmptyIntPtrString:
  3347			p := load(ctxptr, code.Idx)
  3348			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3349			if p != 0 {
  3350				b = appendStructKey(ctx, code, b)
  3351				b = append(b, '"')
  3352				b = appendInt(ctx, b, p, code)
  3353				b = append(b, '"')
  3354				b = appendComma(ctx, b)
  3355			}
  3356			code = code.Next
  3357		case encoder.OpStructFieldUint:
  3358			p := load(ctxptr, code.Idx)
  3359			b = appendStructKey(ctx, code, b)
  3360			b = appendUint(ctx, b, p+uintptr(code.Offset), code)
  3361			b = appendComma(ctx, b)
  3362			code = code.Next
  3363		case encoder.OpStructFieldOmitEmptyUint:
  3364			p := load(ctxptr, code.Idx)
  3365			u64 := ptrToUint64(p+uintptr(code.Offset), code.NumBitSize)
  3366			v := u64 & ((1 << code.NumBitSize) - 1)
  3367			if v != 0 {
  3368				b = appendStructKey(ctx, code, b)
  3369				b = appendUint(ctx, b, p+uintptr(code.Offset), code)
  3370				b = appendComma(ctx, b)
  3371			}
  3372			code = code.Next
  3373		case encoder.OpStructFieldUintString:
  3374			p := load(ctxptr, code.Idx)
  3375			b = appendStructKey(ctx, code, b)
  3376			b = append(b, '"')
  3377			b = appendUint(ctx, b, p+uintptr(code.Offset), code)
  3378			b = append(b, '"')
  3379			b = appendComma(ctx, b)
  3380			code = code.Next
  3381		case encoder.OpStructFieldOmitEmptyUintString:
  3382			p := load(ctxptr, code.Idx)
  3383			u64 := ptrToUint64(p+uintptr(code.Offset), code.NumBitSize)
  3384			v := u64 & ((1 << code.NumBitSize) - 1)
  3385			if v != 0 {
  3386				b = appendStructKey(ctx, code, b)
  3387				b = append(b, '"')
  3388				b = appendUint(ctx, b, p+uintptr(code.Offset), code)
  3389				b = append(b, '"')
  3390				b = appendComma(ctx, b)
  3391			}
  3392			code = code.Next
  3393		case encoder.OpStructFieldUintPtr:
  3394			p := load(ctxptr, code.Idx)
  3395			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3396			b = appendStructKey(ctx, code, b)
  3397			if p == 0 {
  3398				b = appendNull(ctx, b)
  3399			} else {
  3400				b = appendUint(ctx, b, p, code)
  3401			}
  3402			b = appendComma(ctx, b)
  3403			code = code.Next
  3404		case encoder.OpStructFieldOmitEmptyUintPtr:
  3405			p := load(ctxptr, code.Idx)
  3406			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3407			if p != 0 {
  3408				b = appendStructKey(ctx, code, b)
  3409				b = appendUint(ctx, b, p, code)
  3410				b = appendComma(ctx, b)
  3411			}
  3412			code = code.Next
  3413		case encoder.OpStructFieldUintPtrString:
  3414			p := load(ctxptr, code.Idx)
  3415			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3416			b = appendStructKey(ctx, code, b)
  3417			if p == 0 {
  3418				b = appendNull(ctx, b)
  3419			} else {
  3420				b = append(b, '"')
  3421				b = appendUint(ctx, b, p, code)
  3422				b = append(b, '"')
  3423			}
  3424			b = appendComma(ctx, b)
  3425			code = code.Next
  3426		case encoder.OpStructFieldOmitEmptyUintPtrString:
  3427			p := load(ctxptr, code.Idx)
  3428			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3429			if p != 0 {
  3430				b = appendStructKey(ctx, code, b)
  3431				b = append(b, '"')
  3432				b = appendUint(ctx, b, p, code)
  3433				b = append(b, '"')
  3434				b = appendComma(ctx, b)
  3435			}
  3436			code = code.Next
  3437		case encoder.OpStructFieldFloat32:
  3438			p := load(ctxptr, code.Idx)
  3439			b = appendStructKey(ctx, code, b)
  3440			b = appendFloat32(ctx, b, ptrToFloat32(p+uintptr(code.Offset)))
  3441			b = appendComma(ctx, b)
  3442			code = code.Next
  3443		case encoder.OpStructFieldOmitEmptyFloat32:
  3444			p := load(ctxptr, code.Idx)
  3445			v := ptrToFloat32(p + uintptr(code.Offset))
  3446			if v != 0 {
  3447				b = appendStructKey(ctx, code, b)
  3448				b = appendFloat32(ctx, b, v)
  3449				b = appendComma(ctx, b)
  3450			}
  3451			code = code.Next
  3452		case encoder.OpStructFieldFloat32String:
  3453			p := load(ctxptr, code.Idx)
  3454			b = appendStructKey(ctx, code, b)
  3455			b = append(b, '"')
  3456			b = appendFloat32(ctx, b, ptrToFloat32(p+uintptr(code.Offset)))
  3457			b = append(b, '"')
  3458			b = appendComma(ctx, b)
  3459			code = code.Next
  3460		case encoder.OpStructFieldOmitEmptyFloat32String:
  3461			p := load(ctxptr, code.Idx)
  3462			v := ptrToFloat32(p + uintptr(code.Offset))
  3463			if v != 0 {
  3464				b = appendStructKey(ctx, code, b)
  3465				b = append(b, '"')
  3466				b = appendFloat32(ctx, b, v)
  3467				b = append(b, '"')
  3468				b = appendComma(ctx, b)
  3469			}
  3470			code = code.Next
  3471		case encoder.OpStructFieldFloat32Ptr:
  3472			p := load(ctxptr, code.Idx)
  3473			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3474			b = appendStructKey(ctx, code, b)
  3475			if p == 0 {
  3476				b = appendNull(ctx, b)
  3477			} else {
  3478				b = appendFloat32(ctx, b, ptrToFloat32(p))
  3479			}
  3480			b = appendComma(ctx, b)
  3481			code = code.Next
  3482		case encoder.OpStructFieldOmitEmptyFloat32Ptr:
  3483			p := load(ctxptr, code.Idx)
  3484			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3485			if p != 0 {
  3486				b = appendStructKey(ctx, code, b)
  3487				b = appendFloat32(ctx, b, ptrToFloat32(p))
  3488				b = appendComma(ctx, b)
  3489			}
  3490			code = code.Next
  3491		case encoder.OpStructFieldFloat32PtrString:
  3492			p := load(ctxptr, code.Idx)
  3493			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3494			b = appendStructKey(ctx, code, b)
  3495			if p == 0 {
  3496				b = appendNull(ctx, b)
  3497			} else {
  3498				b = append(b, '"')
  3499				b = appendFloat32(ctx, b, ptrToFloat32(p))
  3500				b = append(b, '"')
  3501			}
  3502			b = appendComma(ctx, b)
  3503			code = code.Next
  3504		case encoder.OpStructFieldOmitEmptyFloat32PtrString:
  3505			p := load(ctxptr, code.Idx)
  3506			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3507			if p != 0 {
  3508				b = appendStructKey(ctx, code, b)
  3509				b = append(b, '"')
  3510				b = appendFloat32(ctx, b, ptrToFloat32(p))
  3511				b = append(b, '"')
  3512				b = appendComma(ctx, b)
  3513			}
  3514			code = code.Next
  3515		case encoder.OpStructFieldFloat64:
  3516			p := load(ctxptr, code.Idx)
  3517			b = appendStructKey(ctx, code, b)
  3518			v := ptrToFloat64(p + uintptr(code.Offset))
  3519			if math.IsInf(v, 0) || math.IsNaN(v) {
  3520				return nil, errUnsupportedFloat(v)
  3521			}
  3522			b = appendFloat64(ctx, b, v)
  3523			b = appendComma(ctx, b)
  3524			code = code.Next
  3525		case encoder.OpStructFieldOmitEmptyFloat64:
  3526			p := load(ctxptr, code.Idx)
  3527			v := ptrToFloat64(p + uintptr(code.Offset))
  3528			if v != 0 {
  3529				if math.IsInf(v, 0) || math.IsNaN(v) {
  3530					return nil, errUnsupportedFloat(v)
  3531				}
  3532				b = appendStructKey(ctx, code, b)
  3533				b = appendFloat64(ctx, b, v)
  3534				b = appendComma(ctx, b)
  3535			}
  3536			code = code.Next
  3537		case encoder.OpStructFieldFloat64String:
  3538			p := load(ctxptr, code.Idx)
  3539			v := ptrToFloat64(p + uintptr(code.Offset))
  3540			if math.IsInf(v, 0) || math.IsNaN(v) {
  3541				return nil, errUnsupportedFloat(v)
  3542			}
  3543			b = appendStructKey(ctx, code, b)
  3544			b = append(b, '"')
  3545			b = appendFloat64(ctx, b, v)
  3546			b = append(b, '"')
  3547			b = appendComma(ctx, b)
  3548			code = code.Next
  3549		case encoder.OpStructFieldOmitEmptyFloat64String:
  3550			p := load(ctxptr, code.Idx)
  3551			v := ptrToFloat64(p + uintptr(code.Offset))
  3552			if v != 0 {
  3553				if math.IsInf(v, 0) || math.IsNaN(v) {
  3554					return nil, errUnsupportedFloat(v)
  3555				}
  3556				b = appendStructKey(ctx, code, b)
  3557				b = append(b, '"')
  3558				b = appendFloat64(ctx, b, v)
  3559				b = append(b, '"')
  3560				b = appendComma(ctx, b)
  3561			}
  3562			code = code.Next
  3563		case encoder.OpStructFieldFloat64Ptr:
  3564			p := load(ctxptr, code.Idx)
  3565			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3566			b = appendStructKey(ctx, code, b)
  3567			if p == 0 {
  3568				b = appendNullComma(ctx, b)
  3569				code = code.Next
  3570				break
  3571			}
  3572			v := ptrToFloat64(p)
  3573			if math.IsInf(v, 0) || math.IsNaN(v) {
  3574				return nil, errUnsupportedFloat(v)
  3575			}
  3576			b = appendFloat64(ctx, b, v)
  3577			b = appendComma(ctx, b)
  3578			code = code.Next
  3579		case encoder.OpStructFieldOmitEmptyFloat64Ptr:
  3580			p := load(ctxptr, code.Idx)
  3581			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3582			if p != 0 {
  3583				b = appendStructKey(ctx, code, b)
  3584				v := ptrToFloat64(p)
  3585				if math.IsInf(v, 0) || math.IsNaN(v) {
  3586					return nil, errUnsupportedFloat(v)
  3587				}
  3588				b = appendFloat64(ctx, b, v)
  3589				b = appendComma(ctx, b)
  3590			}
  3591			code = code.Next
  3592		case encoder.OpStructFieldFloat64PtrString:
  3593			p := load(ctxptr, code.Idx)
  3594			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3595			b = appendStructKey(ctx, code, b)
  3596			if p == 0 {
  3597				b = appendNull(ctx, b)
  3598			} else {
  3599				v := ptrToFloat64(p)
  3600				if math.IsInf(v, 0) || math.IsNaN(v) {
  3601					return nil, errUnsupportedFloat(v)
  3602				}
  3603				b = append(b, '"')
  3604				b = appendFloat64(ctx, b, v)
  3605				b = append(b, '"')
  3606			}
  3607			b = appendComma(ctx, b)
  3608			code = code.Next
  3609		case encoder.OpStructFieldOmitEmptyFloat64PtrString:
  3610			p := load(ctxptr, code.Idx)
  3611			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3612			if p != 0 {
  3613				b = appendStructKey(ctx, code, b)
  3614				b = append(b, '"')
  3615				v := ptrToFloat64(p)
  3616				if math.IsInf(v, 0) || math.IsNaN(v) {
  3617					return nil, errUnsupportedFloat(v)
  3618				}
  3619				b = appendFloat64(ctx, b, v)
  3620				b = append(b, '"')
  3621				b = appendComma(ctx, b)
  3622			}
  3623			code = code.Next
  3624		case encoder.OpStructFieldString:
  3625			p := load(ctxptr, code.Idx)
  3626			b = appendStructKey(ctx, code, b)
  3627			b = appendString(ctx, b, ptrToString(p+uintptr(code.Offset)))
  3628			b = appendComma(ctx, b)
  3629			code = code.Next
  3630		case encoder.OpStructFieldOmitEmptyString:
  3631			p := load(ctxptr, code.Idx)
  3632			v := ptrToString(p + uintptr(code.Offset))
  3633			if v != "" {
  3634				b = appendStructKey(ctx, code, b)
  3635				b = appendString(ctx, b, v)
  3636				b = appendComma(ctx, b)
  3637			}
  3638			code = code.Next
  3639		case encoder.OpStructFieldStringString:
  3640			p := load(ctxptr, code.Idx)
  3641			s := ptrToString(p + uintptr(code.Offset))
  3642			b = appendStructKey(ctx, code, b)
  3643			b = appendString(ctx, b, string(appendString(ctx, []byte{}, s)))
  3644			b = appendComma(ctx, b)
  3645			code = code.Next
  3646		case encoder.OpStructFieldOmitEmptyStringString:
  3647			p := load(ctxptr, code.Idx)
  3648			v := ptrToString(p + uintptr(code.Offset))
  3649			if v != "" {
  3650				b = appendStructKey(ctx, code, b)
  3651				b = appendString(ctx, b, string(appendString(ctx, []byte{}, v)))
  3652				b = appendComma(ctx, b)
  3653			}
  3654			code = code.Next
  3655		case encoder.OpStructFieldStringPtr:
  3656			p := load(ctxptr, code.Idx)
  3657			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3658			b = appendStructKey(ctx, code, b)
  3659			if p == 0 {
  3660				b = appendNull(ctx, b)
  3661			} else {
  3662				b = appendString(ctx, b, ptrToString(p))
  3663			}
  3664			b = appendComma(ctx, b)
  3665			code = code.Next
  3666		case encoder.OpStructFieldOmitEmptyStringPtr:
  3667			p := load(ctxptr, code.Idx)
  3668			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3669			if p != 0 {
  3670				b = appendStructKey(ctx, code, b)
  3671				b = appendString(ctx, b, ptrToString(p))
  3672				b = appendComma(ctx, b)
  3673			}
  3674			code = code.Next
  3675		case encoder.OpStructFieldStringPtrString:
  3676			p := load(ctxptr, code.Idx)
  3677			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3678			b = appendStructKey(ctx, code, b)
  3679			if p == 0 {
  3680				b = appendNull(ctx, b)
  3681			} else {
  3682				b = appendString(ctx, b, string(appendString(ctx, []byte{}, ptrToString(p))))
  3683			}
  3684			b = appendComma(ctx, b)
  3685			code = code.Next
  3686		case encoder.OpStructFieldOmitEmptyStringPtrString:
  3687			p := load(ctxptr, code.Idx)
  3688			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3689			if p != 0 {
  3690				b = appendStructKey(ctx, code, b)
  3691				b = appendString(ctx, b, string(appendString(ctx, []byte{}, ptrToString(p))))
  3692				b = appendComma(ctx, b)
  3693			}
  3694			code = code.Next
  3695		case encoder.OpStructFieldBool:
  3696			p := load(ctxptr, code.Idx)
  3697			b = appendStructKey(ctx, code, b)
  3698			b = appendBool(ctx, b, ptrToBool(p+uintptr(code.Offset)))
  3699			b = appendComma(ctx, b)
  3700			code = code.Next
  3701		case encoder.OpStructFieldOmitEmptyBool:
  3702			p := load(ctxptr, code.Idx)
  3703			v := ptrToBool(p + uintptr(code.Offset))
  3704			if v {
  3705				b = appendStructKey(ctx, code, b)
  3706				b = appendBool(ctx, b, v)
  3707				b = appendComma(ctx, b)
  3708			}
  3709			code = code.Next
  3710		case encoder.OpStructFieldBoolString:
  3711			p := load(ctxptr, code.Idx)
  3712			b = appendStructKey(ctx, code, b)
  3713			b = append(b, '"')
  3714			b = appendBool(ctx, b, ptrToBool(p+uintptr(code.Offset)))
  3715			b = append(b, '"')
  3716			b = appendComma(ctx, b)
  3717			code = code.Next
  3718		case encoder.OpStructFieldOmitEmptyBoolString:
  3719			p := load(ctxptr, code.Idx)
  3720			v := ptrToBool(p + uintptr(code.Offset))
  3721			if v {
  3722				b = appendStructKey(ctx, code, b)
  3723				b = append(b, '"')
  3724				b = appendBool(ctx, b, v)
  3725				b = append(b, '"')
  3726				b = appendComma(ctx, b)
  3727			}
  3728			code = code.Next
  3729		case encoder.OpStructFieldBoolPtr:
  3730			p := load(ctxptr, code.Idx)
  3731			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3732			b = appendStructKey(ctx, code, b)
  3733			if p == 0 {
  3734				b = appendNull(ctx, b)
  3735			} else {
  3736				b = appendBool(ctx, b, ptrToBool(p))
  3737			}
  3738			b = appendComma(ctx, b)
  3739			code = code.Next
  3740		case encoder.OpStructFieldOmitEmptyBoolPtr:
  3741			p := load(ctxptr, code.Idx)
  3742			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3743			if p != 0 {
  3744				b = appendStructKey(ctx, code, b)
  3745				b = appendBool(ctx, b, ptrToBool(p))
  3746				b = appendComma(ctx, b)
  3747			}
  3748			code = code.Next
  3749		case encoder.OpStructFieldBoolPtrString:
  3750			p := load(ctxptr, code.Idx)
  3751			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3752			b = appendStructKey(ctx, code, b)
  3753			if p == 0 {
  3754				b = appendNull(ctx, b)
  3755			} else {
  3756				b = append(b, '"')
  3757				b = appendBool(ctx, b, ptrToBool(p))
  3758				b = append(b, '"')
  3759			}
  3760			b = appendComma(ctx, b)
  3761			code = code.Next
  3762		case encoder.OpStructFieldOmitEmptyBoolPtrString:
  3763			p := load(ctxptr, code.Idx)
  3764			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3765			if p != 0 {
  3766				b = appendStructKey(ctx, code, b)
  3767				b = append(b, '"')
  3768				b = appendBool(ctx, b, ptrToBool(p))
  3769				b = append(b, '"')
  3770				b = appendComma(ctx, b)
  3771			}
  3772			code = code.Next
  3773		case encoder.OpStructFieldBytes:
  3774			p := load(ctxptr, code.Idx)
  3775			b = appendStructKey(ctx, code, b)
  3776			b = appendByteSlice(ctx, b, ptrToBytes(p+uintptr(code.Offset)))
  3777			b = appendComma(ctx, b)
  3778			code = code.Next
  3779		case encoder.OpStructFieldOmitEmptyBytes:
  3780			p := load(ctxptr, code.Idx)
  3781			v := ptrToBytes(p + uintptr(code.Offset))
  3782			if len(v) > 0 {
  3783				b = appendStructKey(ctx, code, b)
  3784				b = appendByteSlice(ctx, b, v)
  3785				b = appendComma(ctx, b)
  3786			}
  3787			code = code.Next
  3788		case encoder.OpStructFieldBytesPtr:
  3789			p := load(ctxptr, code.Idx)
  3790			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3791			b = appendStructKey(ctx, code, b)
  3792			if p == 0 {
  3793				b = appendNull(ctx, b)
  3794			} else {
  3795				b = appendByteSlice(ctx, b, ptrToBytes(p))
  3796			}
  3797			b = appendComma(ctx, b)
  3798			code = code.Next
  3799		case encoder.OpStructFieldOmitEmptyBytesPtr:
  3800			p := load(ctxptr, code.Idx)
  3801			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3802			if p != 0 {
  3803				b = appendStructKey(ctx, code, b)
  3804				b = appendByteSlice(ctx, b, ptrToBytes(p))
  3805				b = appendComma(ctx, b)
  3806			}
  3807			code = code.Next
  3808		case encoder.OpStructFieldNumber:
  3809			p := load(ctxptr, code.Idx)
  3810			b = appendStructKey(ctx, code, b)
  3811			bb, err := appendNumber(ctx, b, ptrToNumber(p+uintptr(code.Offset)))
  3812			if err != nil {
  3813				return nil, err
  3814			}
  3815			b = appendComma(ctx, bb)
  3816			code = code.Next
  3817		case encoder.OpStructFieldOmitEmptyNumber:
  3818			p := load(ctxptr, code.Idx)
  3819			v := ptrToNumber(p + uintptr(code.Offset))
  3820			if v != "" {
  3821				b = appendStructKey(ctx, code, b)
  3822				bb, err := appendNumber(ctx, b, v)
  3823				if err != nil {
  3824					return nil, err
  3825				}
  3826				b = appendComma(ctx, bb)
  3827			}
  3828			code = code.Next
  3829		case encoder.OpStructFieldNumberString:
  3830			p := load(ctxptr, code.Idx)
  3831			b = appendStructKey(ctx, code, b)
  3832			b = append(b, '"')
  3833			bb, err := appendNumber(ctx, b, ptrToNumber(p+uintptr(code.Offset)))
  3834			if err != nil {
  3835				return nil, err
  3836			}
  3837			b = append(bb, '"')
  3838			b = appendComma(ctx, b)
  3839			code = code.Next
  3840		case encoder.OpStructFieldOmitEmptyNumberString:
  3841			p := load(ctxptr, code.Idx)
  3842			v := ptrToNumber(p + uintptr(code.Offset))
  3843			if v != "" {
  3844				b = appendStructKey(ctx, code, b)
  3845				b = append(b, '"')
  3846				bb, err := appendNumber(ctx, b, v)
  3847				if err != nil {
  3848					return nil, err
  3849				}
  3850				b = append(bb, '"')
  3851				b = appendComma(ctx, b)
  3852			}
  3853			code = code.Next
  3854		case encoder.OpStructFieldNumberPtr:
  3855			p := load(ctxptr, code.Idx)
  3856			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3857			b = appendStructKey(ctx, code, b)
  3858			if p == 0 {
  3859				b = appendNull(ctx, b)
  3860			} else {
  3861				bb, err := appendNumber(ctx, b, ptrToNumber(p))
  3862				if err != nil {
  3863					return nil, err
  3864				}
  3865				b = bb
  3866			}
  3867			b = appendComma(ctx, b)
  3868			code = code.Next
  3869		case encoder.OpStructFieldOmitEmptyNumberPtr:
  3870			p := load(ctxptr, code.Idx)
  3871			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3872			if p != 0 {
  3873				b = appendStructKey(ctx, code, b)
  3874				bb, err := appendNumber(ctx, b, ptrToNumber(p))
  3875				if err != nil {
  3876					return nil, err
  3877				}
  3878				b = appendComma(ctx, bb)
  3879			}
  3880			code = code.Next
  3881		case encoder.OpStructFieldNumberPtrString:
  3882			p := load(ctxptr, code.Idx)
  3883			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3884			b = appendStructKey(ctx, code, b)
  3885			if p == 0 {
  3886				b = appendNull(ctx, b)
  3887			} else {
  3888				b = append(b, '"')
  3889				bb, err := appendNumber(ctx, b, ptrToNumber(p))
  3890				if err != nil {
  3891					return nil, err
  3892				}
  3893				b = append(bb, '"')
  3894			}
  3895			b = appendComma(ctx, b)
  3896			code = code.Next
  3897		case encoder.OpStructFieldOmitEmptyNumberPtrString:
  3898			p := load(ctxptr, code.Idx)
  3899			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3900			if p != 0 {
  3901				b = appendStructKey(ctx, code, b)
  3902				b = append(b, '"')
  3903				bb, err := appendNumber(ctx, b, ptrToNumber(p))
  3904				if err != nil {
  3905					return nil, err
  3906				}
  3907				b = append(bb, '"')
  3908				b = appendComma(ctx, b)
  3909			}
  3910			code = code.Next
  3911		case encoder.OpStructFieldMarshalJSON:
  3912			p := load(ctxptr, code.Idx)
  3913			b = appendStructKey(ctx, code, b)
  3914			p += uintptr(code.Offset)
  3915			if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
  3916				p = ptrToPtr(p)
  3917			}
  3918			if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
  3919				b = appendNull(ctx, b)
  3920			} else {
  3921				bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
  3922				if err != nil {
  3923					return nil, err
  3924				}
  3925				b = bb
  3926			}
  3927			b = appendComma(ctx, b)
  3928			code = code.Next
  3929		case encoder.OpStructFieldOmitEmptyMarshalJSON:
  3930			p := load(ctxptr, code.Idx)
  3931			p += uintptr(code.Offset)
  3932			if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
  3933				p = ptrToPtr(p)
  3934			}
  3935			if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
  3936				code = code.NextField
  3937				break
  3938			}
  3939			iface := ptrToInterface(code, p)
  3940			if (code.Flags&encoder.NilCheckFlags) != 0 && encoder.IsNilForMarshaler(iface) {
  3941				code = code.NextField
  3942				break
  3943			}
  3944			b = appendStructKey(ctx, code, b)
  3945			bb, err := appendMarshalJSON(ctx, code, b, iface)
  3946			if err != nil {
  3947				return nil, err
  3948			}
  3949			b = appendComma(ctx, bb)
  3950			code = code.Next
  3951		case encoder.OpStructFieldMarshalJSONPtr:
  3952			p := load(ctxptr, code.Idx)
  3953			b = appendStructKey(ctx, code, b)
  3954			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3955			if p == 0 {
  3956				b = appendNull(ctx, b)
  3957			} else {
  3958				bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
  3959				if err != nil {
  3960					return nil, err
  3961				}
  3962				b = bb
  3963			}
  3964			b = appendComma(ctx, b)
  3965			code = code.Next
  3966		case encoder.OpStructFieldOmitEmptyMarshalJSONPtr:
  3967			p := load(ctxptr, code.Idx)
  3968			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  3969			if p != 0 {
  3970				b = appendStructKey(ctx, code, b)
  3971				bb, err := appendMarshalJSON(ctx, code, b, ptrToInterface(code, p))
  3972				if err != nil {
  3973					return nil, err
  3974				}
  3975				b = appendComma(ctx, bb)
  3976			}
  3977			code = code.Next
  3978		case encoder.OpStructFieldMarshalText:
  3979			p := load(ctxptr, code.Idx)
  3980			b = appendStructKey(ctx, code, b)
  3981			p += uintptr(code.Offset)
  3982			if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
  3983				p = ptrToPtr(p)
  3984			}
  3985			if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
  3986				b = appendNull(ctx, b)
  3987			} else {
  3988				bb, err := appendMarshalText(ctx, code, b, ptrToInterface(code, p))
  3989				if err != nil {
  3990					return nil, err
  3991				}
  3992				b = bb
  3993			}
  3994			b = appendComma(ctx, b)
  3995			code = code.Next
  3996		case encoder.OpStructFieldOmitEmptyMarshalText:
  3997			p := load(ctxptr, code.Idx)
  3998			p += uintptr(code.Offset)
  3999			if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
  4000				p = ptrToPtr(p)
  4001			}
  4002			if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
  4003				code = code.NextField
  4004				break
  4005			}
  4006			b = appendStructKey(ctx, code, b)
  4007			bb, err := appendMarshalText(ctx, code, b, ptrToInterface(code, p))
  4008			if err != nil {
  4009				return nil, err
  4010			}
  4011			b = appendComma(ctx, bb)
  4012			code = code.Next
  4013		case encoder.OpStructFieldMarshalTextPtr:
  4014			p := load(ctxptr, code.Idx)
  4015			b = appendStructKey(ctx, code, b)
  4016			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4017			if p == 0 {
  4018				b = appendNull(ctx, b)
  4019			} else {
  4020				bb, err := appendMarshalText(ctx, code, b, ptrToInterface(code, p))
  4021				if err != nil {
  4022					return nil, err
  4023				}
  4024				b = bb
  4025			}
  4026			b = appendComma(ctx, b)
  4027			code = code.Next
  4028		case encoder.OpStructFieldOmitEmptyMarshalTextPtr:
  4029			p := load(ctxptr, code.Idx)
  4030			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4031			if p != 0 {
  4032				b = appendStructKey(ctx, code, b)
  4033				bb, err := appendMarshalText(ctx, code, b, ptrToInterface(code, p))
  4034				if err != nil {
  4035					return nil, err
  4036				}
  4037				b = appendComma(ctx, bb)
  4038			}
  4039			code = code.Next
  4040		case encoder.OpStructFieldArray:
  4041			b = appendStructKey(ctx, code, b)
  4042			p := load(ctxptr, code.Idx)
  4043			p += uintptr(code.Offset)
  4044			code = code.Next
  4045			store(ctxptr, code.Idx, p)
  4046		case encoder.OpStructFieldOmitEmptyArray:
  4047			b = appendStructKey(ctx, code, b)
  4048			p := load(ctxptr, code.Idx)
  4049			p += uintptr(code.Offset)
  4050			code = code.Next
  4051			store(ctxptr, code.Idx, p)
  4052		case encoder.OpStructFieldArrayPtr:
  4053			b = appendStructKey(ctx, code, b)
  4054			p := load(ctxptr, code.Idx)
  4055			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4056			code = code.Next
  4057			store(ctxptr, code.Idx, p)
  4058		case encoder.OpStructFieldOmitEmptyArrayPtr:
  4059			p := load(ctxptr, code.Idx)
  4060			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4061			if p != 0 {
  4062				b = appendStructKey(ctx, code, b)
  4063				code = code.Next
  4064				store(ctxptr, code.Idx, p)
  4065			} else {
  4066				code = code.NextField
  4067			}
  4068		case encoder.OpStructFieldSlice:
  4069			b = appendStructKey(ctx, code, b)
  4070			p := load(ctxptr, code.Idx)
  4071			p += uintptr(code.Offset)
  4072			code = code.Next
  4073			store(ctxptr, code.Idx, p)
  4074		case encoder.OpStructFieldOmitEmptySlice:
  4075			p := load(ctxptr, code.Idx)
  4076			p += uintptr(code.Offset)
  4077			slice := ptrToSlice(p)
  4078			if slice.Len == 0 {
  4079				code = code.NextField
  4080			} else {
  4081				b = appendStructKey(ctx, code, b)
  4082				code = code.Next
  4083				store(ctxptr, code.Idx, p)
  4084			}
  4085		case encoder.OpStructFieldSlicePtr:
  4086			b = appendStructKey(ctx, code, b)
  4087			p := load(ctxptr, code.Idx)
  4088			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4089			code = code.Next
  4090			store(ctxptr, code.Idx, p)
  4091		case encoder.OpStructFieldOmitEmptySlicePtr:
  4092			p := load(ctxptr, code.Idx)
  4093			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4094			if p != 0 {
  4095				b = appendStructKey(ctx, code, b)
  4096				code = code.Next
  4097				store(ctxptr, code.Idx, p)
  4098			} else {
  4099				code = code.NextField
  4100			}
  4101		case encoder.OpStructFieldMap:
  4102			b = appendStructKey(ctx, code, b)
  4103			p := load(ctxptr, code.Idx)
  4104			p = ptrToPtr(p + uintptr(code.Offset))
  4105			code = code.Next
  4106			store(ctxptr, code.Idx, p)
  4107		case encoder.OpStructFieldOmitEmptyMap:
  4108			p := load(ctxptr, code.Idx)
  4109			p = ptrToPtr(p + uintptr(code.Offset))
  4110			if p == 0 || maplen(ptrToUnsafePtr(p)) == 0 {
  4111				code = code.NextField
  4112			} else {
  4113				b = appendStructKey(ctx, code, b)
  4114				code = code.Next
  4115				store(ctxptr, code.Idx, p)
  4116			}
  4117		case encoder.OpStructFieldMapPtr:
  4118			b = appendStructKey(ctx, code, b)
  4119			p := load(ctxptr, code.Idx)
  4120			p = ptrToPtr(p + uintptr(code.Offset))
  4121			if p != 0 {
  4122				p = ptrToNPtr(p, code.PtrNum)
  4123			}
  4124			code = code.Next
  4125			store(ctxptr, code.Idx, p)
  4126		case encoder.OpStructFieldOmitEmptyMapPtr:
  4127			p := load(ctxptr, code.Idx)
  4128			p = ptrToPtr(p + uintptr(code.Offset))
  4129			if p != 0 {
  4130				p = ptrToNPtr(p, code.PtrNum)
  4131			}
  4132			if p != 0 {
  4133				b = appendStructKey(ctx, code, b)
  4134				code = code.Next
  4135				store(ctxptr, code.Idx, p)
  4136			} else {
  4137				code = code.NextField
  4138			}
  4139		case encoder.OpStructFieldStruct:
  4140			b = appendStructKey(ctx, code, b)
  4141			p := load(ctxptr, code.Idx)
  4142			p += uintptr(code.Offset)
  4143			code = code.Next
  4144			store(ctxptr, code.Idx, p)
  4145		case encoder.OpStructFieldOmitEmptyStruct:
  4146			p := load(ctxptr, code.Idx)
  4147			p += uintptr(code.Offset)
  4148			if ptrToPtr(p) == 0 && (code.Flags&encoder.IsNextOpPtrTypeFlags) != 0 {
  4149				code = code.NextField
  4150			} else {
  4151				b = appendStructKey(ctx, code, b)
  4152				code = code.Next
  4153				store(ctxptr, code.Idx, p)
  4154			}
  4155		case encoder.OpStructEnd:
  4156			b = appendStructEndSkipLast(ctx, code, b)
  4157			code = code.Next
  4158		case encoder.OpStructEndInt:
  4159			p := load(ctxptr, code.Idx)
  4160			b = appendStructKey(ctx, code, b)
  4161			b = appendInt(ctx, b, p+uintptr(code.Offset), code)
  4162			b = appendStructEnd(ctx, code, b)
  4163			code = code.Next
  4164		case encoder.OpStructEndOmitEmptyInt:
  4165			p := load(ctxptr, code.Idx)
  4166			u64 := ptrToUint64(p+uintptr(code.Offset), code.NumBitSize)
  4167			v := u64 & ((1 << code.NumBitSize) - 1)
  4168			if v != 0 {
  4169				b = appendStructKey(ctx, code, b)
  4170				b = appendInt(ctx, b, p+uintptr(code.Offset), code)
  4171				b = appendStructEnd(ctx, code, b)
  4172			} else {
  4173				b = appendStructEndSkipLast(ctx, code, b)
  4174			}
  4175			code = code.Next
  4176		case encoder.OpStructEndIntString:
  4177			p := load(ctxptr, code.Idx)
  4178			b = appendStructKey(ctx, code, b)
  4179			b = append(b, '"')
  4180			b = appendInt(ctx, b, p+uintptr(code.Offset), code)
  4181			b = append(b, '"')
  4182			b = appendStructEnd(ctx, code, b)
  4183			code = code.Next
  4184		case encoder.OpStructEndOmitEmptyIntString:
  4185			p := load(ctxptr, code.Idx)
  4186			u64 := ptrToUint64(p+uintptr(code.Offset), code.NumBitSize)
  4187			v := u64 & ((1 << code.NumBitSize) - 1)
  4188			if v != 0 {
  4189				b = appendStructKey(ctx, code, b)
  4190				b = append(b, '"')
  4191				b = appendInt(ctx, b, p+uintptr(code.Offset), code)
  4192				b = append(b, '"')
  4193				b = appendStructEnd(ctx, code, b)
  4194			} else {
  4195				b = appendStructEndSkipLast(ctx, code, b)
  4196			}
  4197			code = code.Next
  4198		case encoder.OpStructEndIntPtr:
  4199			b = appendStructKey(ctx, code, b)
  4200			p := load(ctxptr, code.Idx)
  4201			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4202			if p == 0 {
  4203				b = appendNull(ctx, b)
  4204			} else {
  4205				b = appendInt(ctx, b, p, code)
  4206			}
  4207			b = appendStructEnd(ctx, code, b)
  4208			code = code.Next
  4209		case encoder.OpStructEndOmitEmptyIntPtr:
  4210			p := load(ctxptr, code.Idx)
  4211			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4212			if p != 0 {
  4213				b = appendStructKey(ctx, code, b)
  4214				b = appendInt(ctx, b, p, code)
  4215				b = appendStructEnd(ctx, code, b)
  4216			} else {
  4217				b = appendStructEndSkipLast(ctx, code, b)
  4218			}
  4219			code = code.Next
  4220		case encoder.OpStructEndIntPtrString:
  4221			b = appendStructKey(ctx, code, b)
  4222			p := load(ctxptr, code.Idx)
  4223			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4224			if p == 0 {
  4225				b = appendNull(ctx, b)
  4226			} else {
  4227				b = append(b, '"')
  4228				b = appendInt(ctx, b, p, code)
  4229				b = append(b, '"')
  4230			}
  4231			b = appendStructEnd(ctx, code, b)
  4232			code = code.Next
  4233		case encoder.OpStructEndOmitEmptyIntPtrString:
  4234			p := load(ctxptr, code.Idx)
  4235			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4236			if p != 0 {
  4237				b = appendStructKey(ctx, code, b)
  4238				b = append(b, '"')
  4239				b = appendInt(ctx, b, p, code)
  4240				b = append(b, '"')
  4241				b = appendStructEnd(ctx, code, b)
  4242			} else {
  4243				b = appendStructEndSkipLast(ctx, code, b)
  4244			}
  4245			code = code.Next
  4246		case encoder.OpStructEndUint:
  4247			p := load(ctxptr, code.Idx)
  4248			b = appendStructKey(ctx, code, b)
  4249			b = appendUint(ctx, b, p+uintptr(code.Offset), code)
  4250			b = appendStructEnd(ctx, code, b)
  4251			code = code.Next
  4252		case encoder.OpStructEndOmitEmptyUint:
  4253			p := load(ctxptr, code.Idx)
  4254			u64 := ptrToUint64(p+uintptr(code.Offset), code.NumBitSize)
  4255			v := u64 & ((1 << code.NumBitSize) - 1)
  4256			if v != 0 {
  4257				b = appendStructKey(ctx, code, b)
  4258				b = appendUint(ctx, b, p+uintptr(code.Offset), code)
  4259				b = appendStructEnd(ctx, code, b)
  4260			} else {
  4261				b = appendStructEndSkipLast(ctx, code, b)
  4262			}
  4263			code = code.Next
  4264		case encoder.OpStructEndUintString:
  4265			p := load(ctxptr, code.Idx)
  4266			b = appendStructKey(ctx, code, b)
  4267			b = append(b, '"')
  4268			b = appendUint(ctx, b, p+uintptr(code.Offset), code)
  4269			b = append(b, '"')
  4270			b = appendStructEnd(ctx, code, b)
  4271			code = code.Next
  4272		case encoder.OpStructEndOmitEmptyUintString:
  4273			p := load(ctxptr, code.Idx)
  4274			u64 := ptrToUint64(p+uintptr(code.Offset), code.NumBitSize)
  4275			v := u64 & ((1 << code.NumBitSize) - 1)
  4276			if v != 0 {
  4277				b = appendStructKey(ctx, code, b)
  4278				b = append(b, '"')
  4279				b = appendUint(ctx, b, p+uintptr(code.Offset), code)
  4280				b = append(b, '"')
  4281				b = appendStructEnd(ctx, code, b)
  4282			} else {
  4283				b = appendStructEndSkipLast(ctx, code, b)
  4284			}
  4285			code = code.Next
  4286		case encoder.OpStructEndUintPtr:
  4287			b = appendStructKey(ctx, code, b)
  4288			p := load(ctxptr, code.Idx)
  4289			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4290			if p == 0 {
  4291				b = appendNull(ctx, b)
  4292			} else {
  4293				b = appendUint(ctx, b, p, code)
  4294			}
  4295			b = appendStructEnd(ctx, code, b)
  4296			code = code.Next
  4297		case encoder.OpStructEndOmitEmptyUintPtr:
  4298			p := load(ctxptr, code.Idx)
  4299			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4300			if p != 0 {
  4301				b = appendStructKey(ctx, code, b)
  4302				b = appendUint(ctx, b, p, code)
  4303				b = appendStructEnd(ctx, code, b)
  4304			} else {
  4305				b = appendStructEndSkipLast(ctx, code, b)
  4306			}
  4307			code = code.Next
  4308		case encoder.OpStructEndUintPtrString:
  4309			b = appendStructKey(ctx, code, b)
  4310			p := load(ctxptr, code.Idx)
  4311			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4312			if p == 0 {
  4313				b = appendNull(ctx, b)
  4314			} else {
  4315				b = append(b, '"')
  4316				b = appendUint(ctx, b, p, code)
  4317				b = append(b, '"')
  4318			}
  4319			b = appendStructEnd(ctx, code, b)
  4320			code = code.Next
  4321		case encoder.OpStructEndOmitEmptyUintPtrString:
  4322			p := load(ctxptr, code.Idx)
  4323			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4324			if p != 0 {
  4325				b = appendStructKey(ctx, code, b)
  4326				b = append(b, '"')
  4327				b = appendUint(ctx, b, p, code)
  4328				b = append(b, '"')
  4329				b = appendStructEnd(ctx, code, b)
  4330			} else {
  4331				b = appendStructEndSkipLast(ctx, code, b)
  4332			}
  4333			code = code.Next
  4334		case encoder.OpStructEndFloat32:
  4335			p := load(ctxptr, code.Idx)
  4336			b = appendStructKey(ctx, code, b)
  4337			b = appendFloat32(ctx, b, ptrToFloat32(p+uintptr(code.Offset)))
  4338			b = appendStructEnd(ctx, code, b)
  4339			code = code.Next
  4340		case encoder.OpStructEndOmitEmptyFloat32:
  4341			p := load(ctxptr, code.Idx)
  4342			v := ptrToFloat32(p + uintptr(code.Offset))
  4343			if v != 0 {
  4344				b = appendStructKey(ctx, code, b)
  4345				b = appendFloat32(ctx, b, v)
  4346				b = appendStructEnd(ctx, code, b)
  4347			} else {
  4348				b = appendStructEndSkipLast(ctx, code, b)
  4349			}
  4350			code = code.Next
  4351		case encoder.OpStructEndFloat32String:
  4352			p := load(ctxptr, code.Idx)
  4353			b = appendStructKey(ctx, code, b)
  4354			b = append(b, '"')
  4355			b = appendFloat32(ctx, b, ptrToFloat32(p+uintptr(code.Offset)))
  4356			b = append(b, '"')
  4357			b = appendStructEnd(ctx, code, b)
  4358			code = code.Next
  4359		case encoder.OpStructEndOmitEmptyFloat32String:
  4360			p := load(ctxptr, code.Idx)
  4361			v := ptrToFloat32(p + uintptr(code.Offset))
  4362			if v != 0 {
  4363				b = appendStructKey(ctx, code, b)
  4364				b = append(b, '"')
  4365				b = appendFloat32(ctx, b, v)
  4366				b = append(b, '"')
  4367				b = appendStructEnd(ctx, code, b)
  4368			} else {
  4369				b = appendStructEndSkipLast(ctx, code, b)
  4370			}
  4371			code = code.Next
  4372		case encoder.OpStructEndFloat32Ptr:
  4373			b = appendStructKey(ctx, code, b)
  4374			p := load(ctxptr, code.Idx)
  4375			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4376			if p == 0 {
  4377				b = appendNull(ctx, b)
  4378			} else {
  4379				b = appendFloat32(ctx, b, ptrToFloat32(p))
  4380			}
  4381			b = appendStructEnd(ctx, code, b)
  4382			code = code.Next
  4383		case encoder.OpStructEndOmitEmptyFloat32Ptr:
  4384			p := load(ctxptr, code.Idx)
  4385			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4386			if p != 0 {
  4387				b = appendStructKey(ctx, code, b)
  4388				b = appendFloat32(ctx, b, ptrToFloat32(p))
  4389				b = appendStructEnd(ctx, code, b)
  4390			} else {
  4391				b = appendStructEndSkipLast(ctx, code, b)
  4392			}
  4393			code = code.Next
  4394		case encoder.OpStructEndFloat32PtrString:
  4395			b = appendStructKey(ctx, code, b)
  4396			p := load(ctxptr, code.Idx)
  4397			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4398			if p == 0 {
  4399				b = appendNull(ctx, b)
  4400			} else {
  4401				b = append(b, '"')
  4402				b = appendFloat32(ctx, b, ptrToFloat32(p))
  4403				b = append(b, '"')
  4404			}
  4405			b = appendStructEnd(ctx, code, b)
  4406			code = code.Next
  4407		case encoder.OpStructEndOmitEmptyFloat32PtrString:
  4408			p := load(ctxptr, code.Idx)
  4409			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4410			if p != 0 {
  4411				b = appendStructKey(ctx, code, b)
  4412				b = append(b, '"')
  4413				b = appendFloat32(ctx, b, ptrToFloat32(p))
  4414				b = append(b, '"')
  4415				b = appendStructEnd(ctx, code, b)
  4416			} else {
  4417				b = appendStructEndSkipLast(ctx, code, b)
  4418			}
  4419			code = code.Next
  4420		case encoder.OpStructEndFloat64:
  4421			p := load(ctxptr, code.Idx)
  4422			v := ptrToFloat64(p + uintptr(code.Offset))
  4423			if math.IsInf(v, 0) || math.IsNaN(v) {
  4424				return nil, errUnsupportedFloat(v)
  4425			}
  4426			b = appendStructKey(ctx, code, b)
  4427			b = appendFloat64(ctx, b, v)
  4428			b = appendStructEnd(ctx, code, b)
  4429			code = code.Next
  4430		case encoder.OpStructEndOmitEmptyFloat64:
  4431			p := load(ctxptr, code.Idx)
  4432			v := ptrToFloat64(p + uintptr(code.Offset))
  4433			if v != 0 {
  4434				if math.IsInf(v, 0) || math.IsNaN(v) {
  4435					return nil, errUnsupportedFloat(v)
  4436				}
  4437				b = appendStructKey(ctx, code, b)
  4438				b = appendFloat64(ctx, b, v)
  4439				b = appendStructEnd(ctx, code, b)
  4440			} else {
  4441				b = appendStructEndSkipLast(ctx, code, b)
  4442			}
  4443			code = code.Next
  4444		case encoder.OpStructEndFloat64String:
  4445			p := load(ctxptr, code.Idx)
  4446			v := ptrToFloat64(p + uintptr(code.Offset))
  4447			if math.IsInf(v, 0) || math.IsNaN(v) {
  4448				return nil, errUnsupportedFloat(v)
  4449			}
  4450			b = appendStructKey(ctx, code, b)
  4451			b = append(b, '"')
  4452			b = appendFloat64(ctx, b, v)
  4453			b = append(b, '"')
  4454			b = appendStructEnd(ctx, code, b)
  4455			code = code.Next
  4456		case encoder.OpStructEndOmitEmptyFloat64String:
  4457			p := load(ctxptr, code.Idx)
  4458			v := ptrToFloat64(p + uintptr(code.Offset))
  4459			if v != 0 {
  4460				if math.IsInf(v, 0) || math.IsNaN(v) {
  4461					return nil, errUnsupportedFloat(v)
  4462				}
  4463				b = appendStructKey(ctx, code, b)
  4464				b = append(b, '"')
  4465				b = appendFloat64(ctx, b, v)
  4466				b = append(b, '"')
  4467				b = appendStructEnd(ctx, code, b)
  4468			} else {
  4469				b = appendStructEndSkipLast(ctx, code, b)
  4470			}
  4471			code = code.Next
  4472		case encoder.OpStructEndFloat64Ptr:
  4473			b = appendStructKey(ctx, code, b)
  4474			p := load(ctxptr, code.Idx)
  4475			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4476			if p == 0 {
  4477				b = appendNull(ctx, b)
  4478				b = appendStructEnd(ctx, code, b)
  4479				code = code.Next
  4480				break
  4481			}
  4482			v := ptrToFloat64(p)
  4483			if math.IsInf(v, 0) || math.IsNaN(v) {
  4484				return nil, errUnsupportedFloat(v)
  4485			}
  4486			b = appendFloat64(ctx, b, v)
  4487			b = appendStructEnd(ctx, code, b)
  4488			code = code.Next
  4489		case encoder.OpStructEndOmitEmptyFloat64Ptr:
  4490			p := load(ctxptr, code.Idx)
  4491			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4492			if p != 0 {
  4493				b = appendStructKey(ctx, code, b)
  4494				v := ptrToFloat64(p)
  4495				if math.IsInf(v, 0) || math.IsNaN(v) {
  4496					return nil, errUnsupportedFloat(v)
  4497				}
  4498				b = appendFloat64(ctx, b, v)
  4499				b = appendStructEnd(ctx, code, b)
  4500			} else {
  4501				b = appendStructEndSkipLast(ctx, code, b)
  4502			}
  4503			code = code.Next
  4504		case encoder.OpStructEndFloat64PtrString:
  4505			b = appendStructKey(ctx, code, b)
  4506			p := load(ctxptr, code.Idx)
  4507			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4508			if p == 0 {
  4509				b = appendNull(ctx, b)
  4510			} else {
  4511				b = append(b, '"')
  4512				v := ptrToFloat64(p)
  4513				if math.IsInf(v, 0) || math.IsNaN(v) {
  4514					return nil, errUnsupportedFloat(v)
  4515				}
  4516				b = appendFloat64(ctx, b, v)
  4517				b = append(b, '"')
  4518			}
  4519			b = appendStructEnd(ctx, code, b)
  4520			code = code.Next
  4521		case encoder.OpStructEndOmitEmptyFloat64PtrString:
  4522			p := load(ctxptr, code.Idx)
  4523			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4524			if p != 0 {
  4525				b = appendStructKey(ctx, code, b)
  4526				v := ptrToFloat64(p)
  4527				if math.IsInf(v, 0) || math.IsNaN(v) {
  4528					return nil, errUnsupportedFloat(v)
  4529				}
  4530				b = append(b, '"')
  4531				b = appendFloat64(ctx, b, v)
  4532				b = append(b, '"')
  4533				b = appendStructEnd(ctx, code, b)
  4534			} else {
  4535				b = appendStructEndSkipLast(ctx, code, b)
  4536			}
  4537			code = code.Next
  4538		case encoder.OpStructEndString:
  4539			p := load(ctxptr, code.Idx)
  4540			b = appendStructKey(ctx, code, b)
  4541			b = appendString(ctx, b, ptrToString(p+uintptr(code.Offset)))
  4542			b = appendStructEnd(ctx, code, b)
  4543			code = code.Next
  4544		case encoder.OpStructEndOmitEmptyString:
  4545			p := load(ctxptr, code.Idx)
  4546			v := ptrToString(p + uintptr(code.Offset))
  4547			if v != "" {
  4548				b = appendStructKey(ctx, code, b)
  4549				b = appendString(ctx, b, v)
  4550				b = appendStructEnd(ctx, code, b)
  4551			} else {
  4552				b = appendStructEndSkipLast(ctx, code, b)
  4553			}
  4554			code = code.Next
  4555		case encoder.OpStructEndStringString:
  4556			p := load(ctxptr, code.Idx)
  4557			b = appendStructKey(ctx, code, b)
  4558			s := ptrToString(p + uintptr(code.Offset))
  4559			b = appendString(ctx, b, string(appendString(ctx, []byte{}, s)))
  4560			b = appendStructEnd(ctx, code, b)
  4561			code = code.Next
  4562		case encoder.OpStructEndOmitEmptyStringString:
  4563			p := load(ctxptr, code.Idx)
  4564			v := ptrToString(p + uintptr(code.Offset))
  4565			if v != "" {
  4566				b = appendStructKey(ctx, code, b)
  4567				b = appendString(ctx, b, string(appendString(ctx, []byte{}, v)))
  4568				b = appendStructEnd(ctx, code, b)
  4569			} else {
  4570				b = appendStructEndSkipLast(ctx, code, b)
  4571			}
  4572			code = code.Next
  4573		case encoder.OpStructEndStringPtr:
  4574			b = appendStructKey(ctx, code, b)
  4575			p := load(ctxptr, code.Idx)
  4576			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4577			if p == 0 {
  4578				b = appendNull(ctx, b)
  4579			} else {
  4580				b = appendString(ctx, b, ptrToString(p))
  4581			}
  4582			b = appendStructEnd(ctx, code, b)
  4583			code = code.Next
  4584		case encoder.OpStructEndOmitEmptyStringPtr:
  4585			p := load(ctxptr, code.Idx)
  4586			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4587			if p != 0 {
  4588				b = appendStructKey(ctx, code, b)
  4589				b = appendString(ctx, b, ptrToString(p))
  4590				b = appendStructEnd(ctx, code, b)
  4591			} else {
  4592				b = appendStructEndSkipLast(ctx, code, b)
  4593			}
  4594			code = code.Next
  4595		case encoder.OpStructEndStringPtrString:
  4596			b = appendStructKey(ctx, code, b)
  4597			p := load(ctxptr, code.Idx)
  4598			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4599			if p == 0 {
  4600				b = appendNull(ctx, b)
  4601			} else {
  4602				b = appendString(ctx, b, string(appendString(ctx, []byte{}, ptrToString(p))))
  4603			}
  4604			b = appendStructEnd(ctx, code, b)
  4605			code = code.Next
  4606		case encoder.OpStructEndOmitEmptyStringPtrString:
  4607			p := load(ctxptr, code.Idx)
  4608			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4609			if p != 0 {
  4610				b = appendStructKey(ctx, code, b)
  4611				b = appendString(ctx, b, string(appendString(ctx, []byte{}, ptrToString(p))))
  4612				b = appendStructEnd(ctx, code, b)
  4613			} else {
  4614				b = appendStructEndSkipLast(ctx, code, b)
  4615			}
  4616			code = code.Next
  4617		case encoder.OpStructEndBool:
  4618			p := load(ctxptr, code.Idx)
  4619			b = appendStructKey(ctx, code, b)
  4620			b = appendBool(ctx, b, ptrToBool(p+uintptr(code.Offset)))
  4621			b = appendStructEnd(ctx, code, b)
  4622			code = code.Next
  4623		case encoder.OpStructEndOmitEmptyBool:
  4624			p := load(ctxptr, code.Idx)
  4625			v := ptrToBool(p + uintptr(code.Offset))
  4626			if v {
  4627				b = appendStructKey(ctx, code, b)
  4628				b = appendBool(ctx, b, v)
  4629				b = appendStructEnd(ctx, code, b)
  4630			} else {
  4631				b = appendStructEndSkipLast(ctx, code, b)
  4632			}
  4633			code = code.Next
  4634		case encoder.OpStructEndBoolString:
  4635			p := load(ctxptr, code.Idx)
  4636			b = appendStructKey(ctx, code, b)
  4637			b = append(b, '"')
  4638			b = appendBool(ctx, b, ptrToBool(p+uintptr(code.Offset)))
  4639			b = append(b, '"')
  4640			b = appendStructEnd(ctx, code, b)
  4641			code = code.Next
  4642		case encoder.OpStructEndOmitEmptyBoolString:
  4643			p := load(ctxptr, code.Idx)
  4644			v := ptrToBool(p + uintptr(code.Offset))
  4645			if v {
  4646				b = appendStructKey(ctx, code, b)
  4647				b = append(b, '"')
  4648				b = appendBool(ctx, b, v)
  4649				b = append(b, '"')
  4650				b = appendStructEnd(ctx, code, b)
  4651			} else {
  4652				b = appendStructEndSkipLast(ctx, code, b)
  4653			}
  4654			code = code.Next
  4655		case encoder.OpStructEndBoolPtr:
  4656			b = appendStructKey(ctx, code, b)
  4657			p := load(ctxptr, code.Idx)
  4658			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4659			if p == 0 {
  4660				b = appendNull(ctx, b)
  4661			} else {
  4662				b = appendBool(ctx, b, ptrToBool(p))
  4663			}
  4664			b = appendStructEnd(ctx, code, b)
  4665			code = code.Next
  4666		case encoder.OpStructEndOmitEmptyBoolPtr:
  4667			p := load(ctxptr, code.Idx)
  4668			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4669			if p != 0 {
  4670				b = appendStructKey(ctx, code, b)
  4671				b = appendBool(ctx, b, ptrToBool(p))
  4672				b = appendStructEnd(ctx, code, b)
  4673			} else {
  4674				b = appendStructEndSkipLast(ctx, code, b)
  4675			}
  4676			code = code.Next
  4677		case encoder.OpStructEndBoolPtrString:
  4678			b = appendStructKey(ctx, code, b)
  4679			p := load(ctxptr, code.Idx)
  4680			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4681			if p == 0 {
  4682				b = appendNull(ctx, b)
  4683			} else {
  4684				b = append(b, '"')
  4685				b = appendBool(ctx, b, ptrToBool(p))
  4686				b = append(b, '"')
  4687			}
  4688			b = appendStructEnd(ctx, code, b)
  4689			code = code.Next
  4690		case encoder.OpStructEndOmitEmptyBoolPtrString:
  4691			p := load(ctxptr, code.Idx)
  4692			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4693			if p != 0 {
  4694				b = appendStructKey(ctx, code, b)
  4695				b = append(b, '"')
  4696				b = appendBool(ctx, b, ptrToBool(p))
  4697				b = append(b, '"')
  4698				b = appendStructEnd(ctx, code, b)
  4699			} else {
  4700				b = appendStructEndSkipLast(ctx, code, b)
  4701			}
  4702			code = code.Next
  4703		case encoder.OpStructEndBytes:
  4704			p := load(ctxptr, code.Idx)
  4705			b = appendStructKey(ctx, code, b)
  4706			b = appendByteSlice(ctx, b, ptrToBytes(p+uintptr(code.Offset)))
  4707			b = appendStructEnd(ctx, code, b)
  4708			code = code.Next
  4709		case encoder.OpStructEndOmitEmptyBytes:
  4710			p := load(ctxptr, code.Idx)
  4711			v := ptrToBytes(p + uintptr(code.Offset))
  4712			if len(v) > 0 {
  4713				b = appendStructKey(ctx, code, b)
  4714				b = appendByteSlice(ctx, b, v)
  4715				b = appendStructEnd(ctx, code, b)
  4716			} else {
  4717				b = appendStructEndSkipLast(ctx, code, b)
  4718			}
  4719			code = code.Next
  4720		case encoder.OpStructEndBytesPtr:
  4721			b = appendStructKey(ctx, code, b)
  4722			p := load(ctxptr, code.Idx)
  4723			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4724			if p == 0 {
  4725				b = appendNull(ctx, b)
  4726			} else {
  4727				b = appendByteSlice(ctx, b, ptrToBytes(p))
  4728			}
  4729			b = appendStructEnd(ctx, code, b)
  4730			code = code.Next
  4731		case encoder.OpStructEndOmitEmptyBytesPtr:
  4732			p := load(ctxptr, code.Idx)
  4733			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4734			if p != 0 {
  4735				b = appendStructKey(ctx, code, b)
  4736				b = appendByteSlice(ctx, b, ptrToBytes(p))
  4737				b = appendStructEnd(ctx, code, b)
  4738			} else {
  4739				b = appendStructEndSkipLast(ctx, code, b)
  4740			}
  4741			code = code.Next
  4742		case encoder.OpStructEndNumber:
  4743			p := load(ctxptr, code.Idx)
  4744			b = appendStructKey(ctx, code, b)
  4745			bb, err := appendNumber(ctx, b, ptrToNumber(p+uintptr(code.Offset)))
  4746			if err != nil {
  4747				return nil, err
  4748			}
  4749			b = appendStructEnd(ctx, code, bb)
  4750			code = code.Next
  4751		case encoder.OpStructEndOmitEmptyNumber:
  4752			p := load(ctxptr, code.Idx)
  4753			v := ptrToNumber(p + uintptr(code.Offset))
  4754			if v != "" {
  4755				b = appendStructKey(ctx, code, b)
  4756				bb, err := appendNumber(ctx, b, v)
  4757				if err != nil {
  4758					return nil, err
  4759				}
  4760				b = appendStructEnd(ctx, code, bb)
  4761			} else {
  4762				b = appendStructEndSkipLast(ctx, code, b)
  4763			}
  4764			code = code.Next
  4765		case encoder.OpStructEndNumberString:
  4766			p := load(ctxptr, code.Idx)
  4767			b = appendStructKey(ctx, code, b)
  4768			b = append(b, '"')
  4769			bb, err := appendNumber(ctx, b, ptrToNumber(p+uintptr(code.Offset)))
  4770			if err != nil {
  4771				return nil, err
  4772			}
  4773			b = append(bb, '"')
  4774			b = appendStructEnd(ctx, code, b)
  4775			code = code.Next
  4776		case encoder.OpStructEndOmitEmptyNumberString:
  4777			p := load(ctxptr, code.Idx)
  4778			v := ptrToNumber(p + uintptr(code.Offset))
  4779			if v != "" {
  4780				b = appendStructKey(ctx, code, b)
  4781				b = append(b, '"')
  4782				bb, err := appendNumber(ctx, b, v)
  4783				if err != nil {
  4784					return nil, err
  4785				}
  4786				b = append(bb, '"')
  4787				b = appendStructEnd(ctx, code, b)
  4788			} else {
  4789				b = appendStructEndSkipLast(ctx, code, b)
  4790			}
  4791			code = code.Next
  4792		case encoder.OpStructEndNumberPtr:
  4793			b = appendStructKey(ctx, code, b)
  4794			p := load(ctxptr, code.Idx)
  4795			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4796			if p == 0 {
  4797				b = appendNull(ctx, b)
  4798			} else {
  4799				bb, err := appendNumber(ctx, b, ptrToNumber(p))
  4800				if err != nil {
  4801					return nil, err
  4802				}
  4803				b = bb
  4804			}
  4805			b = appendStructEnd(ctx, code, b)
  4806			code = code.Next
  4807		case encoder.OpStructEndOmitEmptyNumberPtr:
  4808			p := load(ctxptr, code.Idx)
  4809			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4810			if p != 0 {
  4811				b = appendStructKey(ctx, code, b)
  4812				bb, err := appendNumber(ctx, b, ptrToNumber(p))
  4813				if err != nil {
  4814					return nil, err
  4815				}
  4816				b = appendStructEnd(ctx, code, bb)
  4817			} else {
  4818				b = appendStructEndSkipLast(ctx, code, b)
  4819			}
  4820			code = code.Next
  4821		case encoder.OpStructEndNumberPtrString:
  4822			b = appendStructKey(ctx, code, b)
  4823			p := load(ctxptr, code.Idx)
  4824			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4825			if p == 0 {
  4826				b = appendNull(ctx, b)
  4827			} else {
  4828				b = append(b, '"')
  4829				bb, err := appendNumber(ctx, b, ptrToNumber(p))
  4830				if err != nil {
  4831					return nil, err
  4832				}
  4833				b = append(bb, '"')
  4834			}
  4835			b = appendStructEnd(ctx, code, b)
  4836			code = code.Next
  4837		case encoder.OpStructEndOmitEmptyNumberPtrString:
  4838			p := load(ctxptr, code.Idx)
  4839			p = ptrToNPtr(p+uintptr(code.Offset), code.PtrNum)
  4840			if p != 0 {
  4841				b = appendStructKey(ctx, code, b)
  4842				b = append(b, '"')
  4843				bb, err := appendNumber(ctx, b, ptrToNumber(p))
  4844				if err != nil {
  4845					return nil, err
  4846				}
  4847				b = append(bb, '"')
  4848				b = appendStructEnd(ctx, code, b)
  4849			} else {
  4850				b = appendStructEndSkipLast(ctx, code, b)
  4851			}
  4852			code = code.Next
  4853		case encoder.OpEnd:
  4854			goto END
  4855		}
  4856	}
  4857END:
  4858	return b, nil
  4859}

View as plain text