Merge pull request #319 from goccy/feature/fix-encoding-head-offset

Fix encoding of MarshalText/MarshalJSON operation with head offset
This commit is contained in:
Masaaki Goshima 2022-01-11 15:26:55 +09:00 committed by GitHub
commit 1978ac1e52
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 86 additions and 30 deletions

View File

@ -2308,3 +2308,34 @@ func TestMarshalIndent(t *testing.T) {
t.Fatalf("expected: %q but got %q", expected, got) t.Fatalf("expected: %q but got %q", expected, got)
} }
} }
type issue318Embedded struct {
_ [64]byte
}
type issue318 struct {
issue318Embedded `json:"-"`
ID issue318MarshalText `json:"id,omitempty"`
}
type issue318MarshalText struct {
ID string
}
func (i issue318MarshalText) MarshalText() ([]byte, error) {
return []byte(i.ID), nil
}
func TestIssue318(t *testing.T) {
v := issue318{
ID: issue318MarshalText{ID: "1"},
}
b, err := json.Marshal(v)
if err != nil {
t.Fatal(err)
}
expected := `{"id":"1"}`
if string(b) != expected {
t.Fatalf("failed to encode. expected %s but got %s", expected, string(b))
}
}

View File

@ -705,14 +705,15 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
if code.Flags&encoder.AnonymousHeadFlags == 0 { if code.Flags&encoder.AnonymousHeadFlags == 0 {
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
u64 := ptrToUint64(p+uintptr(code.Offset), code.NumBitSize) p += uintptr(code.Offset)
u64 := ptrToUint64(p, code.NumBitSize)
v := u64 & ((1 << code.NumBitSize) - 1) v := u64 & ((1 << code.NumBitSize) - 1)
if v == 0 { if v == 0 {
code = code.NextField code = code.NextField
} else { } else {
b = appendStructKey(ctx, code, b) b = appendStructKey(ctx, code, b)
b = append(b, '"') b = append(b, '"')
b = appendInt(ctx, b, p+uintptr(code.Offset), code) b = appendInt(ctx, b, p, code)
b = append(b, '"') b = append(b, '"')
b = appendComma(ctx, b) b = appendComma(ctx, b)
code = code.Next code = code.Next
@ -2953,9 +2954,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
b = appendStructKey(ctx, code, b) b = appendStructKey(ctx, code, b)
p += uintptr(code.Offset)
if (code.Flags & encoder.IsNilableTypeFlags) != 0 { if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalJSON { if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalJSON {
p = ptrToPtr(p + uintptr(code.Offset)) p = ptrToPtr(p)
} }
} }
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 { if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
@ -2994,9 +2996,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
if code.Flags&encoder.AnonymousHeadFlags == 0 { if code.Flags&encoder.AnonymousHeadFlags == 0 {
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
p += uintptr(code.Offset)
if (code.Flags & encoder.IsNilableTypeFlags) != 0 { if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalJSON { if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalJSON {
p = ptrToPtr(p + uintptr(code.Offset)) p = ptrToPtr(p)
} }
} }
iface := ptrToInterface(code, p) iface := ptrToInterface(code, p)
@ -3114,9 +3117,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
b = appendStructKey(ctx, code, b) b = appendStructKey(ctx, code, b)
p += uintptr(code.Offset)
if (code.Flags & encoder.IsNilableTypeFlags) != 0 { if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalText { if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalText {
p = ptrToPtr(p + uintptr(code.Offset)) p = ptrToPtr(p)
} }
} }
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 { if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
@ -3155,9 +3159,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
if code.Flags&encoder.AnonymousHeadFlags == 0 { if code.Flags&encoder.AnonymousHeadFlags == 0 {
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
p += uintptr(code.Offset)
if (code.Flags & encoder.IsNilableTypeFlags) != 0 { if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalText { if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalText {
p = ptrToPtr(p + uintptr(code.Offset)) p = ptrToPtr(p)
} }
} }
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 { if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {

View File

@ -705,14 +705,15 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
if code.Flags&encoder.AnonymousHeadFlags == 0 { if code.Flags&encoder.AnonymousHeadFlags == 0 {
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
u64 := ptrToUint64(p+uintptr(code.Offset), code.NumBitSize) p += uintptr(code.Offset)
u64 := ptrToUint64(p, code.NumBitSize)
v := u64 & ((1 << code.NumBitSize) - 1) v := u64 & ((1 << code.NumBitSize) - 1)
if v == 0 { if v == 0 {
code = code.NextField code = code.NextField
} else { } else {
b = appendStructKey(ctx, code, b) b = appendStructKey(ctx, code, b)
b = append(b, '"') b = append(b, '"')
b = appendInt(ctx, b, p+uintptr(code.Offset), code) b = appendInt(ctx, b, p, code)
b = append(b, '"') b = append(b, '"')
b = appendComma(ctx, b) b = appendComma(ctx, b)
code = code.Next code = code.Next
@ -2953,9 +2954,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
b = appendStructKey(ctx, code, b) b = appendStructKey(ctx, code, b)
p += uintptr(code.Offset)
if (code.Flags & encoder.IsNilableTypeFlags) != 0 { if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalJSON { if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalJSON {
p = ptrToPtr(p + uintptr(code.Offset)) p = ptrToPtr(p)
} }
} }
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 { if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
@ -2994,9 +2996,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
if code.Flags&encoder.AnonymousHeadFlags == 0 { if code.Flags&encoder.AnonymousHeadFlags == 0 {
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
p += uintptr(code.Offset)
if (code.Flags & encoder.IsNilableTypeFlags) != 0 { if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalJSON { if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalJSON {
p = ptrToPtr(p + uintptr(code.Offset)) p = ptrToPtr(p)
} }
} }
iface := ptrToInterface(code, p) iface := ptrToInterface(code, p)
@ -3114,9 +3117,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
b = appendStructKey(ctx, code, b) b = appendStructKey(ctx, code, b)
p += uintptr(code.Offset)
if (code.Flags & encoder.IsNilableTypeFlags) != 0 { if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalText { if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalText {
p = ptrToPtr(p + uintptr(code.Offset)) p = ptrToPtr(p)
} }
} }
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 { if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
@ -3155,9 +3159,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
if code.Flags&encoder.AnonymousHeadFlags == 0 { if code.Flags&encoder.AnonymousHeadFlags == 0 {
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
p += uintptr(code.Offset)
if (code.Flags & encoder.IsNilableTypeFlags) != 0 { if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalText { if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalText {
p = ptrToPtr(p + uintptr(code.Offset)) p = ptrToPtr(p)
} }
} }
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 { if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {

View File

@ -705,14 +705,15 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
if code.Flags&encoder.AnonymousHeadFlags == 0 { if code.Flags&encoder.AnonymousHeadFlags == 0 {
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
u64 := ptrToUint64(p+uintptr(code.Offset), code.NumBitSize) p += uintptr(code.Offset)
u64 := ptrToUint64(p, code.NumBitSize)
v := u64 & ((1 << code.NumBitSize) - 1) v := u64 & ((1 << code.NumBitSize) - 1)
if v == 0 { if v == 0 {
code = code.NextField code = code.NextField
} else { } else {
b = appendStructKey(ctx, code, b) b = appendStructKey(ctx, code, b)
b = append(b, '"') b = append(b, '"')
b = appendInt(ctx, b, p+uintptr(code.Offset), code) b = appendInt(ctx, b, p, code)
b = append(b, '"') b = append(b, '"')
b = appendComma(ctx, b) b = appendComma(ctx, b)
code = code.Next code = code.Next
@ -2953,9 +2954,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
b = appendStructKey(ctx, code, b) b = appendStructKey(ctx, code, b)
p += uintptr(code.Offset)
if (code.Flags & encoder.IsNilableTypeFlags) != 0 { if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalJSON { if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalJSON {
p = ptrToPtr(p + uintptr(code.Offset)) p = ptrToPtr(p)
} }
} }
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 { if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
@ -2994,9 +2996,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
if code.Flags&encoder.AnonymousHeadFlags == 0 { if code.Flags&encoder.AnonymousHeadFlags == 0 {
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
p += uintptr(code.Offset)
if (code.Flags & encoder.IsNilableTypeFlags) != 0 { if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalJSON { if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalJSON {
p = ptrToPtr(p + uintptr(code.Offset)) p = ptrToPtr(p)
} }
} }
iface := ptrToInterface(code, p) iface := ptrToInterface(code, p)
@ -3114,9 +3117,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
b = appendStructKey(ctx, code, b) b = appendStructKey(ctx, code, b)
p += uintptr(code.Offset)
if (code.Flags & encoder.IsNilableTypeFlags) != 0 { if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalText { if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalText {
p = ptrToPtr(p + uintptr(code.Offset)) p = ptrToPtr(p)
} }
} }
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 { if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
@ -3155,9 +3159,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
if code.Flags&encoder.AnonymousHeadFlags == 0 { if code.Flags&encoder.AnonymousHeadFlags == 0 {
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
p += uintptr(code.Offset)
if (code.Flags & encoder.IsNilableTypeFlags) != 0 { if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalText { if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalText {
p = ptrToPtr(p + uintptr(code.Offset)) p = ptrToPtr(p)
} }
} }
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 { if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {

View File

@ -705,14 +705,15 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
if code.Flags&encoder.AnonymousHeadFlags == 0 { if code.Flags&encoder.AnonymousHeadFlags == 0 {
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
u64 := ptrToUint64(p+uintptr(code.Offset), code.NumBitSize) p += uintptr(code.Offset)
u64 := ptrToUint64(p, code.NumBitSize)
v := u64 & ((1 << code.NumBitSize) - 1) v := u64 & ((1 << code.NumBitSize) - 1)
if v == 0 { if v == 0 {
code = code.NextField code = code.NextField
} else { } else {
b = appendStructKey(ctx, code, b) b = appendStructKey(ctx, code, b)
b = append(b, '"') b = append(b, '"')
b = appendInt(ctx, b, p+uintptr(code.Offset), code) b = appendInt(ctx, b, p, code)
b = append(b, '"') b = append(b, '"')
b = appendComma(ctx, b) b = appendComma(ctx, b)
code = code.Next code = code.Next
@ -2953,9 +2954,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
b = appendStructKey(ctx, code, b) b = appendStructKey(ctx, code, b)
p += uintptr(code.Offset)
if (code.Flags & encoder.IsNilableTypeFlags) != 0 { if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalJSON { if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalJSON {
p = ptrToPtr(p + uintptr(code.Offset)) p = ptrToPtr(p)
} }
} }
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 { if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
@ -2994,9 +2996,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
if code.Flags&encoder.AnonymousHeadFlags == 0 { if code.Flags&encoder.AnonymousHeadFlags == 0 {
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
p += uintptr(code.Offset)
if (code.Flags & encoder.IsNilableTypeFlags) != 0 { if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalJSON { if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalJSON {
p = ptrToPtr(p + uintptr(code.Offset)) p = ptrToPtr(p)
} }
} }
iface := ptrToInterface(code, p) iface := ptrToInterface(code, p)
@ -3114,9 +3117,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
b = appendStructKey(ctx, code, b) b = appendStructKey(ctx, code, b)
p += uintptr(code.Offset)
if (code.Flags & encoder.IsNilableTypeFlags) != 0 { if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalText { if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalText {
p = ptrToPtr(p + uintptr(code.Offset)) p = ptrToPtr(p)
} }
} }
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 { if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
@ -3155,9 +3159,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
if code.Flags&encoder.AnonymousHeadFlags == 0 { if code.Flags&encoder.AnonymousHeadFlags == 0 {
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
p += uintptr(code.Offset)
if (code.Flags & encoder.IsNilableTypeFlags) != 0 { if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalText { if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalText {
p = ptrToPtr(p + uintptr(code.Offset)) p = ptrToPtr(p)
} }
} }
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 { if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {

View File

@ -705,14 +705,15 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
if code.Flags&encoder.AnonymousHeadFlags == 0 { if code.Flags&encoder.AnonymousHeadFlags == 0 {
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
u64 := ptrToUint64(p+uintptr(code.Offset), code.NumBitSize) p += uintptr(code.Offset)
u64 := ptrToUint64(p, code.NumBitSize)
v := u64 & ((1 << code.NumBitSize) - 1) v := u64 & ((1 << code.NumBitSize) - 1)
if v == 0 { if v == 0 {
code = code.NextField code = code.NextField
} else { } else {
b = appendStructKey(ctx, code, b) b = appendStructKey(ctx, code, b)
b = append(b, '"') b = append(b, '"')
b = appendInt(ctx, b, p+uintptr(code.Offset), code) b = appendInt(ctx, b, p, code)
b = append(b, '"') b = append(b, '"')
b = appendComma(ctx, b) b = appendComma(ctx, b)
code = code.Next code = code.Next
@ -2953,9 +2954,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
b = appendStructKey(ctx, code, b) b = appendStructKey(ctx, code, b)
p += uintptr(code.Offset)
if (code.Flags & encoder.IsNilableTypeFlags) != 0 { if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalJSON { if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalJSON {
p = ptrToPtr(p + uintptr(code.Offset)) p = ptrToPtr(p)
} }
} }
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 { if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
@ -2994,9 +2996,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
if code.Flags&encoder.AnonymousHeadFlags == 0 { if code.Flags&encoder.AnonymousHeadFlags == 0 {
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
p += uintptr(code.Offset)
if (code.Flags & encoder.IsNilableTypeFlags) != 0 { if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalJSON { if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalJSON {
p = ptrToPtr(p + uintptr(code.Offset)) p = ptrToPtr(p)
} }
} }
iface := ptrToInterface(code, p) iface := ptrToInterface(code, p)
@ -3114,9 +3117,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
b = appendStructKey(ctx, code, b) b = appendStructKey(ctx, code, b)
p += uintptr(code.Offset)
if (code.Flags & encoder.IsNilableTypeFlags) != 0 { if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalText { if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadMarshalText {
p = ptrToPtr(p + uintptr(code.Offset)) p = ptrToPtr(p)
} }
} }
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 { if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {
@ -3155,9 +3159,10 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
if code.Flags&encoder.AnonymousHeadFlags == 0 { if code.Flags&encoder.AnonymousHeadFlags == 0 {
b = appendStructHead(ctx, b) b = appendStructHead(ctx, b)
} }
p += uintptr(code.Offset)
if (code.Flags & encoder.IsNilableTypeFlags) != 0 { if (code.Flags & encoder.IsNilableTypeFlags) != 0 {
if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalText { if (code.Flags&encoder.IndirectFlags) != 0 || code.Op == encoder.OpStructPtrHeadOmitEmptyMarshalText {
p = ptrToPtr(p + uintptr(code.Offset)) p = ptrToPtr(p)
} }
} }
if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 { if p == 0 && (code.Flags&encoder.NilCheckFlags) != 0 {