diff --git a/decoder/compiler.go b/decoder/compiler.go index bacd5f9..b616433 100644 --- a/decoder/compiler.go +++ b/decoder/compiler.go @@ -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() diff --git a/issue_test/issue390_test.go b/issue_test/issue390_test.go index e4f0b25..ee42fdc 100644 --- a/issue_test/issue390_test.go +++ b/issue_test/issue390_test.go @@ -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) +} +