...
1
2
3
18
19 package ast
20
21 import (
22 `encoding/json`
23 `unicode/utf8`
24
25 `github.com/bytedance/sonic/internal/native/types`
26 `github.com/bytedance/sonic/internal/rt`
27 )
28
29 func init() {
30 println("WARNING:(ast) sonic only supports Go1.16~1.22, but your environment is not suitable")
31 }
32
33 func quote(buf *[]byte, val string) {
34 quoteString(buf, val)
35 }
36
37
38 func unquote(src string) (string, types.ParsingError) {
39 sp := rt.IndexChar(src, -1)
40 out, ok := unquoteBytes(rt.BytesFrom(sp, len(src)+2, len(src)+2))
41 if !ok {
42 return "", types.ERR_INVALID_ESCAPE
43 }
44 return rt.Mem2Str(out), 0
45 }
46
47
48 func (self *Parser) decodeValue() (val types.JsonState) {
49 e, v := decodeValue(self.s, self.p, self.dbuf == nil)
50 if e < 0 {
51 return v
52 }
53 self.p = e
54 return v
55 }
56
57 func (self *Parser) skip() (int, types.ParsingError) {
58 e, s := skipValue(self.s, self.p)
59 if e < 0 {
60 return self.p, types.ParsingError(-e)
61 }
62 self.p = e
63 return s, 0
64 }
65
66 func (self *Parser) skipFast() (int, types.ParsingError) {
67 e, s := skipValueFast(self.s, self.p)
68 if e < 0 {
69 return self.p, types.ParsingError(-e)
70 }
71 self.p = e
72 return s, 0
73 }
74
75 func (self *Node) encodeInterface(buf *[]byte) error {
76 out, err := json.Marshal(self.packAny())
77 if err != nil {
78 return err
79 }
80 *buf = append(*buf, out...)
81 return nil
82 }
83
84 func (self *Parser) getByPath(validate bool, path ...interface{}) (int, types.ParsingError) {
85 for _, p := range path {
86 if idx, ok := p.(int); ok && idx >= 0 {
87 if err := self.searchIndex(idx); err != 0 {
88 return self.p, err
89 }
90 } else if key, ok := p.(string); ok {
91 if err := self.searchKey(key); err != 0 {
92 return self.p, err
93 }
94 } else {
95 panic("path must be either int(>=0) or string")
96 }
97 }
98
99 var start int
100 var e types.ParsingError
101 if validate {
102 start, e = self.skip()
103 } else {
104 start, e = self.skipFast()
105 }
106 if e != 0 {
107 return self.p, e
108 }
109 return start, 0
110 }
111
112 func validate_utf8(str string) bool {
113 return utf8.ValidString(str)
114 }
115
View as plain text