From 3490f68583f348524a8d6adb576ae090ca7e612e Mon Sep 17 00:00:00 2001 From: "duanyi.aster" Date: Thu, 14 Dec 2023 16:15:40 +0800 Subject: [PATCH] fix: empty object/array --- internal/native/avx/native_amd64.go | 6 +- internal/native/avx/native_amd64_test.go | 12 +- internal/native/avx/native_subr_amd64.go | 40 +- internal/native/avx/native_text_amd64.go | 13375 +++++++++--------- internal/native/avx/recover_amd64_test.go | 2 +- internal/native/avx2/native_amd64.go | 6 +- internal/native/avx2/native_amd64_test.go | 12 +- internal/native/avx2/native_subr_amd64.go | 40 +- internal/native/avx2/native_text_amd64.go | 13302 +++++++++--------- internal/native/avx2/recover_amd64_test.go | 2 +- internal/native/dispatch_amd64.go | 2 +- internal/native/native_amd64.tmpl | 6 +- internal/native/native_amd64_test.tmpl | 12 +- internal/native/recover_amd64_test.tmpl | 2 +- internal/native/sse/native_amd64.go | 6 +- internal/native/sse/native_amd64_test.go | 12 +- internal/native/sse/native_subr_amd64.go | 43 +- internal/native/sse/native_text_amd64.go | 13447 ++++++++++--------- internal/native/sse/recover_amd64_test.go | 2 +- native/native.h | 2 +- native/scanning.c | 18 +- 21 files changed, 20292 insertions(+), 20057 deletions(-) diff --git a/internal/native/avx/native_amd64.go b/internal/native/avx/native_amd64.go index 07ae1ce74..9d28d7f99 100644 --- a/internal/native/avx/native_amd64.go +++ b/internal/native/avx/native_amd64.go @@ -76,7 +76,7 @@ var ( __count_elems func(s unsafe.Pointer, p unsafe.Pointer) int - __count_elems2 func(s unsafe.Pointer, p unsafe.Pointer) int + __count_elems_fast func(s unsafe.Pointer, p unsafe.Pointer) int ) //go:nosplit @@ -200,6 +200,6 @@ func count_elems(s *string, p *int) (ret int) { } //go:nosplit -func count_elems2(s *string, p *int) (ret int) { - return __count_elems2(rt.NoEscape(unsafe.Pointer(s)), rt.NoEscape(unsafe.Pointer(p))) +func count_elems_fast(s *string, p *int) (ret int) { + return __count_elems_fast(rt.NoEscape(unsafe.Pointer(s)), rt.NoEscape(unsafe.Pointer(p))) } diff --git a/internal/native/avx/native_amd64_test.go b/internal/native/avx/native_amd64_test.go index 1cc499d07..8e8df7b1c 100644 --- a/internal/native/avx/native_amd64_test.go +++ b/internal/native/avx/native_amd64_test.go @@ -683,7 +683,7 @@ func Test_count_elems(t *testing.T) { } } -func Test_count_elems2(t *testing.T) { +func Test_count_elems_fast(t *testing.T) { type args struct { s string p int @@ -697,7 +697,7 @@ func Test_count_elems2(t *testing.T) { { name: "0", args: args{`{}`, 0}, - wantRet: 1, + wantRet: 0, wantP: 2, }, { @@ -721,7 +721,7 @@ func Test_count_elems2(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if gotRet := count_elems2(&tt.args.s, &tt.args.p); gotRet != tt.wantRet { + if gotRet := count_elems_fast(&tt.args.s, &tt.args.p); gotRet != tt.wantRet { t.Errorf("count_elems() = %v, want %v", gotRet, tt.wantRet) } if tt.args.p != tt.wantP { @@ -789,7 +789,7 @@ func BenchmarkCountElems2(b *testing.B) { b.ResetTimer() for i:=0; ibuf[i]; - if (c == ',') { + if (src->buf[i] == ',') { ret += 1; } } + if (ret == 1) { + // ensure if it is empty + char c = src->buf[s]; + long tmp = s+1; + char n = advance_ns(src, &tmp); + if ((c == '[' && n == ']') || (c == '{' && n == '}')) { + return 0; + } + } return ret; }