forked from mirror/go-json
Fix detection of indirect field
This commit is contained in:
parent
7d4316b94a
commit
f3aded9b12
|
@ -32,6 +32,18 @@ func TestCoverString(t *testing.T) {
|
|||
name string
|
||||
data interface{}
|
||||
}{
|
||||
{
|
||||
name: "PtrHeadStringComplicated",
|
||||
data: &struct {
|
||||
X *struct {
|
||||
A string
|
||||
B []string
|
||||
}
|
||||
}{X: &struct {
|
||||
A string
|
||||
B []string
|
||||
}{A: "hello", B: []string{"a", "b"}}},
|
||||
},
|
||||
{
|
||||
name: "String",
|
||||
data: string("a"),
|
||||
|
|
|
@ -1399,7 +1399,15 @@ func compileStruct(ctx *compileContext, isPtr bool) (*Opcode, error) {
|
|||
valueCode.Indirect = indirect
|
||||
}
|
||||
} else {
|
||||
valueCode.Indirect = indirect
|
||||
if indirect {
|
||||
// if parent is indirect type, set child indirect property to true
|
||||
valueCode.Indirect = indirect
|
||||
} else {
|
||||
// if parent is not indirect type and child have only one field, set child indirect property to false
|
||||
if i == 0 && valueCode.NextField != nil && valueCode.NextField.Op == OpStructEnd {
|
||||
valueCode.Indirect = indirect
|
||||
}
|
||||
}
|
||||
}
|
||||
key := fmt.Sprintf(`"%s":`, tag.Key)
|
||||
escapedKey := fmt.Sprintf(`%s:`, string(AppendEscapedString([]byte{}, tag.Key)))
|
||||
|
|
Loading…
Reference in New Issue