Fix opcode for end of omitempty int type

This commit is contained in:
Masaaki Goshima 2021-01-13 00:14:46 +09:00
parent 8ab0aa7168
commit fd1085102c
5 changed files with 541 additions and 87 deletions

View File

@ -377,6 +377,33 @@ null
B int `json:"b"` B int `json:"b"`
}{}, }{},
}, },
{
name: "HeadIntZeroMultiFieldsOmitEmpty",
expected: `{}`,
indentExpected: `
{}
`,
data: struct {
A int `json:"a,omitempty"`
B int `json:"b,omitempty"`
}{},
},
{
name: "HeadIntZeroMultiFields",
expected: `{"a":"0","b":"0"}`,
indentExpected: `
{
"a": "0",
"b": "0"
}
`,
data: struct {
A int `json:"a,string"`
B int `json:"b,string"`
}{},
},
// HeadIntMultiFields
{ {
name: "HeadIntMultiFields", name: "HeadIntMultiFields",
expected: `{"a":1,"b":2}`, expected: `{"a":1,"b":2}`,
@ -391,6 +418,36 @@ null
B int `json:"b"` B int `json:"b"`
}{A: 1, B: 2}, }{A: 1, B: 2},
}, },
{
name: "HeadIntMultiFieldsOmitEmpty",
expected: `{"a":1,"b":2}`,
indentExpected: `
{
"a": 1,
"b": 2
}
`,
data: struct {
A int `json:"a,omitempty"`
B int `json:"b,omitempty"`
}{A: 1, B: 2},
},
{
name: "HeadIntMultiFieldsString",
expected: `{"a":"1","b":"2"}`,
indentExpected: `
{
"a": "1",
"b": "2"
}
`,
data: struct {
A int `json:"a,string"`
B int `json:"b,string"`
}{A: 1, B: 2},
},
// HeadIntPtrMultiFields
{ {
name: "HeadIntPtrMultiFields", name: "HeadIntPtrMultiFields",
expected: `{"a":1,"b":2}`, expected: `{"a":1,"b":2}`,
@ -405,6 +462,36 @@ null
B *int `json:"b"` B *int `json:"b"`
}{A: intptr(1), B: intptr(2)}, }{A: intptr(1), B: intptr(2)},
}, },
{
name: "HeadIntPtrMultiFieldsOmitEmpty",
expected: `{"a":1,"b":2}`,
indentExpected: `
{
"a": 1,
"b": 2
}
`,
data: struct {
A *int `json:"a,omitempty"`
B *int `json:"b,omitempty"`
}{A: intptr(1), B: intptr(2)},
},
{
name: "HeadIntPtrMultiFieldsString",
expected: `{"a":"1","b":"2"}`,
indentExpected: `
{
"a": "1",
"b": "2"
}
`,
data: struct {
A *int `json:"a,string"`
B *int `json:"b,string"`
}{A: intptr(1), B: intptr(2)},
},
// HeadIntPtrNilMultiFields
{ {
name: "HeadIntPtrNilMultiFields", name: "HeadIntPtrNilMultiFields",
expected: `{"a":null,"b":null}`, expected: `{"a":null,"b":null}`,
@ -419,6 +506,33 @@ null
B *int `json:"b"` B *int `json:"b"`
}{A: nil, B: nil}, }{A: nil, B: nil},
}, },
{
name: "HeadIntPtrNilMultiFieldsOmitEmpty",
expected: `{}`,
indentExpected: `
{}
`,
data: struct {
A *int `json:"a,omitempty"`
B *int `json:"b,omitempty"`
}{A: nil, B: nil},
},
{
name: "HeadIntPtrNilMultiFieldsString",
expected: `{"a":"","b":""}`,
indentExpected: `
{
"a": "",
"b": ""
}
`,
data: struct {
A *int `json:"a,string"`
B *int `json:"b,string"`
}{A: nil, B: nil},
},
// PtrHeadIntZeroMultiFields
{ {
name: "PtrHeadIntZeroMultiFields", name: "PtrHeadIntZeroMultiFields",
expected: `{"a":0,"b":0}`, expected: `{"a":0,"b":0}`,
@ -433,6 +547,33 @@ null
B int `json:"b"` B int `json:"b"`
}{}, }{},
}, },
{
name: "PtrHeadIntZeroMultiFieldsOmitEmpty",
expected: `{}`,
indentExpected: `
{}
`,
data: &struct {
A int `json:"a,omitempty"`
B int `json:"b,omitempty"`
}{},
},
{
name: "PtrHeadIntZeroMultiFieldsString",
expected: `{"a":"0","b":"0"}`,
indentExpected: `
{
"a": "0",
"b": "0"
}
`,
data: &struct {
A int `json:"a,string"`
B int `json:"b,string"`
}{},
},
// PtrHeadIntMultiFields
{ {
name: "PtrHeadIntMultiFields", name: "PtrHeadIntMultiFields",
expected: `{"a":1,"b":2}`, expected: `{"a":1,"b":2}`,
@ -447,6 +588,36 @@ null
B int `json:"b"` B int `json:"b"`
}{A: 1, B: 2}, }{A: 1, B: 2},
}, },
{
name: "PtrHeadIntMultiFieldsOmitEmpty",
expected: `{"a":1,"b":2}`,
indentExpected: `
{
"a": 1,
"b": 2
}
`,
data: &struct {
A int `json:"a,omitempty"`
B int `json:"b,omitempty"`
}{A: 1, B: 2},
},
{
name: "PtrHeadIntMultiFieldsString",
expected: `{"a":"1","b":"2"}`,
indentExpected: `
{
"a": "1",
"b": "2"
}
`,
data: &struct {
A int `json:"a,string"`
B int `json:"b,string"`
}{A: 1, B: 2},
},
// PtrHeadIntPtrMultiFields
{ {
name: "PtrHeadIntPtrMultiFields", name: "PtrHeadIntPtrMultiFields",
expected: `{"a":1,"b":2}`, expected: `{"a":1,"b":2}`,
@ -461,6 +632,36 @@ null
B *int `json:"b"` B *int `json:"b"`
}{A: intptr(1), B: intptr(2)}, }{A: intptr(1), B: intptr(2)},
}, },
{
name: "PtrHeadIntPtrMultiFieldsOmitEmpty",
expected: `{"a":1,"b":2}`,
indentExpected: `
{
"a": 1,
"b": 2
}
`,
data: &struct {
A *int `json:"a,omitempty"`
B *int `json:"b,omitempty"`
}{A: intptr(1), B: intptr(2)},
},
{
name: "PtrHeadIntPtrMultiFieldsString",
expected: `{"a":"1","b":"2"}`,
indentExpected: `
{
"a": "1",
"b": "2"
}
`,
data: &struct {
A *int `json:"a,string"`
B *int `json:"b,string"`
}{A: intptr(1), B: intptr(2)},
},
// PtrHeadIntPtrNilMultiFields
{ {
name: "PtrHeadIntPtrNilMultiFields", name: "PtrHeadIntPtrNilMultiFields",
expected: `{"a":null,"b":null}`, expected: `{"a":null,"b":null}`,
@ -475,6 +676,33 @@ null
B *int `json:"b"` B *int `json:"b"`
}{A: nil, B: nil}, }{A: nil, B: nil},
}, },
{
name: "PtrHeadIntPtrNilMultiFieldsOmitEmpty",
expected: `{}`,
indentExpected: `
{}
`,
data: &struct {
A *int `json:"a,omitempty"`
B *int `json:"b,omitempty"`
}{A: nil, B: nil},
},
{
name: "PtrHeadIntPtrNilMultiFieldsString",
expected: `{"a":"","b":""}`,
indentExpected: `
{
"a": "",
"b": ""
}
`,
data: &struct {
A *int `json:"a,string"`
B *int `json:"b,string"`
}{A: nil, B: nil},
},
// PtrHeadIntNilMultiFields
{ {
name: "PtrHeadIntNilMultiFields", name: "PtrHeadIntNilMultiFields",
expected: `null`, expected: `null`,
@ -486,6 +714,30 @@ null
B *int `json:"b"` B *int `json:"b"`
})(nil), })(nil),
}, },
{
name: "PtrHeadIntNilMultiFieldsOmitEmpty",
expected: `null`,
indentExpected: `
null
`,
data: (*struct {
A *int `json:"a,omitempty"`
B *int `json:"b,omitempty"`
})(nil),
},
{
name: "PtrHeadIntNilMultiFieldsString",
expected: `null`,
indentExpected: `
null
`,
data: (*struct {
A *int `json:"a,string"`
B *int `json:"b,string"`
})(nil),
},
// HeadIntZeroNotRoot
{ {
name: "HeadIntZeroNotRoot", name: "HeadIntZeroNotRoot",
expected: `{"A":{"a":0}}`, expected: `{"A":{"a":0}}`,
@ -502,6 +754,38 @@ null
} }
}{}, }{},
}, },
{
name: "HeadIntZeroNotRootOmitEmpty",
expected: `{"A":{}}`,
indentExpected: `
{
"A": {}
}
`,
data: struct {
A struct {
A int `json:"a,omitempty"`
}
}{},
},
{
name: "HeadIntZeroNotRootString",
expected: `{"A":{"a":"0"}}`,
indentExpected: `
{
"A": {
"a": "0"
}
}
`,
data: struct {
A struct {
A int `json:"a,string"`
}
}{},
},
// HeadIntNotRoot
{ {
name: "HeadIntNotRoot", name: "HeadIntNotRoot",
expected: `{"A":{"a":1}}`, expected: `{"A":{"a":1}}`,
@ -520,6 +804,44 @@ null
A int `json:"a"` A int `json:"a"`
}{A: 1}}, }{A: 1}},
}, },
{
name: "HeadIntNotRootOmitEmpty",
expected: `{"A":{"a":1}}`,
indentExpected: `
{
"A": {
"a": 1
}
}
`,
data: struct {
A struct {
A int `json:"a,omitempty"`
}
}{A: struct {
A int `json:"a,omitempty"`
}{A: 1}},
},
{
name: "HeadIntNotRootString",
expected: `{"A":{"a":"1"}}`,
indentExpected: `
{
"A": {
"a": "1"
}
}
`,
data: struct {
A struct {
A int `json:"a,string"`
}
}{A: struct {
A int `json:"a,string"`
}{A: 1}},
},
// HeadIntPtrNotRoot
{ {
name: "HeadIntPtrNotRoot", name: "HeadIntPtrNotRoot",
expected: `{"A":{"a":1}}`, expected: `{"A":{"a":1}}`,

View File

@ -5127,6 +5127,29 @@ func (e *Encoder) run(ctx *encodeRuntimeContext, b []byte, code *opcode) ([]byte
code = code.next code = code.next
case opStructAnonymousEnd: case opStructAnonymousEnd:
code = code.next code = code.next
case opStructEndInt:
ptr := load(ctxptr, code.headIdx)
b = append(b, code.key...)
b = appendInt(b, int64(e.ptrToInt(ptr+code.offset)))
b = appendStructEnd(b)
code = code.next
case opStructEndOmitEmptyInt:
ptr := load(ctxptr, code.headIdx)
v := e.ptrToInt(ptr + code.offset)
if v != 0 {
b = append(b, code.key...)
b = appendInt(b, int64(v))
}
b = appendStructEnd(b)
code = code.next
case opStructEndStringTagInt:
ptr := load(ctxptr, code.headIdx)
b = append(b, code.key...)
b = append(b, '"')
b = appendInt(b, int64(e.ptrToInt(ptr+code.offset)))
b = append(b, '"')
b = appendStructEnd(b)
code = code.next
case opStructEndIntPtr: case opStructEndIntPtr:
b = append(b, code.key...) b = append(b, code.key...)
ptr := load(ctxptr, code.headIdx) ptr := load(ctxptr, code.headIdx)
@ -5138,6 +5161,28 @@ func (e *Encoder) run(ctx *encodeRuntimeContext, b []byte, code *opcode) ([]byte
} }
b = appendStructEnd(b) b = appendStructEnd(b)
code = code.next code = code.next
case opStructEndOmitEmptyIntPtr:
ptr := load(ctxptr, code.headIdx)
p := e.ptrToPtr(ptr + code.offset)
if p != 0 {
b = append(b, code.key...)
b = appendInt(b, int64(e.ptrToInt(p)))
}
b = appendStructEnd(b)
code = code.next
case opStructEndStringTagIntPtr:
b = append(b, code.key...)
ptr := load(ctxptr, code.headIdx)
p := e.ptrToPtr(ptr + code.offset)
if p == 0 {
b = append(b, `""`...)
} else {
b = append(b, '"')
b = appendInt(b, int64(e.ptrToInt(p)))
b = append(b, '"')
}
b = appendStructEnd(b)
code = code.next
case opStructEndIntNPtr: case opStructEndIntNPtr:
b = append(b, code.key...) b = append(b, code.key...)
ptr := load(ctxptr, code.headIdx) ptr := load(ctxptr, code.headIdx)
@ -5155,12 +5200,6 @@ func (e *Encoder) run(ctx *encodeRuntimeContext, b []byte, code *opcode) ([]byte
} }
b = appendStructEnd(b) b = appendStructEnd(b)
code = code.next code = code.next
case opStructEndInt:
ptr := load(ctxptr, code.headIdx)
b = append(b, code.key...)
b = appendInt(b, int64(e.ptrToInt(ptr+code.offset)))
b = appendStructEnd(b)
code = code.next
case opStructEndInt8Ptr: case opStructEndInt8Ptr:
b = append(b, code.key...) b = append(b, code.key...)
ptr := load(ctxptr, code.headIdx) ptr := load(ctxptr, code.headIdx)
@ -5426,15 +5465,6 @@ func (e *Encoder) run(ctx *encodeRuntimeContext, b []byte, code *opcode) ([]byte
b = encodeNoEscapedString(b, *(*string)(unsafe.Pointer(&bytes))) b = encodeNoEscapedString(b, *(*string)(unsafe.Pointer(&bytes)))
b = appendStructEnd(b) b = appendStructEnd(b)
code = code.next code = code.next
case opStructEndOmitEmptyInt:
ptr := load(ctxptr, code.headIdx)
v := e.ptrToInt(ptr + code.offset)
if v != 0 {
b = append(b, code.key...)
b = appendInt(b, int64(v))
}
b = appendStructEnd(b)
code = code.next
case opStructEndOmitEmptyInt8: case opStructEndOmitEmptyInt8:
ptr := load(ctxptr, code.headIdx) ptr := load(ctxptr, code.headIdx)
v := e.ptrToInt8(ptr + code.offset) v := e.ptrToInt8(ptr + code.offset)
@ -5596,14 +5626,6 @@ func (e *Encoder) run(ctx *encodeRuntimeContext, b []byte, code *opcode) ([]byte
} }
b = appendStructEnd(b) b = appendStructEnd(b)
code = code.next code = code.next
case opStructEndStringTagInt:
ptr := load(ctxptr, code.headIdx)
b = append(b, code.key...)
b = append(b, '"')
b = appendInt(b, int64(e.ptrToInt(ptr+code.offset)))
b = append(b, '"')
b = appendStructEnd(b)
code = code.next
case opStructEndStringTagInt8: case opStructEndStringTagInt8:
ptr := load(ctxptr, code.headIdx) ptr := load(ctxptr, code.headIdx)
b = append(b, code.key...) b = append(b, code.key...)

View File

@ -5155,6 +5155,29 @@ func (e *Encoder) runEscaped(ctx *encodeRuntimeContext, b []byte, code *opcode)
code = code.next code = code.next
case opStructAnonymousEnd: case opStructAnonymousEnd:
code = code.next code = code.next
case opStructEndInt:
ptr := load(ctxptr, code.headIdx)
b = append(b, code.escapedKey...)
b = appendInt(b, int64(e.ptrToInt(ptr+code.offset)))
b = appendStructEnd(b)
code = code.next
case opStructEndOmitEmptyInt:
ptr := load(ctxptr, code.headIdx)
v := e.ptrToInt(ptr + code.offset)
if v != 0 {
b = append(b, code.escapedKey...)
b = appendInt(b, int64(v))
}
b = appendStructEnd(b)
code = code.next
case opStructEndStringTagInt:
ptr := load(ctxptr, code.headIdx)
b = append(b, code.escapedKey...)
b = append(b, '"')
b = appendInt(b, int64(e.ptrToInt(ptr+code.offset)))
b = append(b, '"')
b = appendStructEnd(b)
code = code.next
case opStructEndIntPtr: case opStructEndIntPtr:
b = append(b, code.escapedKey...) b = append(b, code.escapedKey...)
ptr := load(ctxptr, code.headIdx) ptr := load(ctxptr, code.headIdx)
@ -5166,6 +5189,28 @@ func (e *Encoder) runEscaped(ctx *encodeRuntimeContext, b []byte, code *opcode)
} }
b = appendStructEnd(b) b = appendStructEnd(b)
code = code.next code = code.next
case opStructEndOmitEmptyIntPtr:
ptr := load(ctxptr, code.headIdx)
p := e.ptrToPtr(ptr + code.offset)
if p != 0 {
b = append(b, code.escapedKey...)
b = appendInt(b, int64(e.ptrToInt(p)))
}
b = appendStructEnd(b)
code = code.next
case opStructEndStringTagIntPtr:
b = append(b, code.escapedKey...)
ptr := load(ctxptr, code.headIdx)
p := e.ptrToPtr(ptr + code.offset)
if p == 0 {
b = append(b, `""`...)
} else {
b = append(b, '"')
b = appendInt(b, int64(e.ptrToInt(p)))
b = append(b, '"')
}
b = appendStructEnd(b)
code = code.next
case opStructEndIntNPtr: case opStructEndIntNPtr:
b = append(b, code.escapedKey...) b = append(b, code.escapedKey...)
ptr := load(ctxptr, code.headIdx) ptr := load(ctxptr, code.headIdx)
@ -5183,12 +5228,6 @@ func (e *Encoder) runEscaped(ctx *encodeRuntimeContext, b []byte, code *opcode)
} }
b = appendStructEnd(b) b = appendStructEnd(b)
code = code.next code = code.next
case opStructEndInt:
ptr := load(ctxptr, code.headIdx)
b = append(b, code.escapedKey...)
b = appendInt(b, int64(e.ptrToInt(ptr+code.offset)))
b = appendStructEnd(b)
code = code.next
case opStructEndInt8Ptr: case opStructEndInt8Ptr:
b = append(b, code.escapedKey...) b = append(b, code.escapedKey...)
ptr := load(ctxptr, code.headIdx) ptr := load(ctxptr, code.headIdx)
@ -5454,15 +5493,6 @@ func (e *Encoder) runEscaped(ctx *encodeRuntimeContext, b []byte, code *opcode)
b = encodeEscapedString(b, *(*string)(unsafe.Pointer(&bytes))) b = encodeEscapedString(b, *(*string)(unsafe.Pointer(&bytes)))
b = appendStructEnd(b) b = appendStructEnd(b)
code = code.next code = code.next
case opStructEndOmitEmptyInt:
ptr := load(ctxptr, code.headIdx)
v := e.ptrToInt(ptr + code.offset)
if v != 0 {
b = append(b, code.escapedKey...)
b = appendInt(b, int64(v))
}
b = appendStructEnd(b)
code = code.next
case opStructEndOmitEmptyInt8: case opStructEndOmitEmptyInt8:
ptr := load(ctxptr, code.headIdx) ptr := load(ctxptr, code.headIdx)
v := e.ptrToInt8(ptr + code.offset) v := e.ptrToInt8(ptr + code.offset)
@ -5624,14 +5654,6 @@ func (e *Encoder) runEscaped(ctx *encodeRuntimeContext, b []byte, code *opcode)
} }
b = appendStructEnd(b) b = appendStructEnd(b)
code = code.next code = code.next
case opStructEndStringTagInt:
ptr := load(ctxptr, code.headIdx)
b = append(b, code.escapedKey...)
b = append(b, '"')
b = appendInt(b, int64(e.ptrToInt(ptr+code.offset)))
b = append(b, '"')
b = appendStructEnd(b)
code = code.next
case opStructEndStringTagInt8: case opStructEndStringTagInt8:
ptr := load(ctxptr, code.headIdx) ptr := load(ctxptr, code.headIdx)
b = append(b, code.escapedKey...) b = append(b, code.escapedKey...)

