summaryrefslogtreecommitdiff
path: root/vendor/github.com/bytedance/sonic/ast/iterator.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/bytedance/sonic/ast/iterator.go')
-rw-r--r--vendor/github.com/bytedance/sonic/ast/iterator.go21
1 files changed, 17 insertions, 4 deletions
diff --git a/vendor/github.com/bytedance/sonic/ast/iterator.go b/vendor/github.com/bytedance/sonic/ast/iterator.go
index 64e1e5a90..076647154 100644
--- a/vendor/github.com/bytedance/sonic/ast/iterator.go
+++ b/vendor/github.com/bytedance/sonic/ast/iterator.go
@@ -17,19 +17,29 @@
package ast
import (
- `fmt`
+ "fmt"
- `github.com/bytedance/sonic/internal/native/types`
+ "github.com/bytedance/sonic/internal/caching"
+ "github.com/bytedance/sonic/internal/native/types"
)
type Pair struct {
+ hash uint64
Key string
Value Node
}
+func NewPair(key string, val Node) Pair {
+ return Pair{
+ hash: caching.StrHash(key),
+ Key: key,
+ Value: val,
+ }
+}
+
// Values returns iterator for array's children traversal
func (self *Node) Values() (ListIterator, error) {
- if err := self.should(types.V_ARRAY, "an array"); err != nil {
+ if err := self.should(types.V_ARRAY); err != nil {
return ListIterator{}, err
}
return self.values(), nil
@@ -41,7 +51,7 @@ func (self *Node) values() ListIterator {
// Properties returns iterator for object's children traversal
func (self *Node) Properties() (ObjectIterator, error) {
- if err := self.should(types.V_OBJECT, "an object"); err != nil {
+ if err := self.should(types.V_OBJECT); err != nil {
return ObjectIterator{}, err
}
return self.properties(), nil
@@ -168,6 +178,9 @@ type Scanner func(path Sequence, node *Node) bool
//
// NOTICE: A unsetted node WON'T trigger sc, but its index still counts into Path.Index
func (self *Node) ForEach(sc Scanner) error {
+ if err := self.checkRaw(); err != nil {
+ return err
+ }
switch self.itype() {
case types.V_ARRAY:
iter, err := self.Values()