mirror of
https://github.com/ii64/sonic.git
synced 2026-06-22 17:36:48 +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]
|
ok := self.tab[et]
|
||||||
if ok {
|
if ok {
|
||||||
p.rtt(_OP_recurse, et)
|
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)
|
delete(self.tab, et)
|
||||||
|
|
||||||
j := p.pc()
|
j := p.pc()
|
||||||
|
|
|
||||||
|
|
@ -112,3 +112,22 @@ func TestDirectStructType(t *testing.T) {
|
||||||
require.Equal(t, jerr, serr)
|
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