View File

@ -4321,6 +4321,35 @@ func (e *Encoder) runEscapedIndent(ctx *encodeRuntimeContext, b []byte, code *op
b = appendInt(b, int64(e.ptrToInt(ptr+code.offset))) b = appendInt(b, int64(e.ptrToInt(ptr+code.offset)))
b = e.appendStructEndIndent(b, code.indent-1) b = e.appendStructEndIndent(b, code.indent-1)
code = code.next code = code.next
case opStructEndOmitEmptyInt:
ptr := load(ctxptr, code.headIdx)
v := e.ptrToInt(ptr + code.offset)
if v != 0 {
b = e.encodeIndent(b, code.indent)
b = append(b, code.escapedKey...)
b = append(b, ' ')
b = appendInt(b, int64(v))
b = e.appendStructEndIndent(b, code.indent-1)
} else {
last := len(b) - 1
if b[last-1] == '{' {
// doesn't exist any fields
b[last] = '}'
} else {
b = append(b, '}')
}
b = encodeIndentComma(b)
}
code = code.next
case opStructEndStringTagInt:
ptr := load(ctxptr, code.headIdx)
b = e.encodeIndent(b, code.indent)
b = append(b, code.escapedKey...)
b = append(b, ' ', '"')
b = appendInt(b, int64(e.ptrToInt(ptr+code.offset)))
b = append(b, '"')
b = e.appendStructEndIndent(b, code.indent-1)
code = code.next
case opStructEndIntPtr: case opStructEndIntPtr:
b = e.encodeIndent(b, code.indent) b = e.encodeIndent(b, code.indent)
b = append(b, code.escapedKey...) b = append(b, code.escapedKey...)
@ -4334,6 +4363,41 @@ func (e *Encoder) runEscapedIndent(ctx *encodeRuntimeContext, b []byte, code *op
} }
b = e.appendStructEndIndent(b, code.indent-1) b = e.appendStructEndIndent(b, code.indent-1)
code = code.next code = code.next
case opStructEndOmitEmptyIntPtr:
ptr := load(ctxptr, code.headIdx)
p := e.ptrToPtr(ptr + code.offset)
if p != 0 {
b = e.encodeIndent(b, code.indent)
b = append(b, code.escapedKey...)
b = append(b, ' ')
b = appendInt(b, int64(e.ptrToInt(p)))
b = e.appendStructEndIndent(b, code.indent-1)
} else {
last := len(b) - 1
if b[last-1] == '{' {
// doesn't exist any fields
b[last] = '}'
} else {
b = append(b, '}')
}
b = encodeIndentComma(b)
}
code = code.next
case opStructEndStringTagIntPtr:
b = e.encodeIndent(b, code.indent)
b = append(b, code.escapedKey...)
b = append(b, ' ')
ptr := load(ctxptr, code.headIdx)
p := e.ptrToPtr(ptr + code.offset)
if p == 0 {
b = append(b, `""`...)
} else {
b = append(b, '"')
b = appendInt(b, int64(e.ptrToInt(p)))
b = append(b, '"')
}
b = e.appendStructEndIndent(b, code.indent-1)
code = code.next
case opStructEndInt8: case opStructEndInt8:
b = e.encodeIndent(b, code.indent) b = e.encodeIndent(b, code.indent)
b = append(b, code.escapedKey...) b = append(b, code.escapedKey...)
@ -4615,17 +4679,6 @@ func (e *Encoder) runEscapedIndent(ctx *encodeRuntimeContext, b []byte, code *op
b = append(b, buf.Bytes()...) b = append(b, buf.Bytes()...)
b = e.appendStructEndIndent(b, code.indent-1) b = e.appendStructEndIndent(b, code.indent-1)
code = code.next code = code.next
case opStructEndOmitEmptyInt:
ptr := load(ctxptr, code.headIdx)
v := e.ptrToInt(ptr + code.offset)
if v != 0 {
b = e.encodeIndent(b, code.indent)
b = append(b, code.escapedKey...)
b = append(b, ' ')
b = appendInt(b, int64(v))
}
b = e.appendStructEndIndent(b, code.indent-1)
code = code.next
case opStructEndOmitEmptyInt8: case opStructEndOmitEmptyInt8:
ptr := load(ctxptr, code.headIdx) ptr := load(ctxptr, code.headIdx)
v := e.ptrToInt8(ptr + code.offset) v := e.ptrToInt8(ptr + code.offset)
@ -4783,15 +4836,6 @@ func (e *Encoder) runEscapedIndent(ctx *encodeRuntimeContext, b []byte, code *op
} }
b = e.appendStructEndIndent(b, code.indent-1) b = e.appendStructEndIndent(b, code.indent-1)
code = code.next code = code.next
case opStructEndStringTagInt:
ptr := load(ctxptr, code.headIdx)
b = e.encodeIndent(b, code.indent)
b = append(b, code.escapedKey...)
b = append(b, ' ', '"')
b = appendInt(b, int64(e.ptrToInt(ptr+code.offset)))
b = append(b, '"')
b = e.appendStructEndIndent(b, code.indent-1)
code = code.next
case opStructEndStringTagInt8: case opStructEndStringTagInt8:
ptr := load(ctxptr, code.headIdx) ptr := load(ctxptr, code.headIdx)
b = e.encodeIndent(b, code.indent) b = e.encodeIndent(b, code.indent)

View File

@ -756,7 +756,7 @@ func (e *Encoder) runIndent(ctx *encodeRuntimeContext, b []byte, code *opcode) (
p := load(ctxptr, code.idx) p := load(ctxptr, code.idx)
if p == 0 { if p == 0 {
b = encodeNull(b) b = encodeNull(b)
b = encodeComma(b) b = encodeIndentComma(b)
code = code.end.next code = code.end.next
} else { } else {
b = append(b, '{', '\n') b = append(b, '{', '\n')
@ -4321,6 +4321,35 @@ func (e *Encoder) runIndent(ctx *encodeRuntimeContext, b []byte, code *opcode) (
b = appendInt(b, int64(e.ptrToInt(ptr+code.offset))) b = appendInt(b, int64(e.ptrToInt(ptr+code.offset)))
b = e.appendStructEndIndent(b, code.indent-1) b = e.appendStructEndIndent(b, code.indent-1)
code = code.next code = code.next
case opStructEndOmitEmptyInt:
ptr := load(ctxptr, code.headIdx)
v := e.ptrToInt(ptr + code.offset)
if v != 0 {
b = e.encodeIndent(b, code.indent)
b = append(b, code.key...)
b = append(b, ' ')
b = appendInt(b, int64(v))
b = e.appendStructEndIndent(b, code.indent-1)
} else {
last := len(b) - 1
if b[last-1] == '{' {
// doesn't exist any fields
b[last] = '}'
} else {
b = append(b, '}')
}
b = encodeIndentComma(b)
}
code = code.next
case opStructEndStringTagInt:
ptr := load(ctxptr, code.headIdx)
b = e.encodeIndent(b, code.indent)
b = append(b, code.key...)
b = append(b, ' ', '"')
b = appendInt(b, int64(e.ptrToInt(ptr+code.offset)))
b = append(b, '"')
b = e.appendStructEndIndent(b, code.indent-1)
code = code.next
case opStructEndIntPtr: case opStructEndIntPtr:
b = e.encodeIndent(b, code.indent) b = e.encodeIndent(b, code.indent)
b = append(b, code.key...) b = append(b, code.key...)
@ -4334,6 +4363,41 @@ func (e *Encoder) runIndent(ctx *encodeRuntimeContext, b []byte, code *opcode) (
} }
b = e.appendStructEndIndent(b, code.indent-1) b = e.appendStructEndIndent(b, code.indent-1)
code = code.next code = code.next
case opStructEndOmitEmptyIntPtr:
ptr := load(ctxptr, code.headIdx)
p := e.ptrToPtr(ptr + code.offset)
if p != 0 {
b = e.encodeIndent(b, code.indent)
b = append(b, code.key...)
b = append(b, ' ')
b = appendInt(b, int64(e.ptrToInt(p)))
b = e.appendStructEndIndent(b, code.indent-1)
} else {
last := len(b) - 1
if b[last-1] == '{' {
// doesn't exist any fields
b[last] = '}'
} else {
b = append(b, '}')
}
b = encodeIndentComma(b)
}
code = code.next
case opStructEndStringTagIntPtr:
b = e.encodeIndent(b, code.indent)
b = append(b, code.key...)
b = append(b, ' ')
ptr := load(ctxptr, code.headIdx)
p := e.ptrToPtr(ptr + code.offset)
if p == 0 {
b = append(b, `""`...)
} else {
b = append(b, '"')
b = appendInt(b, int64(e.ptrToInt(p)))
b = append(b, '"')
}
b = e.appendStructEndIndent(b, code.indent-1)
code = code.next
case opStructEndInt8: case opStructEndInt8:
b = e.encodeIndent(b, code.indent) b = e.encodeIndent(b, code.indent)
b = append(b, code.key...) b = append(b, code.key...)
@ -4615,17 +4679,6 @@ func (e *Encoder) runIndent(ctx *encodeRuntimeContext, b []byte, code *opcode) (
b = append(b, buf.Bytes()...) b = append(b, buf.Bytes()...)
b = e.appendStructEndIndent(b, code.indent-1) b = e.appendStructEndIndent(b, code.indent-1)
code = code.next code = code.next
case opStructEndOmitEmptyInt:
ptr := load(ctxptr, code.headIdx)
v := e.ptrToInt(ptr + code.offset)
if v != 0 {
b = e.encodeIndent(b, code.indent)
b = append(b, code.key...)
b = append(b, ' ')
b = appendInt(b, int64(v))
}
b = e.appendStructEndIndent(b, code.indent-1)
code = code.next
case opStructEndOmitEmptyInt8: case opStructEndOmitEmptyInt8:
ptr := load(ctxptr, code.headIdx) ptr := load(ctxptr, code.headIdx)
v := e.ptrToInt8(ptr + code.offset) v := e.ptrToInt8(ptr + code.offset)
@ -4783,15 +4836,6 @@ func (e *Encoder) runIndent(ctx *encodeRuntimeContext, b []byte, code *opcode) (
} }
b = e.appendStructEndIndent(b, code.indent-1) b = e.appendStructEndIndent(b, code.indent-1)
code = code.next code = code.next
case opStructEndStringTagInt:
ptr := load(ctxptr, code.headIdx)
b = e.encodeIndent(b, code.indent)
b = append(b, code.key...)
b = append(b, ' ', '"')
b = appendInt(b, int64(e.ptrToInt(ptr+code.offset)))
b = append(b, '"')
b = e.appendStructEndIndent(b, code.indent-1)
code = code.next
case opStructEndStringTagInt8: case opStructEndStringTagInt8:
ptr := load(ctxptr, code.headIdx) ptr := load(ctxptr, code.headIdx)
b = e.encodeIndent(b, code.indent) b = e.encodeIndent(b, code.indent)