mirror of
https://github.com/ii64/sonic.git
synced 2026-06-21 00:46:43 +08:00
fix(ast): return error when get from single json value (#373)
* fix(ast): return error when get from single json value * fix: fallback impl of skipstring
This commit is contained in:
parent
6d60889e3b
commit
10e45e906d
9 changed files with 22309 additions and 23804 deletions
|
|
@ -333,6 +333,7 @@ func skipString(src string, pos int) (ret int, ep int) {
|
||||||
sp := uintptr(rt.IndexChar(src, pos))
|
sp := uintptr(rt.IndexChar(src, pos))
|
||||||
se := uintptr(rt.IndexChar(src, len(src)))
|
se := uintptr(rt.IndexChar(src, len(src)))
|
||||||
|
|
||||||
|
// not start with quote
|
||||||
if *(*byte)(unsafe.Pointer(sp)) != '"' {
|
if *(*byte)(unsafe.Pointer(sp)) != '"' {
|
||||||
return -int(types.ERR_INVALID_CHAR), -1
|
return -int(types.ERR_INVALID_CHAR), -1
|
||||||
}
|
}
|
||||||
|
|
@ -350,16 +351,13 @@ func skipString(src string, pos int) (ret int, ep int) {
|
||||||
}
|
}
|
||||||
sp += 1
|
sp += 1
|
||||||
if c == '"' {
|
if c == '"' {
|
||||||
break
|
return int(uintptr(sp) - uintptr((*rt.GoString)(unsafe.Pointer(&src)).Ptr)), ep
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if sp > se {
|
|
||||||
return -int(types.ERR_EOF), -1
|
|
||||||
}
|
|
||||||
|
|
||||||
runtime.KeepAlive(src)
|
runtime.KeepAlive(src)
|
||||||
return int(uintptr(sp) - uintptr((*rt.GoString)(unsafe.Pointer(&src)).Ptr)), ep
|
// not found the closed quote until EOF
|
||||||
|
return -int(types.ERR_EOF), -1
|
||||||
}
|
}
|
||||||
|
|
||||||
//go:nocheckptr
|
//go:nocheckptr
|
||||||
|
|
|
||||||
|
|
@ -120,6 +120,66 @@ func TestSearcher_GetByPath(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type testGetByPath struct {
|
||||||
|
json string
|
||||||
|
path []interface{}
|
||||||
|
value interface{}
|
||||||
|
ok bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSearcher_GetByPathOk(t *testing.T) {
|
||||||
|
type Path = []interface{}
|
||||||
|
const Ok = true
|
||||||
|
tests := []testGetByPath{
|
||||||
|
{`true`, Path{}, true, Ok},
|
||||||
|
{`false`, Path{}, false, Ok},
|
||||||
|
{`null`, Path{}, nil, Ok},
|
||||||
|
{`12345`, Path{}, 12345.0, Ok},
|
||||||
|
{`12345.6789`, Path{}, 12345.6789, Ok},
|
||||||
|
{`"abc"`, Path{}, "abc", Ok},
|
||||||
|
{`"a\"\\bc"`, Path{}, "a\"\\bc", Ok},
|
||||||
|
{`{"a":1}`, Path{"a"}, 1.0, Ok},
|
||||||
|
{`[1,2,3]`, Path{0}, 1.0, Ok},
|
||||||
|
{`[1,2,3]`, Path{1}, 2.0, Ok},
|
||||||
|
{`[1,2,3]`, Path{2}, 3.0, Ok},
|
||||||
|
{`[1,2,3]`, Path{2}, 3.0, Ok},
|
||||||
|
}
|
||||||
|
for _, test := range tests {
|
||||||
|
t.Run(test.json, func(t *testing.T) {
|
||||||
|
s := NewSearcher(test.json)
|
||||||
|
node, err1 := s.GetByPath(test.path...)
|
||||||
|
v, err2 := node.Interface()
|
||||||
|
assert.Equal(t, test.value, v)
|
||||||
|
ok := err1 == nil && err2 == nil
|
||||||
|
assert.Equal(t, test.ok, ok)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSearcher_GetByPathError(t *testing.T) {
|
||||||
|
type Path = []interface{}
|
||||||
|
const Error = false
|
||||||
|
tests := []testGetByPath{
|
||||||
|
{`tru`, Path{}, true, Error},
|
||||||
|
{`fal`, Path{}, false, Error},
|
||||||
|
{`nul`, Path{}, nil, Error},
|
||||||
|
{`{"a":1`, Path{}, nil, Error},
|
||||||
|
{`x12345.6789`, Path{}, 12345.6789, Error},
|
||||||
|
{`"abc`, Path{}, "abc", Error},
|
||||||
|
{`"a\"\\bc`, Path{}, "a\"\\bc", Error},
|
||||||
|
{`{"a":`, Path{"a"}, 1.0, Error},
|
||||||
|
{`[1,2,3]`, Path{4}, 1.0, Error},
|
||||||
|
{`[1,2,3]`, Path{"a"}, 3.0, Error},
|
||||||
|
}
|
||||||
|
for _, test := range tests {
|
||||||
|
t.Run(test.json, func(t *testing.T) {
|
||||||
|
s := NewSearcher(test.json)
|
||||||
|
_, err := s.GetByPath(test.path...)
|
||||||
|
assert.Equal(t, test.ok, err == nil)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestSearcher_GetByPathErr(t *testing.T) {
|
func TestSearcher_GetByPathErr(t *testing.T) {
|
||||||
s := NewSearcher(` { "xx" : [] ,"yy" :{ }, "test" : [ true , 0.1 , "abc", ["h"], {"a":"bc"} ], "err1":[a, ] , "err2":{ ,"x":"xx"} } `)
|
s := NewSearcher(` { "xx" : [] ,"yy" :{ }, "test" : [ true , 0.1 , "abc", ["h"], {"a":"bc"} ], "err1":[a, ] , "err2":{ ,"x":"xx"} } `)
|
||||||
node, e := s.GetByPath("zz")
|
node, e := s.GetByPath("zz")
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -9,53 +9,53 @@ package avx
|
||||||
func __native_entry__() uintptr
|
func __native_entry__() uintptr
|
||||||
|
|
||||||
var (
|
var (
|
||||||
_subr__f32toa = __native_entry__() + 29744
|
_subr__f32toa = __native_entry__() + 28576
|
||||||
_subr__f64toa = __native_entry__() + 496
|
_subr__f64toa = __native_entry__() + 448
|
||||||
_subr__get_by_path = __native_entry__() + 27424
|
_subr__get_by_path = __native_entry__() + 25568
|
||||||
_subr__html_escape = __native_entry__() + 9968
|
_subr__html_escape = __native_entry__() + 9296
|
||||||
_subr__i64toa = __native_entry__() + 4112
|
_subr__i64toa = __native_entry__() + 3744
|
||||||
_subr__lspace = __native_entry__() + 80
|
_subr__lspace = __native_entry__() + 80
|
||||||
_subr__quote = __native_entry__() + 5792
|
_subr__quote = __native_entry__() + 5136
|
||||||
_subr__skip_array = __native_entry__() + 20576
|
_subr__skip_array = __native_entry__() + 18592
|
||||||
_subr__skip_number = __native_entry__() + 23920
|
_subr__skip_number = __native_entry__() + 22144
|
||||||
_subr__skip_object = __native_entry__() + 22496
|
_subr__skip_object = __native_entry__() + 20592
|
||||||
_subr__skip_one = __native_entry__() + 24080
|
_subr__skip_one = __native_entry__() + 22304
|
||||||
_subr__skip_one_fast = __native_entry__() + 24320
|
_subr__skip_one_fast = __native_entry__() + 22544
|
||||||
_subr__u64toa = __native_entry__() + 4384
|
_subr__u64toa = __native_entry__() + 3856
|
||||||
_subr__unquote = __native_entry__() + 7488
|
_subr__unquote = __native_entry__() + 6928
|
||||||
_subr__validate_one = __native_entry__() + 24144
|
_subr__validate_one = __native_entry__() + 22368
|
||||||
_subr__validate_utf8 = __native_entry__() + 28464
|
_subr__validate_utf8 = __native_entry__() + 27328
|
||||||
_subr__validate_utf8_fast = __native_entry__() + 29136
|
_subr__validate_utf8_fast = __native_entry__() + 28000
|
||||||
_subr__value = __native_entry__() + 14672
|
_subr__value = __native_entry__() + 12480
|
||||||
_subr__vnumber = __native_entry__() + 18320
|
_subr__vnumber = __native_entry__() + 16256
|
||||||
_subr__vsigned = __native_entry__() + 19856
|
_subr__vsigned = __native_entry__() + 17872
|
||||||
_subr__vstring = __native_entry__() + 16864
|
_subr__vstring = __native_entry__() + 14704
|
||||||
_subr__vunsigned = __native_entry__() + 20208
|
_subr__vunsigned = __native_entry__() + 18240
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
_stack__f32toa = 56
|
_stack__f32toa = 48
|
||||||
_stack__f64toa = 80
|
_stack__f64toa = 80
|
||||||
_stack__get_by_path = 312
|
_stack__get_by_path = 304
|
||||||
_stack__html_escape = 64
|
_stack__html_escape = 64
|
||||||
_stack__i64toa = 16
|
_stack__i64toa = 16
|
||||||
_stack__lspace = 8
|
_stack__lspace = 8
|
||||||
_stack__quote = 80
|
_stack__quote = 56
|
||||||
_stack__skip_array = 128
|
_stack__skip_array = 128
|
||||||
_stack__skip_number = 72
|
_stack__skip_number = 72
|
||||||
_stack__skip_object = 128
|
_stack__skip_object = 128
|
||||||
_stack__skip_one = 128
|
_stack__skip_one = 128
|
||||||
_stack__skip_one_fast = 208
|
_stack__skip_one_fast = 216
|
||||||
_stack__u64toa = 8
|
_stack__u64toa = 8
|
||||||
_stack__unquote = 128
|
_stack__unquote = 88
|
||||||
_stack__validate_one = 128
|
_stack__validate_one = 128
|
||||||
_stack__validate_utf8 = 48
|
_stack__validate_utf8 = 48
|
||||||
_stack__validate_utf8_fast = 24
|
_stack__validate_utf8_fast = 24
|
||||||
_stack__value = 368
|
_stack__value = 328
|
||||||
_stack__vnumber = 280
|
_stack__vnumber = 240
|
||||||
_stack__vsigned = 16
|
_stack__vsigned = 16
|
||||||
_stack__vstring = 128
|
_stack__vstring = 136
|
||||||
_stack__vunsigned = 24
|
_stack__vunsigned = 16
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -9,53 +9,53 @@ package avx2
|
||||||
func __native_entry__() uintptr
|
func __native_entry__() uintptr
|
||||||
|
|
||||||
var (
|
var (
|
||||||
_subr__f32toa = __native_entry__() + 35216
|
_subr__f32toa = __native_entry__() + 34560
|
||||||
_subr__f64toa = __native_entry__() + 752
|
_subr__f64toa = __native_entry__() + 736
|
||||||
_subr__get_by_path = __native_entry__() + 30384
|
_subr__get_by_path = __native_entry__() + 29232
|
||||||
_subr__html_escape = __native_entry__() + 11712
|
_subr__html_escape = __native_entry__() + 10944
|
||||||
_subr__i64toa = __native_entry__() + 4368
|
_subr__i64toa = __native_entry__() + 4032
|
||||||
_subr__lspace = __native_entry__() + 224
|
_subr__lspace = __native_entry__() + 224
|
||||||
_subr__quote = __native_entry__() + 6160
|
_subr__quote = __native_entry__() + 5520
|
||||||
_subr__skip_array = __native_entry__() + 22864
|
_subr__skip_array = __native_entry__() + 21616
|
||||||
_subr__skip_number = __native_entry__() + 26928
|
_subr__skip_number = __native_entry__() + 25840
|
||||||
_subr__skip_object = __native_entry__() + 24864
|
_subr__skip_object = __native_entry__() + 23680
|
||||||
_subr__skip_one = __native_entry__() + 27088
|
_subr__skip_one = __native_entry__() + 26000
|
||||||
_subr__skip_one_fast = __native_entry__() + 27504
|
_subr__skip_one_fast = __native_entry__() + 26416
|
||||||
_subr__u64toa = __native_entry__() + 4640
|
_subr__u64toa = __native_entry__() + 4144
|
||||||
_subr__unquote = __native_entry__() + 8960
|
_subr__unquote = __native_entry__() + 8336
|
||||||
_subr__validate_one = __native_entry__() + 27152
|
_subr__validate_one = __native_entry__() + 26064
|
||||||
_subr__validate_utf8 = __native_entry__() + 31552
|
_subr__validate_utf8 = __native_entry__() + 30992
|
||||||
_subr__validate_utf8_fast = __native_entry__() + 32496
|
_subr__validate_utf8_fast = __native_entry__() + 31952
|
||||||
_subr__value = __native_entry__() + 16816
|
_subr__value = __native_entry__() + 15472
|
||||||
_subr__vnumber = __native_entry__() + 20608
|
_subr__vnumber = __native_entry__() + 19280
|
||||||
_subr__vsigned = __native_entry__() + 22144
|
_subr__vsigned = __native_entry__() + 20896
|
||||||
_subr__vstring = __native_entry__() + 19312
|
_subr__vstring = __native_entry__() + 17952
|
||||||
_subr__vunsigned = __native_entry__() + 22496
|
_subr__vunsigned = __native_entry__() + 21264
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
_stack__f32toa = 56
|
_stack__f32toa = 48
|
||||||
_stack__f64toa = 80
|
_stack__f64toa = 80
|
||||||
_stack__get_by_path = 320
|
_stack__get_by_path = 312
|
||||||
_stack__html_escape = 72
|
_stack__html_escape = 72
|
||||||
_stack__i64toa = 16
|
_stack__i64toa = 16
|
||||||
_stack__lspace = 8
|
_stack__lspace = 8
|
||||||
_stack__quote = 72
|
_stack__quote = 56
|
||||||
_stack__skip_array = 120
|
_stack__skip_array = 128
|
||||||
_stack__skip_number = 80
|
_stack__skip_number = 72
|
||||||
_stack__skip_object = 120
|
_stack__skip_object = 128
|
||||||
_stack__skip_one = 120
|
_stack__skip_one = 128
|
||||||
_stack__skip_one_fast = 216
|
_stack__skip_one_fast = 224
|
||||||
_stack__u64toa = 8
|
_stack__u64toa = 8
|
||||||
_stack__unquote = 128
|
_stack__unquote = 72
|
||||||
_stack__validate_one = 120
|
_stack__validate_one = 128
|
||||||
_stack__validate_utf8 = 48
|
_stack__validate_utf8 = 48
|
||||||
_stack__validate_utf8_fast = 200
|
_stack__validate_utf8_fast = 176
|
||||||
_stack__value = 368
|
_stack__value = 328
|
||||||
_stack__vnumber = 280
|
_stack__vnumber = 240
|
||||||
_stack__vsigned = 16
|
_stack__vsigned = 16
|
||||||
_stack__vstring = 104
|
_stack__vstring = 112
|
||||||
_stack__vunsigned = 24
|
_stack__vunsigned = 16
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -9,53 +9,53 @@ package sse
|
||||||
func __native_entry__() uintptr
|
func __native_entry__() uintptr
|
||||||
|
|
||||||
var (
|
var (
|
||||||
_subr__f32toa = __native_entry__() + 28688
|
_subr__f32toa = __native_entry__() + 29200
|
||||||
_subr__f64toa = __native_entry__() + 464
|
_subr__f64toa = __native_entry__() + 448
|
||||||
_subr__get_by_path = __native_entry__() + 26432
|
_subr__get_by_path = __native_entry__() + 26208
|
||||||
_subr__html_escape = __native_entry__() + 9584
|
_subr__html_escape = __native_entry__() + 9360
|
||||||
_subr__i64toa = __native_entry__() + 3744
|
_subr__i64toa = __native_entry__() + 3712
|
||||||
_subr__lspace = __native_entry__() + 80
|
_subr__lspace = __native_entry__() + 80
|
||||||
_subr__quote = __native_entry__() + 5472
|
_subr__quote = __native_entry__() + 5152
|
||||||
_subr__skip_array = __native_entry__() + 19184
|
_subr__skip_array = __native_entry__() + 18800
|
||||||
_subr__skip_number = __native_entry__() + 22528
|
_subr__skip_number = __native_entry__() + 22368
|
||||||
_subr__skip_object = __native_entry__() + 21088
|
_subr__skip_object = __native_entry__() + 20784
|
||||||
_subr__skip_one = __native_entry__() + 22688
|
_subr__skip_one = __native_entry__() + 22528
|
||||||
_subr__skip_one_fast = __native_entry__() + 22912
|
_subr__skip_one_fast = __native_entry__() + 22752
|
||||||
_subr__u64toa = __native_entry__() + 4016
|
_subr__u64toa = __native_entry__() + 3840
|
||||||
_subr__unquote = __native_entry__() + 7184
|
_subr__unquote = __native_entry__() + 6992
|
||||||
_subr__validate_one = __native_entry__() + 22736
|
_subr__validate_one = __native_entry__() + 22576
|
||||||
_subr__validate_utf8 = __native_entry__() + 27456
|
_subr__validate_utf8 = __native_entry__() + 27968
|
||||||
_subr__validate_utf8_fast = __native_entry__() + 28128
|
_subr__validate_utf8_fast = __native_entry__() + 28640
|
||||||
_subr__value = __native_entry__() + 13216
|
_subr__value = __native_entry__() + 12560
|
||||||
_subr__vnumber = __native_entry__() + 16928
|
_subr__vnumber = __native_entry__() + 16416
|
||||||
_subr__vsigned = __native_entry__() + 18464
|
_subr__vsigned = __native_entry__() + 18064
|
||||||
_subr__vstring = __native_entry__() + 15408
|
_subr__vstring = __native_entry__() + 14800
|
||||||
_subr__vunsigned = __native_entry__() + 18816
|
_subr__vunsigned = __native_entry__() + 18448
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
_stack__f32toa = 56
|
_stack__f32toa = 48
|
||||||
_stack__f64toa = 80
|
_stack__f64toa = 80
|
||||||
_stack__get_by_path = 264
|
_stack__get_by_path = 256
|
||||||
_stack__html_escape = 64
|
_stack__html_escape = 64
|
||||||
_stack__i64toa = 16
|
_stack__i64toa = 16
|
||||||
_stack__lspace = 8
|
_stack__lspace = 8
|
||||||
_stack__quote = 80
|
_stack__quote = 64
|
||||||
_stack__skip_array = 128
|
_stack__skip_array = 128
|
||||||
_stack__skip_number = 72
|
_stack__skip_number = 72
|
||||||
_stack__skip_object = 128
|
_stack__skip_object = 128
|
||||||
_stack__skip_one = 128
|
_stack__skip_one = 128
|
||||||
_stack__skip_one_fast = 160
|
_stack__skip_one_fast = 168
|
||||||
_stack__u64toa = 8
|
_stack__u64toa = 8
|
||||||
_stack__unquote = 128
|
_stack__unquote = 88
|
||||||
_stack__validate_one = 128
|
_stack__validate_one = 128
|
||||||
_stack__validate_utf8 = 48
|
_stack__validate_utf8 = 48
|
||||||
_stack__validate_utf8_fast = 24
|
_stack__validate_utf8_fast = 24
|
||||||
_stack__value = 368
|
_stack__value = 328
|
||||||
_stack__vnumber = 280
|
_stack__vnumber = 240
|
||||||
_stack__vsigned = 16
|
_stack__vsigned = 16
|
||||||
_stack__vstring = 128
|
_stack__vstring = 136
|
||||||
_stack__vunsigned = 24
|
_stack__vunsigned = 16
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
|
||||||
|
|
@ -1687,8 +1687,8 @@ long skip_one_fast(const GoString *src, long *p) {
|
||||||
case '{': return skip_object_fast(src, p);
|
case '{': return skip_object_fast(src, p);
|
||||||
case '"': return skip_string_fast(src, p);
|
case '"': return skip_string_fast(src, p);
|
||||||
case '-': case '0' ... '9': return skip_number_fast(src, p);
|
case '-': case '0' ... '9': return skip_number_fast(src, p);
|
||||||
case 't': case 'n': { if (*p + 3 < src->len) { *p += 3; } else { return -ERR_EOF; } }; break;
|
case 't': case 'n': { if (*p + 3 <= src->len) { *p += 3; } else { return -ERR_EOF; } }; break;
|
||||||
case 'f': { if (*p + 4 < src->len) { *p += 4; } else { return -ERR_EOF; } }; break;
|
case 'f': { if (*p + 4 <= src->len) { *p += 4; } else { return -ERR_EOF; } }; break;
|
||||||
case 0 : return -ERR_EOF;
|
case 0 : return -ERR_EOF;
|
||||||
default : *p -= 1; return -ERR_INVAL; // backward error position
|
default : *p -= 1; return -ERR_INVAL; // backward error position
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue