@@ -64,6 +64,9 @@ func decodeFalse(src string, pos int) (ret int) {
64
64
65
65
func decodeString (src string , pos int ) (ret int , v string ) {
66
66
ret , ep := skipString (src , pos )
67
+ if ret < 0 {
68
+ return ret , ""
69
+ }
67
70
if ep == - 1 {
68
71
(* rt .GoString )(unsafe .Pointer (& v )).Ptr = rt .IndexChar (src , pos + 1 )
69
72
(* rt .GoString )(unsafe .Pointer (& v )).Len = ret - pos - 2
@@ -97,18 +100,18 @@ func isDigit(c byte) bool {
97
100
return c >= '0' && c <= '9'
98
101
}
99
102
103
+ //go:nocheckptr
100
104
func decodeInt64 (src string , pos int ) (ret int , v int64 , err error ) {
101
- sp := uintptr (rt .IndexChar (src , pos ))
102
- ss := uintptr (sp )
103
- se := uintptr (rt .IndexChar (src , len (src )))
105
+ sp := rt .IndexCharUint (src , pos )
106
+ se := rt .StrBoundary (src )
104
107
if uintptr (sp ) >= se {
105
108
return - int (types .ERR_EOF ), 0 , nil
106
109
}
107
110
108
111
if c := * (* byte )(unsafe .Pointer (sp )); c == '-' {
109
112
sp += 1
110
113
}
111
- if sp = = se {
114
+ if sp > = se {
112
115
return - int (types .ERR_EOF ), 0 , nil
113
116
}
114
117
@@ -126,7 +129,7 @@ func decodeInt64(src string, pos int) (ret int, v int64, err error) {
126
129
127
130
var vv string
128
131
ret = int (uintptr (sp ) - uintptr ((* rt .GoString )(unsafe .Pointer (& src )).Ptr ))
129
- (* rt .GoString )(unsafe .Pointer (& vv )).Ptr = unsafe . Pointer ( ss )
132
+ (* rt .GoString )(unsafe .Pointer (& vv )).Ptr = rt . IndexChar ( src , pos )
130
133
(* rt .GoString )(unsafe .Pointer (& vv )).Len = ret - pos
131
134
132
135
v , err = strconv .ParseInt (vv , 10 , 64 )
@@ -146,10 +149,10 @@ func isNumberChars(c byte) bool {
146
149
return (c >= '0' && c <= '9' ) || c == '+' || c == '-' || c == 'e' || c == 'E' || c == '.'
147
150
}
148
151
152
+ //go:nocheckptr
149
153
func decodeFloat64 (src string , pos int ) (ret int , v float64 , err error ) {
150
- sp := uintptr (rt .IndexChar (src , pos ))
151
- ss := uintptr (sp )
152
- se := uintptr (rt .IndexChar (src , len (src )))
154
+ sp := rt .IndexCharUint (src , pos )
155
+ se := rt .StrBoundary (src )
153
156
if uintptr (sp ) >= se {
154
157
return - int (types .ERR_EOF ), 0 , nil
155
158
}
@@ -169,7 +172,7 @@ func decodeFloat64(src string, pos int) (ret int, v float64, err error) {
169
172
170
173
var vv string
171
174
ret = int (uintptr (sp ) - uintptr ((* rt .GoString )(unsafe .Pointer (& src )).Ptr ))
172
- (* rt .GoString )(unsafe .Pointer (& vv )).Ptr = unsafe . Pointer ( ss )
175
+ (* rt .GoString )(unsafe .Pointer (& vv )).Ptr = rt . IndexChar ( src , pos )
173
176
(* rt .GoString )(unsafe .Pointer (& vv )).Len = ret - pos
174
177
175
178
v , err = strconv .ParseFloat (vv , 64 )
@@ -290,9 +293,10 @@ func DecodeValue(src string, pos int) (ret int, v types.JsonState) {
290
293
}
291
294
}
292
295
296
+ //go:nocheckptr
293
297
func skipNumber (src string , pos int ) (ret int ) {
294
- sp := uintptr ( rt .IndexChar (src , pos ) )
295
- se := uintptr ( rt .IndexChar (src , len ( src )) )
298
+ sp := rt .IndexCharUint (src , pos )
299
+ se := rt .StrBoundary (src )
296
300
if uintptr (sp ) >= se {
297
301
return - int (types .ERR_EOF )
298
302
}
@@ -354,13 +358,14 @@ func skipNumber(src string, pos int) (ret int) {
354
358
return int (uintptr (sp ) - uintptr ((* rt .GoString )(unsafe .Pointer (& src )).Ptr ))
355
359
}
356
360
361
+ //go:nocheckptr
357
362
func skipString (src string , pos int ) (ret int , ep int ) {
358
363
if pos + 1 >= len (src ) {
359
364
return - int (types .ERR_EOF ), - 1
360
365
}
361
366
362
- sp := uintptr ( rt .IndexChar (src , pos ) )
363
- se := uintptr ( rt .IndexChar (src , len ( src )) )
367
+ sp := rt .IndexCharUint (src , pos )
368
+ se := rt .StrBoundary (src )
364
369
365
370
if * (* byte )(unsafe .Pointer (sp )) != '"' {
366
371
return - int (types .ERR_INVALID_CHAR ), - 1
@@ -391,13 +396,14 @@ func skipString(src string, pos int) (ret int, ep int) {
391
396
return int (uintptr (sp ) - uintptr ((* rt .GoString )(unsafe .Pointer (& src )).Ptr )), ep
392
397
}
393
398
399
+ //go:nocheckptr
394
400
func skipPair (src string , pos int , lchar byte , rchar byte ) (ret int ) {
395
401
if pos + 1 >= len (src ) {
396
402
return - int (types .ERR_EOF )
397
403
}
398
404
399
- sp := uintptr ( rt .IndexChar (src , pos ) )
400
- se := uintptr ( rt .IndexChar (src , len ( src )) )
405
+ sp := rt .IndexCharUint (src , pos )
406
+ se := rt .StrBoundary (src )
401
407
402
408
if * (* byte )(unsafe .Pointer (sp )) != lchar {
403
409
return - int (types .ERR_INVALID_CHAR )
0 commit comments