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:
parent
7e82ad0a45
commit
869fa1b2b9
2 changed files with 28 additions and 10 deletions
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue