From 3e6f839fb662aae4ce8d40f666be873d59ee2e33 Mon Sep 17 00:00:00 2001 From: linuxsong Date: Tue, 18 Oct 2022 10:59:51 +0800 Subject: [PATCH] fix iterator traversal empty object panic (#314) --- ast/iterator.go | 6 +++++- ast/iterator_test.go | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/ast/iterator.go b/ast/iterator.go index d43ef4e..03a25b4 100644 --- a/ast/iterator.go +++ b/ast/iterator.go @@ -63,7 +63,11 @@ func (self *Iterator) HasNext() bool { } else if self.p.t == _V_ARRAY_LAZY { return self.p.skipNextNode().Valid() } else if self.p.t == _V_OBJECT_LAZY { - return self.p.skipNextPair().Value.Valid() + pair := self.p.skipNextPair() + if pair == nil { + return false + } + return pair.Value.Valid() } return false } diff --git a/ast/iterator_test.go b/ast/iterator_test.go index c65095c..ccd269b 100644 --- a/ast/iterator_test.go +++ b/ast/iterator_test.go @@ -195,6 +195,16 @@ func TestIterator(t *testing.T) { if i != int64(loop) { t.Fatal(i) } + + str, _ = getTestIteratorSample(0) + root, err = NewParser(str).Parse() + if err != 0 { + t.Fatal(err) + } + mi, _ = root.Get("object").Properties() + if mi.HasNext() { + t.Fatalf("should not have next") + } } func BenchmarkArrays(b *testing.B) {