github.com/night-codes/go-json@v0.9.15/internal/encoder/vm_color_indent/vm.go (about)

     1  // Code generated by internal/cmd/generator. DO NOT EDIT!
     2  package vm_color_indent
     3  
     4  import (
     5  	"math"
     6  	"reflect"
     7  	"sort"
     8  	"unsafe"
     9  
    10  	"github.com/night-codes/go-json/internal/encoder"
    11  	"github.com/night-codes/go-json/internal/runtime"
    12  )
    13  
    14  func 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  	}
  4857  END:
  4858  	return b, nil
  4859  }