2
0
Fork 0
mirror of https://github.com/ii64/sonic.git synced 2026-06-20 16:45:22 +08:00

fix: unmarshal recursive pointer type (#400)

This commit is contained in:
liu 2023-04-13 15:06:13 +08:00 committed by GitHub
parent 7e82ad0a45
commit 869fa1b2b9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 10 deletions

View file

@ -698,17 +698,16 @@ func (self *_Compiler) compilePtr(p *_Program, sp int, et reflect.Type) {
ok := self.tab[et]
if ok {
p.rtt(_OP_recurse, et)
return
} else {
/* enter the recursion */
p.add(_OP_lspace)
self.tab[et] = true
/* not inline the pointer type
* recursing the defined pointer type's elem will casue issue379.
*/
self.compileOps(p, sp, et)
}
/* enter the recursion */
p.add(_OP_lspace)
self.tab[et] = true
/* not inline the pointer type
* recursing the defined pointer type's elem will casue issue379.
*/
self.compileOps(p, sp, et)
delete(self.tab, et)
j := p.pc()

View file

@ -112,3 +112,22 @@ func TestDirectStructType(t *testing.T) {
require.Equal(t, jerr, serr)
}
}
type recurePtr struct {
Name string
Recur *recurePtr
}
func TestRecursiveIssue(t *testing.T) {
data := `{
"Name": "",
"Recur": null
}`
jv, sv := recurePtr{}, recurePtr{}
jerr := json.Unmarshal([]byte(data), &jv)
serr := sonic.Unmarshal([]byte(data), &sv)
require.Equal(t, jv, sv)
require.Equal(t, jerr, serr)
}