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