处理AI胡乱生成的乱摊子
This commit is contained in:
		
							
								
								
									
										75
									
								
								vendor/github.com/bytedance/sonic/ast/iterator.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										75
									
								
								vendor/github.com/bytedance/sonic/ast/iterator.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -82,26 +82,54 @@ type ObjectIterator struct { | ||||
|     Iterator | ||||
| } | ||||
|  | ||||
| func (self *ListIterator) next() *Node { | ||||
| next_start: | ||||
|     if !self.HasNext() { | ||||
|         return nil | ||||
|     } else { | ||||
|         n := self.p.nodeAt(self.i) | ||||
|         self.i++ | ||||
|         if !n.Exists() { | ||||
|             goto next_start | ||||
|         } | ||||
|         return n | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Next scans through children of underlying V_ARRAY,  | ||||
| // copies each child to v, and returns .HasNext(). | ||||
| func (self *ListIterator) Next(v *Node) bool { | ||||
|     if !self.HasNext() { | ||||
|     n := self.next() | ||||
|     if n == nil { | ||||
|         return false | ||||
|     } | ||||
|     *v = *n | ||||
|     return true | ||||
| } | ||||
|  | ||||
| func (self *ObjectIterator) next() *Pair { | ||||
| next_start: | ||||
|     if !self.HasNext() { | ||||
|         return nil | ||||
|     } else { | ||||
|         *v, self.i = *self.p.nodeAt(self.i), self.i + 1 | ||||
|         return true | ||||
|         n := self.p.pairAt(self.i) | ||||
|         self.i++ | ||||
|         if !n.Value.Exists() { | ||||
|             goto next_start | ||||
|         } | ||||
|         return n | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Next scans through children of underlying V_OBJECT,  | ||||
| // copies each child to v, and returns .HasNext(). | ||||
| func (self *ObjectIterator) Next(p *Pair) bool { | ||||
|     if !self.HasNext() { | ||||
|     n := self.next() | ||||
|     if n == nil { | ||||
|         return false | ||||
|     } else { | ||||
|         *p, self.i = *self.p.pairAt(self.i), self.i + 1 | ||||
|         return true | ||||
|     } | ||||
|     *p = *n | ||||
|     return true | ||||
| } | ||||
|  | ||||
| // Sequence represents scanning path of single-layer nodes. | ||||
| @@ -129,36 +157,39 @@ type Scanner func(path Sequence, node *Node) bool | ||||
| // | ||||
| // Especailly, if the node is not V_ARRAY or V_OBJECT,  | ||||
| // the node itself will be returned and Sequence.Index == -1. | ||||
| //  | ||||
| // NOTICE: A unsetted node WON'T trigger sc, but its index still counts into Path.Index | ||||
| func (self *Node) ForEach(sc Scanner) error { | ||||
|     switch self.itype() { | ||||
|     case types.V_ARRAY: | ||||
|         ns, err := self.UnsafeArray() | ||||
|         iter, err := self.Values() | ||||
|         if err != nil { | ||||
|             return err | ||||
|         } | ||||
|         for i := range ns { | ||||
|             if !sc(Sequence{i, nil}, &ns[i]) { | ||||
|                 return err | ||||
|         v := iter.next() | ||||
|         for v != nil { | ||||
|             if !sc(Sequence{iter.i-1, nil}, v) { | ||||
|                 return nil | ||||
|             } | ||||
|             v = iter.next() | ||||
|         } | ||||
|     case types.V_OBJECT: | ||||
|         ns, err := self.UnsafeMap() | ||||
|         iter, err := self.Properties() | ||||
|         if err != nil { | ||||
|             return err | ||||
|         } | ||||
|         for i := range ns { | ||||
|             if !sc(Sequence{i, &ns[i].Key}, &ns[i].Value) { | ||||
|                 return err | ||||
|         v := iter.next() | ||||
|         for v != nil { | ||||
|             if !sc(Sequence{iter.i-1, &v.Key}, &v.Value) { | ||||
|                 return nil | ||||
|             } | ||||
|             v = iter.next() | ||||
|         } | ||||
|     default: | ||||
|         if self.Check() != nil { | ||||
|             return self | ||||
|         } | ||||
|         sc(Sequence{-1, nil}, self) | ||||
|     } | ||||
|     return self.Check() | ||||
|     return nil | ||||
| } | ||||
|  | ||||
| type PairSlice []Pair | ||||
|  | ||||
| func (self PairSlice) Sort() { | ||||
|     radixQsort(self, 0, maxDepth(len(self))) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user