From 3ac1ee16f377d31a0fb80c8dae28b6239ac4229e Mon Sep 17 00:00:00 2001 From: Terin Stock Date: Sun, 9 Mar 2025 17:47:56 +0100 Subject: [chore] remove vendor --- .../bytedance/sonic/internal/base64/b64_amd64.go | 46 - .../bytedance/sonic/internal/base64/b64_compat.go | 44 - .../bytedance/sonic/internal/caching/asm.s | 0 .../bytedance/sonic/internal/caching/fcache.go | 115 - .../bytedance/sonic/internal/caching/hashing.go | 40 - .../bytedance/sonic/internal/caching/pcache.go | 173 - .../bytedance/sonic/internal/cpu/features.go | 40 - .../sonic/internal/decoder/api/decoder.go | 173 - .../sonic/internal/decoder/api/decoder_amd64.go | 38 - .../sonic/internal/decoder/api/decoder_arm64.go | 38 - .../bytedance/sonic/internal/decoder/api/stream.go | 248 - .../sonic/internal/decoder/consts/option.go | 36 - .../sonic/internal/decoder/errors/errors.go | 191 - .../bytedance/sonic/internal/decoder/jitdec/asm.s | 0 .../decoder/jitdec/asm_stubs_amd64_go117.go | 126 - .../decoder/jitdec/asm_stubs_amd64_go121.go | 132 - .../decoder/jitdec/assembler_regabi_amd64.go | 1971 --- .../sonic/internal/decoder/jitdec/compiler.go | 1213 -- .../sonic/internal/decoder/jitdec/debug.go | 70 - .../sonic/internal/decoder/jitdec/decoder.go | 140 - .../decoder/jitdec/generic_regabi_amd64.go | 729 - .../decoder/jitdec/generic_regabi_amd64_test.s | 37 - .../sonic/internal/decoder/jitdec/pools.go | 145 - .../sonic/internal/decoder/jitdec/primitives.go | 58 - .../sonic/internal/decoder/jitdec/stubs_go116.go | 106 - .../sonic/internal/decoder/jitdec/stubs_go120.go | 106 - .../sonic/internal/decoder/jitdec/types.go | 58 - .../sonic/internal/decoder/jitdec/utils.go | 39 - .../internal/decoder/optdec/compile_struct.go | 174 - .../sonic/internal/decoder/optdec/compiler.go | 449 - .../sonic/internal/decoder/optdec/const.go | 60 - .../sonic/internal/decoder/optdec/context.go | 3 - .../sonic/internal/decoder/optdec/decoder.go | 160 - .../sonic/internal/decoder/optdec/errors.go | 73 - .../sonic/internal/decoder/optdec/functor.go | 281 - .../sonic/internal/decoder/optdec/helper.go | 110 - .../sonic/internal/decoder/optdec/interface.go | 169 - .../bytedance/sonic/internal/decoder/optdec/map.go | 430 - .../sonic/internal/decoder/optdec/native.go | 269 - .../sonic/internal/decoder/optdec/node.go | 1278 -- .../sonic/internal/decoder/optdec/slice.go | 224 - .../sonic/internal/decoder/optdec/stringopts.go | 360 - .../sonic/internal/decoder/optdec/structs.go | 61 - .../sonic/internal/decoder/optdec/types.go | 60 - .../sonic/internal/encoder/alg/mapiter.go | 206 - .../bytedance/sonic/internal/encoder/alg/opts.go | 31 - .../sonic/internal/encoder/alg/primitives.go | 95 - .../bytedance/sonic/internal/encoder/alg/sort.go | 206 - .../bytedance/sonic/internal/encoder/alg/spec.go | 198 - .../sonic/internal/encoder/alg/spec_compat.go | 148 - .../bytedance/sonic/internal/encoder/compiler.go | 676 - .../sonic/internal/encoder/encode_norace.go | 24 - .../sonic/internal/encoder/encode_race.go | 54 - .../bytedance/sonic/internal/encoder/encoder.go | 318 - .../bytedance/sonic/internal/encoder/ir/op.go | 473 - .../sonic/internal/encoder/pools_amd64.go | 97 - .../sonic/internal/encoder/pools_compt.go | 24 - .../bytedance/sonic/internal/encoder/stream.go | 91 - .../bytedance/sonic/internal/encoder/vars/cache.go | 48 - .../bytedance/sonic/internal/encoder/vars/const.go | 42 - .../sonic/internal/encoder/vars/errors.go | 65 - .../bytedance/sonic/internal/encoder/vars/stack.go | 146 - .../bytedance/sonic/internal/encoder/vars/types.go | 47 - .../bytedance/sonic/internal/encoder/vm/stbus.go | 45 - .../bytedance/sonic/internal/encoder/vm/vm.go | 374 - .../internal/encoder/x86/asm_stubs_amd64_go117.go | 53 - .../internal/encoder/x86/asm_stubs_amd64_go121.go | 52 - .../internal/encoder/x86/assembler_regabi_amd64.go | 1195 -- .../sonic/internal/encoder/x86/debug_go116.go | 66 - .../sonic/internal/encoder/x86/debug_go117.go | 201 - .../bytedance/sonic/internal/encoder/x86/stbus.go | 54 - .../bytedance/sonic/internal/envs/decode.go | 24 - .../bytedance/sonic/internal/jit/arch_amd64.go | 67 - .../github.com/bytedance/sonic/internal/jit/asm.s | 0 .../sonic/internal/jit/assembler_amd64.go | 269 - .../bytedance/sonic/internal/jit/backend.go | 120 - .../bytedance/sonic/internal/jit/runtime.go | 49 - .../bytedance/sonic/internal/native/avx2/f32toa.go | 35 - .../sonic/internal/native/avx2/f32toa_subr.go | 46 - .../internal/native/avx2/f32toa_text_amd64.go | 1063 -- .../bytedance/sonic/internal/native/avx2/f64toa.go | 35 - .../sonic/internal/native/avx2/f64toa_subr.go | 46 - .../internal/native/avx2/f64toa_text_amd64.go | 2497 --- .../sonic/internal/native/avx2/get_by_path.go | 35 - .../sonic/internal/native/avx2/get_by_path_subr.go | 46 - .../internal/native/avx2/get_by_path_text_amd64.go | 6241 -------- .../sonic/internal/native/avx2/html_escape.go | 34 - .../sonic/internal/native/avx2/html_escape_subr.go | 45 - .../internal/native/avx2/html_escape_text_amd64.go | 833 - .../bytedance/sonic/internal/native/avx2/i64toa.go | 35 - .../sonic/internal/native/avx2/i64toa_subr.go | 47 - .../internal/native/avx2/i64toa_text_amd64.go | 631 - .../sonic/internal/native/avx2/lookup_small_key.go | 37 - .../internal/native/avx2/lookup_small_key_subr.go | 45 - .../native/avx2/lookup_small_key_text_amd64.go | 216 - .../bytedance/sonic/internal/native/avx2/lspace.go | 35 - .../sonic/internal/native/avx2/lspace_subr.go | 38 - .../internal/native/avx2/lspace_text_amd64.go | 113 - .../sonic/internal/native/avx2/native_export.go | 51 - .../internal/native/avx2/parse_with_padding.go | 36 - .../native/avx2/parse_with_padding_subr.go | 46 - .../native/avx2/parse_with_padding_text_amd64.go | 15284 ------------------- .../bytedance/sonic/internal/native/avx2/quote.go | 33 - .../sonic/internal/native/avx2/quote_subr.go | 46 - .../sonic/internal/native/avx2/quote_text_amd64.go | 1349 -- .../sonic/internal/native/avx2/skip_array.go | 35 - .../sonic/internal/native/avx2/skip_array_subr.go | 46 - .../internal/native/avx2/skip_array_text_amd64.go | 4348 ------ .../sonic/internal/native/avx2/skip_number.go | 34 - .../sonic/internal/native/avx2/skip_number_subr.go | 46 - .../internal/native/avx2/skip_number_text_amd64.go | 494 - .../sonic/internal/native/avx2/skip_object.go | 35 - .../sonic/internal/native/avx2/skip_object_subr.go | 46 - .../internal/native/avx2/skip_object_text_amd64.go | 4348 ------ .../sonic/internal/native/avx2/skip_one.go | 35 - .../sonic/internal/native/avx2/skip_one_fast.go | 35 - .../internal/native/avx2/skip_one_fast_subr.go | 46 - .../native/avx2/skip_one_fast_text_amd64.go | 957 -- .../sonic/internal/native/avx2/skip_one_subr.go | 46 - .../internal/native/avx2/skip_one_text_amd64.go | 3719 ----- .../bytedance/sonic/internal/native/avx2/u64toa.go | 34 - .../sonic/internal/native/avx2/u64toa_subr.go | 39 - .../internal/native/avx2/u64toa_text_amd64.go | 364 - .../sonic/internal/native/avx2/unquote.go | 34 - .../sonic/internal/native/avx2/unquote_subr.go | 46 - .../internal/native/avx2/unquote_text_amd64.go | 594 - .../sonic/internal/native/avx2/validate_one.go | 35 - .../internal/native/avx2/validate_one_subr.go | 46 - .../native/avx2/validate_one_text_amd64.go | 4348 ------ .../sonic/internal/native/avx2/validate_utf8.go | 37 - .../internal/native/avx2/validate_utf8_fast.go | 34 - .../native/avx2/validate_utf8_fast_subr.go | 42 - .../native/avx2/validate_utf8_fast_text_amd64.go | 752 - .../internal/native/avx2/validate_utf8_subr.go | 44 - .../native/avx2/validate_utf8_text_amd64.go | 193 - .../bytedance/sonic/internal/native/avx2/value.go | 33 - .../sonic/internal/native/avx2/value_subr.go | 46 - .../sonic/internal/native/avx2/value_text_amd64.go | 5660 ------- .../sonic/internal/native/avx2/vnumber.go | 33 - .../sonic/internal/native/avx2/vnumber_subr.go | 46 - .../internal/native/avx2/vnumber_text_amd64.go | 4283 ------ .../sonic/internal/native/avx2/vsigned.go | 33 - .../sonic/internal/native/avx2/vsigned_subr.go | 50 - .../internal/native/avx2/vsigned_text_amd64.go | 120 - .../sonic/internal/native/avx2/vstring.go | 33 - .../sonic/internal/native/avx2/vstring_subr.go | 46 - .../internal/native/avx2/vstring_text_amd64.go | 505 - .../sonic/internal/native/avx2/vunsigned.go | 33 - .../sonic/internal/native/avx2/vunsigned_subr.go | 57 - .../internal/native/avx2/vunsigned_text_amd64.go | 127 - .../sonic/internal/native/dispatch_amd64.go | 258 - .../sonic/internal/native/dispatch_arm64.go | 169 - .../bytedance/sonic/internal/native/f32toa.tmpl | 35 - .../bytedance/sonic/internal/native/f64toa.tmpl | 35 - .../sonic/internal/native/fastfloat_test.tmpl | 143 - .../sonic/internal/native/fastint_test.tmpl | 156 - .../sonic/internal/native/get_by_path.tmpl | 35 - .../sonic/internal/native/html_escape.tmpl | 34 - .../bytedance/sonic/internal/native/i64toa.tmpl | 35 - .../sonic/internal/native/lookup_small_key.tmpl | 37 - .../bytedance/sonic/internal/native/lspace.tmpl | 35 - .../sonic/internal/native/native_export.tmpl | 51 - .../sonic/internal/native/native_test.tmpl | 636 - .../sonic/internal/native/neon/f32toa_arm64.go | 29 - .../sonic/internal/native/neon/f32toa_arm64.s | 1019 -- .../internal/native/neon/f32toa_subr_arm64.go | 25 - .../sonic/internal/native/neon/f64toa_arm64.go | 29 - .../sonic/internal/native/neon/f64toa_arm64.s | 2492 --- .../internal/native/neon/f64toa_subr_arm64.go | 25 - .../internal/native/neon/get_by_path_arm64.go | 33 - .../sonic/internal/native/neon/get_by_path_arm64.s | 5627 ------- .../internal/native/neon/get_by_path_subr_arm64.go | 25 - .../internal/native/neon/html_escape_arm64.go | 35 - .../sonic/internal/native/neon/html_escape_arm64.s | 1406 -- .../internal/native/neon/html_escape_subr_arm64.go | 25 - .../sonic/internal/native/neon/i64toa_arm64.go | 29 - .../sonic/internal/native/neon/i64toa_arm64.s | 985 -- .../internal/native/neon/i64toa_subr_arm64.go | 25 - .../internal/native/neon/lookup_small_key_arm64.go | 31 - .../internal/native/neon/lookup_small_key_arm64.s | 354 - .../native/neon/lookup_small_key_subr_arm64.go | 25 - .../sonic/internal/native/neon/lspace_arm64.go | 35 - .../sonic/internal/native/neon/lspace_arm64.s | 68 - .../internal/native/neon/lspace_subr_arm64.go | 25 - .../internal/native/neon/native_export_arm64.go | 51 - .../native/neon/parse_with_padding_arm64.go | 30 - .../native/neon/parse_with_padding_arm64.s | 14122 ----------------- .../native/neon/parse_with_padding_subr_arm64.go | 25 - .../sonic/internal/native/neon/quote_arm64.go | 35 - .../sonic/internal/native/neon/quote_arm64.s | 2563 ---- .../sonic/internal/native/neon/quote_subr_arm64.go | 25 - .../sonic/internal/native/neon/skip_array_arm64.go | 35 - .../sonic/internal/native/neon/skip_array_arm64.s | 3481 ----- .../internal/native/neon/skip_array_subr_arm64.go | 25 - .../internal/native/neon/skip_number_arm64.go | 29 - .../sonic/internal/native/neon/skip_number_arm64.s | 373 - .../internal/native/neon/skip_number_subr_arm64.go | 25 - .../internal/native/neon/skip_object_arm64.go | 35 - .../sonic/internal/native/neon/skip_object_arm64.s | 3481 ----- .../internal/native/neon/skip_object_subr_arm64.go | 25 - .../sonic/internal/native/neon/skip_one_arm64.go | 35 - .../sonic/internal/native/neon/skip_one_arm64.s | 3294 ---- .../internal/native/neon/skip_one_fast_arm64.go | 29 - .../internal/native/neon/skip_one_fast_arm64.s | 998 -- .../native/neon/skip_one_fast_subr_arm64.go | 25 - .../internal/native/neon/skip_one_subr_arm64.go | 25 - .../sonic/internal/native/neon/u64toa_arm64.go | 29 - .../sonic/internal/native/neon/u64toa_arm64.s | 598 - .../internal/native/neon/u64toa_subr_arm64.go | 25 - .../sonic/internal/native/neon/unquote_arm64.go | 35 - .../sonic/internal/native/neon/unquote_arm64.s | 615 - .../internal/native/neon/unquote_subr_arm64.go | 25 - .../internal/native/neon/validate_one_arm64.go | 35 - .../internal/native/neon/validate_one_arm64.s | 3480 ----- .../native/neon/validate_one_subr_arm64.go | 25 - .../internal/native/neon/validate_utf8_arm64.go | 36 - .../internal/native/neon/validate_utf8_arm64.s | 222 - .../native/neon/validate_utf8_fast_arm64.go | 29 - .../native/neon/validate_utf8_fast_arm64.s | 182 - .../native/neon/validate_utf8_fast_subr_arm64.go | 25 - .../native/neon/validate_utf8_subr_arm64.go | 25 - .../sonic/internal/native/neon/value_arm64.go | 34 - .../sonic/internal/native/neon/value_arm64.s | 5968 -------- .../sonic/internal/native/neon/value_subr_arm64.go | 25 - .../sonic/internal/native/neon/vnumber_arm64.go | 34 - .../sonic/internal/native/neon/vnumber_arm64.s | 4690 ------ .../internal/native/neon/vnumber_subr_arm64.go | 25 - .../sonic/internal/native/neon/vsigned_arm64.go | 32 - .../sonic/internal/native/neon/vsigned_arm64.s | 156 - .../internal/native/neon/vsigned_subr_arm64.go | 25 - .../sonic/internal/native/neon/vstring_arm64.go | 32 - .../sonic/internal/native/neon/vstring_arm64.s | 628 - .../internal/native/neon/vstring_subr_arm64.go | 25 - .../sonic/internal/native/neon/vunsigned_arm64.go | 32 - .../sonic/internal/native/neon/vunsigned_arm64.s | 150 - .../internal/native/neon/vunsigned_subr_arm64.go | 25 - .../sonic/internal/native/parse_with_padding.tmpl | 36 - .../bytedance/sonic/internal/native/quote.tmpl | 33 - .../sonic/internal/native/recover_test.tmpl | 722 - .../sonic/internal/native/skip_array.tmpl | 35 - .../sonic/internal/native/skip_number.tmpl | 34 - .../sonic/internal/native/skip_object.tmpl | 35 - .../bytedance/sonic/internal/native/skip_one.tmpl | 35 - .../sonic/internal/native/skip_one_fast.tmpl | 35 - .../bytedance/sonic/internal/native/sse/f32toa.go | 35 - .../sonic/internal/native/sse/f32toa_subr.go | 46 - .../sonic/internal/native/sse/f32toa_text_amd64.go | 1052 -- .../bytedance/sonic/internal/native/sse/f64toa.go | 35 - .../sonic/internal/native/sse/f64toa_subr.go | 46 - .../sonic/internal/native/sse/f64toa_text_amd64.go | 2486 --- .../sonic/internal/native/sse/get_by_path.go | 35 - .../sonic/internal/native/sse/get_by_path_subr.go | 46 - .../internal/native/sse/get_by_path_text_amd64.go | 6154 -------- .../sonic/internal/native/sse/html_escape.go | 34 - .../sonic/internal/native/sse/html_escape_subr.go | 45 - .../internal/native/sse/html_escape_text_amd64.go | 635 - .../bytedance/sonic/internal/native/sse/i64toa.go | 35 - .../sonic/internal/native/sse/i64toa_subr.go | 47 - .../sonic/internal/native/sse/i64toa_text_amd64.go | 658 - .../sonic/internal/native/sse/lookup_small_key.go | 37 - .../internal/native/sse/lookup_small_key_subr.go | 45 - .../native/sse/lookup_small_key_text_amd64.go | 239 - .../bytedance/sonic/internal/native/sse/lspace.go | 35 - .../sonic/internal/native/sse/lspace_subr.go | 33 - .../sonic/internal/native/sse/lspace_text_amd64.go | 37 - .../sonic/internal/native/sse/native_export.go | 51 - .../internal/native/sse/parse_with_padding.go | 36 - .../internal/native/sse/parse_with_padding_subr.go | 46 - .../native/sse/parse_with_padding_text_amd64.go | 15013 ------------------ .../bytedance/sonic/internal/native/sse/quote.go | 33 - .../sonic/internal/native/sse/quote_subr.go | 46 - .../sonic/internal/native/sse/quote_text_amd64.go | 1100 -- .../sonic/internal/native/sse/skip_array.go | 35 - .../sonic/internal/native/sse/skip_array_subr.go | 46 - .../internal/native/sse/skip_array_text_amd64.go | 4017 ----- .../sonic/internal/native/sse/skip_number.go | 34 - .../sonic/internal/native/sse/skip_number_subr.go | 46 - .../internal/native/sse/skip_number_text_amd64.go | 351 - .../sonic/internal/native/sse/skip_object.go | 35 - .../sonic/internal/native/sse/skip_object_subr.go | 46 - .../internal/native/sse/skip_object_text_amd64.go | 4017 ----- .../sonic/internal/native/sse/skip_one.go | 35 - .../sonic/internal/native/sse/skip_one_fast.go | 35 - .../internal/native/sse/skip_one_fast_subr.go | 46 - .../native/sse/skip_one_fast_text_amd64.go | 1037 -- .../sonic/internal/native/sse/skip_one_subr.go | 46 - .../internal/native/sse/skip_one_text_amd64.go | 3844 ----- .../bytedance/sonic/internal/native/sse/u64toa.go | 34 - .../sonic/internal/native/sse/u64toa_subr.go | 39 - .../sonic/internal/native/sse/u64toa_text_amd64.go | 384 - .../bytedance/sonic/internal/native/sse/unquote.go | 34 - .../sonic/internal/native/sse/unquote_subr.go | 46 - .../internal/native/sse/unquote_text_amd64.go | 538 - .../sonic/internal/native/sse/validate_one.go | 35 - .../sonic/internal/native/sse/validate_one_subr.go | 46 - .../internal/native/sse/validate_one_text_amd64.go | 4017 ----- .../sonic/internal/native/sse/validate_utf8.go | 37 - .../internal/native/sse/validate_utf8_fast.go | 34 - .../internal/native/sse/validate_utf8_fast_subr.go | 41 - .../native/sse/validate_utf8_fast_text_amd64.go | 158 - .../internal/native/sse/validate_utf8_subr.go | 44 - .../native/sse/validate_utf8_text_amd64.go | 193 - .../bytedance/sonic/internal/native/sse/value.go | 33 - .../sonic/internal/native/sse/value_subr.go | 46 - .../sonic/internal/native/sse/value_text_amd64.go | 5439 ------- .../bytedance/sonic/internal/native/sse/vnumber.go | 33 - .../sonic/internal/native/sse/vnumber_subr.go | 46 - .../internal/native/sse/vnumber_text_amd64.go | 4161 ----- .../bytedance/sonic/internal/native/sse/vsigned.go | 33 - .../sonic/internal/native/sse/vsigned_subr.go | 50 - .../internal/native/sse/vsigned_text_amd64.go | 120 - .../bytedance/sonic/internal/native/sse/vstring.go | 33 - .../sonic/internal/native/sse/vstring_subr.go | 46 - .../internal/native/sse/vstring_text_amd64.go | 653 - .../sonic/internal/native/sse/vunsigned.go | 33 - .../sonic/internal/native/sse/vunsigned_subr.go | 57 - .../internal/native/sse/vunsigned_text_amd64.go | 127 - .../sonic/internal/native/traceback_test.mock_tmpl | 379 - .../bytedance/sonic/internal/native/types/types.go | 167 - .../bytedance/sonic/internal/native/u64toa.tmpl | 34 - .../bytedance/sonic/internal/native/unquote.tmpl | 34 - .../sonic/internal/native/validate_one.tmpl | 35 - .../sonic/internal/native/validate_utf8.tmpl | 37 - .../sonic/internal/native/validate_utf8_fast.tmpl | 34 - .../bytedance/sonic/internal/native/value.tmpl | 33 - .../bytedance/sonic/internal/native/vnumber.tmpl | 33 - .../bytedance/sonic/internal/native/vsigned.tmpl | 33 - .../bytedance/sonic/internal/native/vstring.tmpl | 33 - .../bytedance/sonic/internal/native/vunsigned.tmpl | 33 - .../bytedance/sonic/internal/optcaching/asm.s | 0 .../bytedance/sonic/internal/optcaching/fcache.go | 362 - .../bytedance/sonic/internal/resolver/asm.s | 0 .../bytedance/sonic/internal/resolver/resolver.go | 214 - .../sonic/internal/resolver/stubs_compat.go | 48 - .../sonic/internal/resolver/stubs_latest.go | 48 - .../bytedance/sonic/internal/rt/asm_amd64.s | 20 - .../bytedance/sonic/internal/rt/asm_compat.s | 10 - .../bytedance/sonic/internal/rt/assertI2I.go | 42 - .../bytedance/sonic/internal/rt/base64_amd64.go | 20 - .../bytedance/sonic/internal/rt/base64_compat.go | 20 - .../bytedance/sonic/internal/rt/fastconv.go | 175 - .../bytedance/sonic/internal/rt/fastmem.go | 155 - .../bytedance/sonic/internal/rt/fastvalue.go | 261 - .../github.com/bytedance/sonic/internal/rt/gcwb.go | 85 - .../bytedance/sonic/internal/rt/gcwb_legacy.go | 29 - .../bytedance/sonic/internal/rt/growslice.go | 36 - .../sonic/internal/rt/growslice_legacy.go | 27 - .../bytedance/sonic/internal/rt/int48.go | 36 - .../github.com/bytedance/sonic/internal/rt/pool.go | 31 - .../bytedance/sonic/internal/rt/stackmap.go | 181 - .../bytedance/sonic/internal/rt/stubs.go | 165 - .../bytedance/sonic/internal/rt/table.go | 118 - .../bytedance/sonic/internal/rt/types.go | 45 - .../bytedance/sonic/internal/utils/skip.go | 79 - 354 files changed, 199342 deletions(-) delete mode 100644 vendor/github.com/bytedance/sonic/internal/base64/b64_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/base64/b64_compat.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/caching/asm.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/caching/fcache.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/caching/hashing.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/caching/pcache.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/cpu/features.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/api/decoder.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/api/decoder_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/api/decoder_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/api/stream.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/consts/option.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/errors/errors.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/jitdec/asm.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/jitdec/asm_stubs_amd64_go117.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/jitdec/asm_stubs_amd64_go121.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/jitdec/assembler_regabi_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/jitdec/compiler.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/jitdec/debug.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/jitdec/decoder.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/jitdec/generic_regabi_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/jitdec/generic_regabi_amd64_test.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/jitdec/pools.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/jitdec/primitives.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/jitdec/stubs_go116.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/jitdec/stubs_go120.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/jitdec/types.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/jitdec/utils.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/optdec/compile_struct.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/optdec/compiler.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/optdec/const.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/optdec/context.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/optdec/decoder.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/optdec/errors.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/optdec/functor.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/optdec/helper.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/optdec/interface.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/optdec/map.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/optdec/native.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/optdec/node.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/optdec/slice.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/optdec/stringopts.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/optdec/structs.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/decoder/optdec/types.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/alg/mapiter.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/alg/opts.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/alg/primitives.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/alg/sort.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/alg/spec.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/alg/spec_compat.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/compiler.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/encode_norace.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/encode_race.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/encoder.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/ir/op.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/pools_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/pools_compt.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/stream.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/vars/cache.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/vars/const.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/vars/errors.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/vars/stack.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/vars/types.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/vm/stbus.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/vm/vm.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/x86/asm_stubs_amd64_go117.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/x86/asm_stubs_amd64_go121.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/x86/assembler_regabi_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/x86/debug_go116.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/x86/debug_go117.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/encoder/x86/stbus.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/envs/decode.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/jit/arch_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/jit/asm.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/jit/assembler_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/jit/backend.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/jit/runtime.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/f32toa.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/f32toa_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/f32toa_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/f64toa.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/f64toa_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/f64toa_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/get_by_path.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/get_by_path_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/get_by_path_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/html_escape.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/html_escape_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/html_escape_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/i64toa.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/i64toa_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/i64toa_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/lookup_small_key.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/lookup_small_key_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/lookup_small_key_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/lspace.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/lspace_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/lspace_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/native_export.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/parse_with_padding.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/parse_with_padding_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/parse_with_padding_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/quote.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/quote_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/quote_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/skip_array.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/skip_array_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/skip_array_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/skip_number.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/skip_number_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/skip_number_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/skip_object.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/skip_object_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/skip_object_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/skip_one.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/skip_one_fast.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/skip_one_fast_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/skip_one_fast_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/skip_one_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/skip_one_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/u64toa.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/u64toa_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/u64toa_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/unquote.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/unquote_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/unquote_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/validate_one.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/validate_one_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/validate_one_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/validate_utf8.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/validate_utf8_fast.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/validate_utf8_fast_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/validate_utf8_fast_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/validate_utf8_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/validate_utf8_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/value.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/value_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/value_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/vnumber.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/vnumber_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/vnumber_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/vsigned.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/vsigned_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/vsigned_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/vstring.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/vstring_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/vstring_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/vunsigned.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/vunsigned_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/vunsigned_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/dispatch_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/dispatch_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/f32toa.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/f64toa.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/fastfloat_test.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/fastint_test.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/get_by_path.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/html_escape.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/i64toa.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/lookup_small_key.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/lspace.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/native_export.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/native_test.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/f32toa_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/f32toa_arm64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/f32toa_subr_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/f64toa_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/f64toa_arm64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/f64toa_subr_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/get_by_path_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/get_by_path_arm64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/get_by_path_subr_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/html_escape_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/html_escape_arm64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/html_escape_subr_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/i64toa_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/i64toa_arm64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/i64toa_subr_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/lookup_small_key_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/lookup_small_key_arm64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/lookup_small_key_subr_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/lspace_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/lspace_arm64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/lspace_subr_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/native_export_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/parse_with_padding_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/parse_with_padding_arm64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/parse_with_padding_subr_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/quote_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/quote_arm64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/quote_subr_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/skip_array_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/skip_array_arm64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/skip_array_subr_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/skip_number_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/skip_number_arm64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/skip_number_subr_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/skip_object_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/skip_object_arm64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/skip_object_subr_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/skip_one_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/skip_one_arm64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/skip_one_fast_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/skip_one_fast_arm64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/skip_one_fast_subr_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/skip_one_subr_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/u64toa_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/u64toa_arm64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/u64toa_subr_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/unquote_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/unquote_arm64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/unquote_subr_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/validate_one_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/validate_one_arm64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/validate_one_subr_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/validate_utf8_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/validate_utf8_arm64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/validate_utf8_fast_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/validate_utf8_fast_arm64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/validate_utf8_fast_subr_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/validate_utf8_subr_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/value_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/value_arm64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/value_subr_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/vnumber_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/vnumber_arm64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/vnumber_subr_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/vsigned_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/vsigned_arm64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/vsigned_subr_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/vstring_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/vstring_arm64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/vstring_subr_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/vunsigned_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/vunsigned_arm64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/neon/vunsigned_subr_arm64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/parse_with_padding.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/quote.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/recover_test.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/skip_array.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/skip_number.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/skip_object.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/skip_one.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/skip_one_fast.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/f32toa.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/f32toa_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/f32toa_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/f64toa.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/f64toa_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/f64toa_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/get_by_path.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/get_by_path_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/get_by_path_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/html_escape.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/html_escape_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/html_escape_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/i64toa.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/i64toa_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/i64toa_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/lookup_small_key.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/lookup_small_key_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/lookup_small_key_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/lspace.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/lspace_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/lspace_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/native_export.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/parse_with_padding.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/parse_with_padding_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/parse_with_padding_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/quote.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/quote_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/quote_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/skip_array.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/skip_array_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/skip_array_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/skip_number.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/skip_number_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/skip_number_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/skip_object.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/skip_object_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/skip_object_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/skip_one.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/skip_one_fast.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/skip_one_fast_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/skip_one_fast_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/skip_one_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/skip_one_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/u64toa.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/u64toa_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/u64toa_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/unquote.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/unquote_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/unquote_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/validate_one.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/validate_one_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/validate_one_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/validate_utf8.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/validate_utf8_fast.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/validate_utf8_fast_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/validate_utf8_fast_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/validate_utf8_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/validate_utf8_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/value.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/value_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/value_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/vnumber.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/vnumber_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/vnumber_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/vsigned.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/vsigned_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/vsigned_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/vstring.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/vstring_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/vstring_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/vunsigned.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/vunsigned_subr.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/vunsigned_text_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/traceback_test.mock_tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/types/types.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/u64toa.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/unquote.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/validate_one.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/validate_utf8.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/validate_utf8_fast.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/value.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/vnumber.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/vsigned.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/vstring.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/native/vunsigned.tmpl delete mode 100644 vendor/github.com/bytedance/sonic/internal/optcaching/asm.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/optcaching/fcache.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/resolver/asm.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/resolver/resolver.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/resolver/stubs_compat.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/resolver/stubs_latest.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/rt/asm_amd64.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/rt/asm_compat.s delete mode 100644 vendor/github.com/bytedance/sonic/internal/rt/assertI2I.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/rt/base64_amd64.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/rt/base64_compat.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/rt/fastconv.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/rt/fastmem.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/rt/fastvalue.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/rt/gcwb.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/rt/gcwb_legacy.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/rt/growslice.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/rt/growslice_legacy.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/rt/int48.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/rt/pool.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/rt/stackmap.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/rt/stubs.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/rt/table.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/rt/types.go delete mode 100644 vendor/github.com/bytedance/sonic/internal/utils/skip.go (limited to 'vendor/github.com/bytedance/sonic/internal') diff --git a/vendor/github.com/bytedance/sonic/internal/base64/b64_amd64.go b/vendor/github.com/bytedance/sonic/internal/base64/b64_amd64.go deleted file mode 100644 index 43db80d8a..000000000 --- a/vendor/github.com/bytedance/sonic/internal/base64/b64_amd64.go +++ /dev/null @@ -1,46 +0,0 @@ -// +build amd64,go1.17,!go1.24 - -/** - * Copyright 2023 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package base64 - -import ( - "github.com/cloudwego/base64x" -) - -func DecodeBase64(src string) ([]byte, error) { - return base64x.StdEncoding.DecodeString(src) -} - -func EncodeBase64(buf []byte, src []byte) []byte { - if len(src) == 0 { - return append(buf, '"', '"') - } - buf = append(buf, '"') - need := base64x.StdEncoding.EncodedLen(len(src)) - if cap(buf) - len(buf) < need { - tmp := make([]byte, len(buf), len(buf) + need*2) - copy(tmp, buf) - buf = tmp - } - base64x.StdEncoding.Encode(buf[len(buf):cap(buf)], src) - buf = buf[:len(buf) + need] - buf = append(buf, '"') - return buf -} - - \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/internal/base64/b64_compat.go b/vendor/github.com/bytedance/sonic/internal/base64/b64_compat.go deleted file mode 100644 index 6688faa20..000000000 --- a/vendor/github.com/bytedance/sonic/internal/base64/b64_compat.go +++ /dev/null @@ -1,44 +0,0 @@ -// +build !amd64 !go1.17 go1.24 - -/* - * Copyright 2022 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package base64 - -import ( - "encoding/base64" -) - -func EncodeBase64(buf []byte, src []byte) []byte { - if len(src) == 0 { - return append(buf, '"', '"') - } - buf = append(buf, '"') - need := base64.StdEncoding.EncodedLen(len(src)) - if cap(buf) - len(buf) < need { - tmp := make([]byte, len(buf), len(buf) + need*2) - copy(tmp, buf) - buf = tmp - } - base64.StdEncoding.Encode(buf[len(buf):cap(buf)], src) - buf = buf[:len(buf) + need] - buf = append(buf, '"') - return buf -} - -func DecodeBase64(src string) ([]byte, error) { - return base64.StdEncoding.DecodeString(src) -} diff --git a/vendor/github.com/bytedance/sonic/internal/caching/asm.s b/vendor/github.com/bytedance/sonic/internal/caching/asm.s deleted file mode 100644 index e69de29bb..000000000 diff --git a/vendor/github.com/bytedance/sonic/internal/caching/fcache.go b/vendor/github.com/bytedance/sonic/internal/caching/fcache.go deleted file mode 100644 index 8cf62ff44..000000000 --- a/vendor/github.com/bytedance/sonic/internal/caching/fcache.go +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package caching - -import ( - `strings` - `unsafe` - - `github.com/bytedance/sonic/internal/rt` -) - -type FieldMap struct { - N uint64 - b unsafe.Pointer - m map[string]int -} - -type FieldEntry struct { - ID int - Name string - Hash uint64 -} - -const ( - FieldMap_N = int64(unsafe.Offsetof(FieldMap{}.N)) - FieldMap_b = int64(unsafe.Offsetof(FieldMap{}.b)) - FieldEntrySize = int64(unsafe.Sizeof(FieldEntry{})) -) - -func newBucket(n int) unsafe.Pointer { - v := make([]FieldEntry, n) - return (*rt.GoSlice)(unsafe.Pointer(&v)).Ptr -} - -func CreateFieldMap(n int) *FieldMap { - return &FieldMap { - N: uint64(n * 2), - b: newBucket(n * 2), // LoadFactor = 0.5 - m: make(map[string]int, n * 2), - } -} - -func (self *FieldMap) At(p uint64) *FieldEntry { - off := uintptr(p) * uintptr(FieldEntrySize) - return (*FieldEntry)(unsafe.Pointer(uintptr(self.b) + off)) -} - -// Get searches FieldMap by name. JIT generated assembly does NOT call this -// function, rather it implements its own version directly in assembly. So -// we must ensure this function stays in sync with the JIT generated one. -func (self *FieldMap) Get(name string) int { - h := StrHash(name) - p := h % self.N - s := self.At(p) - - /* find the element; - * the hash map is never full, so the loop will always terminate */ - for s.Hash != 0 { - if s.Hash == h && s.Name == name { - return s.ID - } else { - p = (p + 1) % self.N - s = self.At(p) - } - } - - /* not found */ - return -1 -} - -func (self *FieldMap) Set(name string, i int) { - h := StrHash(name) - p := h % self.N - s := self.At(p) - - /* searching for an empty slot; - * the hash map is never full, so the loop will always terminate */ - for s.Hash != 0 { - p = (p + 1) % self.N - s = self.At(p) - } - - /* set the value */ - s.ID = i - s.Hash = h - s.Name = name - - /* add the case-insensitive version, prefer the one with smaller field ID */ - key := strings.ToLower(name) - if v, ok := self.m[key]; !ok || i < v { - self.m[key] = i - } -} - -func (self *FieldMap) GetCaseInsensitive(name string) int { - if i, ok := self.m[strings.ToLower(name)]; ok { - return i - } else { - return -1 - } -} diff --git a/vendor/github.com/bytedance/sonic/internal/caching/hashing.go b/vendor/github.com/bytedance/sonic/internal/caching/hashing.go deleted file mode 100644 index b8876a410..000000000 --- a/vendor/github.com/bytedance/sonic/internal/caching/hashing.go +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package caching - -import ( - `unsafe` - - `github.com/bytedance/sonic/internal/rt` -) - -var ( - V_strhash = rt.UnpackEface(strhash) - S_strhash = *(*uintptr)(V_strhash.Value) -) - -//go:noescape -//go:linkname strhash runtime.strhash -func strhash(_ unsafe.Pointer, _ uintptr) uintptr - -func StrHash(s string) uint64 { - if v := strhash(unsafe.Pointer(&s), 0); v == 0 { - return 1 - } else { - return uint64(v) - } -} diff --git a/vendor/github.com/bytedance/sonic/internal/caching/pcache.go b/vendor/github.com/bytedance/sonic/internal/caching/pcache.go deleted file mode 100644 index 8c1224d9c..000000000 --- a/vendor/github.com/bytedance/sonic/internal/caching/pcache.go +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package caching - -import ( - `sync` - `sync/atomic` - `unsafe` - - `github.com/bytedance/sonic/internal/rt` -) - -/** Program Map **/ - -const ( - _LoadFactor = 0.5 - _InitCapacity = 4096 // must be a power of 2 -) - -type _ProgramMap struct { - n uint64 - m uint32 - b []_ProgramEntry -} - -type _ProgramEntry struct { - vt *rt.GoType - fn interface{} -} - -func newProgramMap() *_ProgramMap { - return &_ProgramMap { - n: 0, - m: _InitCapacity - 1, - b: make([]_ProgramEntry, _InitCapacity), - } -} - -func (self *_ProgramMap) copy() *_ProgramMap { - fork := &_ProgramMap{ - n: self.n, - m: self.m, - b: make([]_ProgramEntry, len(self.b)), - } - for i, f := range self.b { - fork.b[i] = f - } - return fork -} - -func (self *_ProgramMap) get(vt *rt.GoType) interface{} { - i := self.m + 1 - p := vt.Hash & self.m - - /* linear probing */ - for ; i > 0; i-- { - if b := self.b[p]; b.vt == vt { - return b.fn - } else if b.vt == nil { - break - } else { - p = (p + 1) & self.m - } - } - - /* not found */ - return nil -} - -func (self *_ProgramMap) add(vt *rt.GoType, fn interface{}) *_ProgramMap { - p := self.copy() - f := float64(atomic.LoadUint64(&p.n) + 1) / float64(p.m + 1) - - /* check for load factor */ - if f > _LoadFactor { - p = p.rehash() - } - - /* insert the value */ - p.insert(vt, fn) - return p -} - -func (self *_ProgramMap) rehash() *_ProgramMap { - c := (self.m + 1) << 1 - r := &_ProgramMap{m: c - 1, b: make([]_ProgramEntry, int(c))} - - /* rehash every entry */ - for i := uint32(0); i <= self.m; i++ { - if b := self.b[i]; b.vt != nil { - r.insert(b.vt, b.fn) - } - } - - /* rebuild successful */ - return r -} - -func (self *_ProgramMap) insert(vt *rt.GoType, fn interface{}) { - h := vt.Hash - p := h & self.m - - /* linear probing */ - for i := uint32(0); i <= self.m; i++ { - if b := &self.b[p]; b.vt != nil { - p += 1 - p &= self.m - } else { - b.vt = vt - b.fn = fn - atomic.AddUint64(&self.n, 1) - return - } - } - - /* should never happens */ - panic("no available slots") -} - -/** RCU Program Cache **/ - -type ProgramCache struct { - m sync.Mutex - p unsafe.Pointer -} - -func CreateProgramCache() *ProgramCache { - return &ProgramCache { - m: sync.Mutex{}, - p: unsafe.Pointer(newProgramMap()), - } -} - -func (self *ProgramCache) Get(vt *rt.GoType) interface{} { - return (*_ProgramMap)(atomic.LoadPointer(&self.p)).get(vt) -} - -func (self *ProgramCache) Compute(vt *rt.GoType, compute func(*rt.GoType, ... interface{}) (interface{}, error), ex ...interface{}) (interface{}, error) { - var err error - var val interface{} - - /* use defer to prevent inlining of this function */ - self.m.Lock() - defer self.m.Unlock() - - /* double check with write lock held */ - if val = self.Get(vt); val != nil { - return val, nil - } - - /* compute the value */ - if val, err = compute(vt, ex...); err != nil { - return nil, err - } - - /* update the RCU cache */ - atomic.StorePointer(&self.p, unsafe.Pointer((*_ProgramMap)(atomic.LoadPointer(&self.p)).add(vt, val))) - return val, nil -} diff --git a/vendor/github.com/bytedance/sonic/internal/cpu/features.go b/vendor/github.com/bytedance/sonic/internal/cpu/features.go deleted file mode 100644 index fd4dbda3c..000000000 --- a/vendor/github.com/bytedance/sonic/internal/cpu/features.go +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cpu - -import ( - `fmt` - `os` - - `github.com/klauspost/cpuid/v2` -) - -var ( - HasAVX2 = cpuid.CPU.Has(cpuid.AVX2) - HasSSE = cpuid.CPU.Has(cpuid.SSE) -) - -func init() { - switch v := os.Getenv("SONIC_MODE"); v { - case "" : break - case "auto" : break - case "noavx" : HasAVX2 = false - // will also disable avx, act as `noavx`, we remain it to make sure forward compatibility - case "noavx2" : HasAVX2 = false - default : panic(fmt.Sprintf("invalid mode: '%s', should be one of 'auto', 'noavx', 'noavx2'", v)) - } -} diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/api/decoder.go b/vendor/github.com/bytedance/sonic/internal/decoder/api/decoder.go deleted file mode 100644 index 0dc01998f..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/api/decoder.go +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package api - -import ( - `reflect` - - `github.com/bytedance/sonic/internal/native` - `github.com/bytedance/sonic/internal/native/types` - `github.com/bytedance/sonic/internal/decoder/consts` - `github.com/bytedance/sonic/internal/decoder/errors` - `github.com/bytedance/sonic/internal/rt` - `github.com/bytedance/sonic/option` -) - -const ( - _F_allow_control = consts.F_allow_control - _F_copy_string = consts.F_copy_string - _F_disable_unknown = consts.F_disable_unknown - _F_disable_urc = consts.F_disable_urc - _F_use_int64 = consts.F_use_int64 - _F_use_number = consts.F_use_number - _F_validate_string = consts.F_validate_string - - _MaxStack = consts.MaxStack - - OptionUseInt64 = consts.OptionUseInt64 - OptionUseNumber = consts.OptionUseNumber - OptionUseUnicodeErrors = consts.OptionUseUnicodeErrors - OptionDisableUnknown = consts.OptionDisableUnknown - OptionCopyString = consts.OptionCopyString - OptionValidateString = consts.OptionValidateString - OptionNoValidateJSON = consts.OptionNoValidateJSON -) - -type ( - Options = consts.Options - MismatchTypeError = errors.MismatchTypeError - SyntaxError = errors.SyntaxError -) - -func (self *Decoder) SetOptions(opts Options) { - if (opts & consts.OptionUseNumber != 0) && (opts & consts.OptionUseInt64 != 0) { - panic("can't set OptionUseInt64 and OptionUseNumber both!") - } - self.f = uint64(opts) -} - -// Decoder is the decoder context object -type Decoder struct { - i int - f uint64 - s string -} - -// NewDecoder creates a new decoder instance. -func NewDecoder(s string) *Decoder { - return &Decoder{s: s} -} - -// Pos returns the current decoding position. -func (self *Decoder) Pos() int { - return self.i -} - -func (self *Decoder) Reset(s string) { - self.s = s - self.i = 0 - // self.f = 0 -} - -func (self *Decoder) CheckTrailings() error { - pos := self.i - buf := self.s - /* skip all the trailing spaces */ - if pos != len(buf) { - for pos < len(buf) && (types.SPACE_MASK & (1 << buf[pos])) != 0 { - pos++ - } - } - - /* then it must be at EOF */ - if pos == len(buf) { - return nil - } - - /* junk after JSON value */ - return SyntaxError { - Src : buf, - Pos : pos, - Code : types.ERR_INVALID_CHAR, - } -} - - -// Decode parses the JSON-encoded data from current position and stores the result -// in the value pointed to by val. -func (self *Decoder) Decode(val interface{}) error { - return decodeImpl(&self.s, &self.i, self.f, val) -} - -// UseInt64 indicates the Decoder to unmarshal an integer into an interface{} as an -// int64 instead of as a float64. -func (self *Decoder) UseInt64() { - self.f |= 1 << _F_use_int64 - self.f &^= 1 << _F_use_number -} - -// UseNumber indicates the Decoder to unmarshal a number into an interface{} as a -// json.Number instead of as a float64. -func (self *Decoder) UseNumber() { - self.f &^= 1 << _F_use_int64 - self.f |= 1 << _F_use_number -} - -// UseUnicodeErrors indicates the Decoder to return an error when encounter invalid -// UTF-8 escape sequences. -func (self *Decoder) UseUnicodeErrors() { - self.f |= 1 << _F_disable_urc -} - -// DisallowUnknownFields indicates the Decoder to return an error when the destination -// is a struct and the input contains object keys which do not match any -// non-ignored, exported fields in the destination. -func (self *Decoder) DisallowUnknownFields() { - self.f |= 1 << _F_disable_unknown -} - -// CopyString indicates the Decoder to decode string values by copying instead of referring. -func (self *Decoder) CopyString() { - self.f |= 1 << _F_copy_string -} - -// ValidateString causes the Decoder to validate string values when decoding string value -// in JSON. Validation is that, returning error when unescaped control chars(0x00-0x1f) or -// invalid UTF-8 chars in the string value of JSON. -func (self *Decoder) ValidateString() { - self.f |= 1 << _F_validate_string -} - -// Pretouch compiles vt ahead-of-time to avoid JIT compilation on-the-fly, in -// order to reduce the first-hit latency. -// -// Opts are the compile options, for example, "option.WithCompileRecursiveDepth" is -// a compile option to set the depth of recursive compile for the nested struct type. -func Pretouch(vt reflect.Type, opts ...option.CompileOption) error { - return pretouchImpl(vt, opts...) -} - -// Skip skips only one json value, and returns first non-blank character position and its ending position if it is valid. -// Otherwise, returns negative error code using start and invalid character position using end -func Skip(data []byte) (start int, end int) { - s := rt.Mem2Str(data) - p := 0 - m := types.NewStateMachine() - ret := native.SkipOne(&s, &p, m, uint64(0)) - types.FreeStateMachine(m) - return ret, p -} diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/api/decoder_amd64.go b/vendor/github.com/bytedance/sonic/internal/decoder/api/decoder_amd64.go deleted file mode 100644 index 4e1c3f42c..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/api/decoder_amd64.go +++ /dev/null @@ -1,38 +0,0 @@ -//go:build go1.17 && !go1.24 -// +build go1.17,!go1.24 - -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package api - -import ( - "github.com/bytedance/sonic/internal/envs" - "github.com/bytedance/sonic/internal/decoder/jitdec" - "github.com/bytedance/sonic/internal/decoder/optdec" -) - -var ( - pretouchImpl = jitdec.Pretouch - decodeImpl = jitdec.Decode -) - - func init() { - if envs.UseOptDec { - pretouchImpl = optdec.Pretouch - decodeImpl = optdec.Decode - } - } diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/api/decoder_arm64.go b/vendor/github.com/bytedance/sonic/internal/decoder/api/decoder_arm64.go deleted file mode 100644 index 16e55965a..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/api/decoder_arm64.go +++ /dev/null @@ -1,38 +0,0 @@ -// +build go1.17,!go1.24 - -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package api - -import ( - `github.com/bytedance/sonic/internal/decoder/optdec` - `github.com/bytedance/sonic/internal/envs` -) - -var ( - pretouchImpl = optdec.Pretouch - decodeImpl = optdec.Decode -) - - -func init() { - // when in aarch64, we enable all optimization - envs.EnableOptDec() - envs.EnableFastMap() -} - - diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/api/stream.go b/vendor/github.com/bytedance/sonic/internal/decoder/api/stream.go deleted file mode 100644 index 8a8102dd5..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/api/stream.go +++ /dev/null @@ -1,248 +0,0 @@ -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package api - -import ( - `bytes` - `io` - `sync` - - `github.com/bytedance/sonic/internal/native` - `github.com/bytedance/sonic/internal/native/types` - `github.com/bytedance/sonic/internal/rt` - `github.com/bytedance/sonic/option` -) - -var ( - minLeftBufferShift uint = 1 -) - -// StreamDecoder is the decoder context object for streaming input. -type StreamDecoder struct { - r io.Reader - buf []byte - scanp int - scanned int64 - err error - Decoder -} - -var bufPool = sync.Pool{ - New: func () interface{} { - return make([]byte, 0, option.DefaultDecoderBufferSize) - }, -} - -func freeBytes(buf []byte) { - if rt.CanSizeResue(cap(buf)) { - bufPool.Put(buf[:0]) - } -} - -// NewStreamDecoder adapts to encoding/json.NewDecoder API. -// -// NewStreamDecoder returns a new decoder that reads from r. -func NewStreamDecoder(r io.Reader) *StreamDecoder { - return &StreamDecoder{r : r} -} - -// Decode decodes input stream into val with corresponding data. -// Redundantly bytes may be read and left in its buffer, and can be used at next call. -// Either io error from underlying io.Reader (except io.EOF) -// or syntax error from data will be recorded and stop subsequently decoding. -func (self *StreamDecoder) Decode(val interface{}) (err error) { - // read more data into buf - if self.More() { - var s = self.scanp - try_skip: - var e = len(self.buf) - var src = rt.Mem2Str(self.buf[s:e]) - // try skip - var x = 0; - if y := native.SkipOneFast(&src, &x); y < 0 { - if self.readMore() { - goto try_skip - } else { - err = SyntaxError{e, self.s, types.ParsingError(-s), ""} - self.setErr(err) - return - } - } else { - s = y + s - e = x + s - } - - // must copy string here for safety - self.Decoder.Reset(string(self.buf[s:e])) - err = self.Decoder.Decode(val) - if err != nil { - self.setErr(err) - return - } - - self.scanp = e - _, empty := self.scan() - if empty { - // no remain valid bytes, thus we just recycle buffer - mem := self.buf - self.buf = nil - freeBytes(mem) - } else { - // remain undecoded bytes, move them onto head - n := copy(self.buf, self.buf[self.scanp:]) - self.buf = self.buf[:n] - } - - self.scanned += int64(self.scanp) - self.scanp = 0 - } - - return self.err -} - -// InputOffset returns the input stream byte offset of the current decoder position. -// The offset gives the location of the end of the most recently returned token and the beginning of the next token. -func (self *StreamDecoder) InputOffset() int64 { - return self.scanned + int64(self.scanp) -} - -// Buffered returns a reader of the data remaining in the Decoder's buffer. -// The reader is valid until the next call to Decode. -func (self *StreamDecoder) Buffered() io.Reader { - return bytes.NewReader(self.buf[self.scanp:]) -} - -// More reports whether there is another element in the -// current array or object being parsed. -func (self *StreamDecoder) More() bool { - if self.err != nil { - return false - } - c, err := self.peek() - return err == nil && c != ']' && c != '}' -} - -// More reports whether there is another element in the -// current array or object being parsed. -func (self *StreamDecoder) readMore() bool { - if self.err != nil { - return false - } - - var err error - var n int - for { - // Grow buffer if not large enough. - l := len(self.buf) - realloc(&self.buf) - - n, err = self.r.Read(self.buf[l:cap(self.buf)]) - self.buf = self.buf[: l+n] - - self.scanp = l - _, empty := self.scan() - if !empty { - return true - } - - // buffer has been scanned, now report any error - if err != nil { - self.setErr(err) - return false - } - } -} - -func (self *StreamDecoder) setErr(err error) { - self.err = err - mem := self.buf[:0] - self.buf = nil - freeBytes(mem) -} - -func (self *StreamDecoder) peek() (byte, error) { - var err error - for { - c, empty := self.scan() - if !empty { - return byte(c), nil - } - // buffer has been scanned, now report any error - if err != nil { - self.setErr(err) - return 0, err - } - err = self.refill() - } -} - -func (self *StreamDecoder) scan() (byte, bool) { - for i := self.scanp; i < len(self.buf); i++ { - c := self.buf[i] - if isSpace(c) { - continue - } - self.scanp = i - return c, false - } - return 0, true -} - -func isSpace(c byte) bool { - return types.SPACE_MASK & (1 << c) != 0 -} - -func (self *StreamDecoder) refill() error { - // Make room to read more into the buffer. - // First slide down data already consumed. - if self.scanp > 0 { - self.scanned += int64(self.scanp) - n := copy(self.buf, self.buf[self.scanp:]) - self.buf = self.buf[:n] - self.scanp = 0 - } - - // Grow buffer if not large enough. - realloc(&self.buf) - - // Read. Delay error for next iteration (after scan). - n, err := self.r.Read(self.buf[len(self.buf):cap(self.buf)]) - self.buf = self.buf[0 : len(self.buf)+n] - - return err -} - -func realloc(buf *[]byte) bool { - l := uint(len(*buf)) - c := uint(cap(*buf)) - if c == 0 { - *buf = bufPool.Get().([]byte) - return true - } - if c - l <= c >> minLeftBufferShift { - e := l+(l>>minLeftBufferShift) - if e <= c { - e = c*2 - } - tmp := make([]byte, l, e) - copy(tmp, *buf) - *buf = tmp - return true - } - return false -} - diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/consts/option.go b/vendor/github.com/bytedance/sonic/internal/decoder/consts/option.go deleted file mode 100644 index 4195ebda7..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/consts/option.go +++ /dev/null @@ -1,36 +0,0 @@ - -package consts - -import ( - `github.com/bytedance/sonic/internal/native/types` -) - - -const ( - F_use_int64 = 0 - F_disable_urc = 2 - F_disable_unknown = 3 - F_copy_string = 4 - - - F_use_number = types.B_USE_NUMBER - F_validate_string = types.B_VALIDATE_STRING - F_allow_control = types.B_ALLOW_CONTROL - F_no_validate_json = types.B_NO_VALIDATE_JSON -) - -type Options uint64 - -const ( - OptionUseInt64 Options = 1 << F_use_int64 - OptionUseNumber Options = 1 << F_use_number - OptionUseUnicodeErrors Options = 1 << F_disable_urc - OptionDisableUnknown Options = 1 << F_disable_unknown - OptionCopyString Options = 1 << F_copy_string - OptionValidateString Options = 1 << F_validate_string - OptionNoValidateJSON Options = 1 << F_no_validate_json -) - -const ( - MaxStack = 4096 -) \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/errors/errors.go b/vendor/github.com/bytedance/sonic/internal/decoder/errors/errors.go deleted file mode 100644 index 9f05e8b6a..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/errors/errors.go +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package errors - -import ( - `encoding/json` - `errors` - `fmt` - `reflect` - `strconv` - `strings` - - `github.com/bytedance/sonic/internal/native/types` - `github.com/bytedance/sonic/internal/rt` -) - -type SyntaxError struct { - Pos int - Src string - Code types.ParsingError - Msg string -} - -func (self SyntaxError) Error() string { - return fmt.Sprintf("%q", self.Description()) -} - -func (self SyntaxError) Description() string { - return "Syntax error " + self.description() -} - -func (self SyntaxError) description() string { - /* check for empty source */ - if self.Src == "" { - return fmt.Sprintf("no sources available, the input json is empty: %#v", self) - } - - p, x, q, y := calcBounds(len(self.Src), self.Pos) - - /* compose the error description */ - return fmt.Sprintf( - "at index %d: %s\n\n\t%s\n\t%s^%s\n", - self.Pos, - self.Message(), - self.Src[p:q], - strings.Repeat(".", x), - strings.Repeat(".", y), - ) -} - -func calcBounds(size int, pos int) (lbound int, lwidth int, rbound int, rwidth int) { - if pos >= size || pos < 0 { - return 0, 0, size, 0 - } - - i := 16 - lbound = pos - i - rbound = pos + i - - /* prevent slicing before the beginning */ - if lbound < 0 { - lbound, rbound, i = 0, rbound - lbound, i + lbound - } - - /* prevent slicing beyond the end */ - if n := size; rbound > n { - n = rbound - n - rbound = size - - /* move the left bound if possible */ - if lbound > n { - i += n - lbound -= n - } - } - - /* left and right length */ - lwidth = clamp_zero(i) - rwidth = clamp_zero(rbound - lbound - i - 1) - - return -} - -func (self SyntaxError) Message() string { - if self.Msg == "" { - return self.Code.Message() - } - return self.Msg -} - -func clamp_zero(v int) int { - if v < 0 { - return 0 - } else { - return v - } -} - -/** JIT Error Helpers **/ - -var StackOverflow = &json.UnsupportedValueError { - Str : "Value nesting too deep", - Value : reflect.ValueOf("..."), -} - -func ErrorWrap(src string, pos int, code types.ParsingError) error { - return *error_wrap_heap(src, pos, code) -} - -//go:noinline -func error_wrap_heap(src string, pos int, code types.ParsingError) *SyntaxError { - return &SyntaxError { - Pos : pos, - Src : src, - Code : code, - } -} - -func ErrorType(vt *rt.GoType) error { - return &json.UnmarshalTypeError{Type: vt.Pack()} -} - -type MismatchTypeError struct { - Pos int - Src string - Type reflect.Type -} - -func swithchJSONType (src string, pos int) string { - var val string - switch src[pos] { - case 'f': fallthrough - case 't': val = "bool" - case '"': val = "string" - case '{': val = "object" - case '[': val = "array" - case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': val = "number" - } - return val -} - -func (self MismatchTypeError) Error() string { - se := SyntaxError { - Pos : self.Pos, - Src : self.Src, - Code : types.ERR_MISMATCH, - } - return fmt.Sprintf("Mismatch type %s with value %s %q", self.Type.String(), swithchJSONType(self.Src, self.Pos), se.description()) -} - -func (self MismatchTypeError) Description() string { - se := SyntaxError { - Pos : self.Pos, - Src : self.Src, - Code : types.ERR_MISMATCH, - } - return fmt.Sprintf("Mismatch type %s with value %s %s", self.Type.String(), swithchJSONType(self.Src, self.Pos), se.description()) -} - -func ErrorMismatch(src string, pos int, vt *rt.GoType) error { - return &MismatchTypeError { - Pos : pos, - Src : src, - Type : vt.Pack(), - } -} - -func ErrorField(name string) error { - return errors.New("json: unknown field " + strconv.Quote(name)) -} - -func ErrorValue(value string, vtype reflect.Type) error { - return &json.UnmarshalTypeError { - Type : vtype, - Value : value, - } -} diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/asm.s b/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/asm.s deleted file mode 100644 index e69de29bb..000000000 diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/asm_stubs_amd64_go117.go b/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/asm_stubs_amd64_go117.go deleted file mode 100644 index 48f73e5bf..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/asm_stubs_amd64_go117.go +++ /dev/null @@ -1,126 +0,0 @@ -// +build go1.17,!go1.21 - -// Copyright 2023 CloudWeGo Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jitdec - -import ( - `strconv` - `unsafe` - - `github.com/bytedance/sonic/internal/jit` - `github.com/twitchyliquid64/golang-asm/obj` - `github.com/twitchyliquid64/golang-asm/obj/x86` -) - -//go:linkname _runtime_writeBarrier runtime.writeBarrier -var _runtime_writeBarrier uintptr - -//go:linkname gcWriteBarrierAX runtime.gcWriteBarrier -func gcWriteBarrierAX() - -var ( - _V_writeBarrier = jit.Imm(int64(uintptr(unsafe.Pointer(&_runtime_writeBarrier)))) - - _F_gcWriteBarrierAX = jit.Func(gcWriteBarrierAX) -) - -func (self *_Assembler) WritePtrAX(i int, rec obj.Addr, saveDI bool) { - self.Emit("MOVQ", _V_writeBarrier, _R9) - self.Emit("CMPL", jit.Ptr(_R9, 0), jit.Imm(0)) - self.Sjmp("JE", "_no_writeBarrier" + strconv.Itoa(i) + "_{n}") - if saveDI { - self.save(_DI) - } - self.Emit("LEAQ", rec, _DI) - self.call(_F_gcWriteBarrierAX) - if saveDI { - self.load(_DI) - } - self.Sjmp("JMP", "_end_writeBarrier" + strconv.Itoa(i) + "_{n}") - self.Link("_no_writeBarrier" + strconv.Itoa(i) + "_{n}") - self.Emit("MOVQ", _AX, rec) - self.Link("_end_writeBarrier" + strconv.Itoa(i) + "_{n}") -} - -func (self *_Assembler) WriteRecNotAX(i int, ptr obj.Addr, rec obj.Addr, saveDI bool, saveAX bool) { - if rec.Reg == x86.REG_AX || rec.Index == x86.REG_AX { - panic("rec contains AX!") - } - self.Emit("MOVQ", _V_writeBarrier, _R9) - self.Emit("CMPL", jit.Ptr(_R9, 0), jit.Imm(0)) - self.Sjmp("JE", "_no_writeBarrier" + strconv.Itoa(i) + "_{n}") - if saveAX { - self.Emit("XCHGQ", ptr, _AX) - } else { - self.Emit("MOVQ", ptr, _AX) - } - if saveDI { - self.save(_DI) - } - self.Emit("LEAQ", rec, _DI) - self.call(_F_gcWriteBarrierAX) - if saveDI { - self.load(_DI) - } - if saveAX { - self.Emit("XCHGQ", ptr, _AX) - } - self.Sjmp("JMP", "_end_writeBarrier" + strconv.Itoa(i) + "_{n}") - self.Link("_no_writeBarrier" + strconv.Itoa(i) + "_{n}") - self.Emit("MOVQ", ptr, rec) - self.Link("_end_writeBarrier" + strconv.Itoa(i) + "_{n}") -} - - -func (self *_ValueDecoder) WritePtrAX(i int, rec obj.Addr, saveDI bool) { - self.Emit("MOVQ", _V_writeBarrier, _R9) - self.Emit("CMPL", jit.Ptr(_R9, 0), jit.Imm(0)) - self.Sjmp("JE", "_no_writeBarrier" + strconv.Itoa(i) + "_{n}") - if saveDI { - self.save(_DI) - } - self.Emit("LEAQ", rec, _DI) - self.call(_F_gcWriteBarrierAX) - if saveDI { - self.load(_DI) - } - self.Sjmp("JMP", "_end_writeBarrier" + strconv.Itoa(i) + "_{n}") - self.Link("_no_writeBarrier" + strconv.Itoa(i) + "_{n}") - self.Emit("MOVQ", _AX, rec) - self.Link("_end_writeBarrier" + strconv.Itoa(i) + "_{n}") -} - -func (self *_ValueDecoder) WriteRecNotAX(i int, ptr obj.Addr, rec obj.Addr, saveDI bool) { - if rec.Reg == x86.REG_AX || rec.Index == x86.REG_AX { - panic("rec contains AX!") - } - self.Emit("MOVQ", _V_writeBarrier, _AX) - self.Emit("CMPL", jit.Ptr(_AX, 0), jit.Imm(0)) - self.Sjmp("JE", "_no_writeBarrier" + strconv.Itoa(i) + "_{n}") - self.Emit("MOVQ", ptr, _AX) - if saveDI { - self.save(_DI) - } - self.Emit("LEAQ", rec, _DI) - self.call(_F_gcWriteBarrierAX) - if saveDI { - self.load(_DI) - } - self.Sjmp("JMP", "_end_writeBarrier" + strconv.Itoa(i) + "_{n}") - self.Link("_no_writeBarrier" + strconv.Itoa(i) + "_{n}") - self.Emit("MOVQ", ptr, rec) - self.Link("_end_writeBarrier" + strconv.Itoa(i) + "_{n}") -} diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/asm_stubs_amd64_go121.go b/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/asm_stubs_amd64_go121.go deleted file mode 100644 index cbec3d248..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/asm_stubs_amd64_go121.go +++ /dev/null @@ -1,132 +0,0 @@ -// +build go1.21,!go1.24 - -// Copyright 2023 CloudWeGo Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package jitdec - -import ( - `strconv` - `unsafe` - - `github.com/bytedance/sonic/internal/jit` - `github.com/twitchyliquid64/golang-asm/obj` - `github.com/twitchyliquid64/golang-asm/obj/x86` -) - -//go:linkname _runtime_writeBarrier runtime.writeBarrier -var _runtime_writeBarrier uintptr - -//go:nosplit -//go:linkname gcWriteBarrier2 runtime.gcWriteBarrier2 -func gcWriteBarrier2() - -// Notice: gcWriteBarrier must use R11 register!! -var _R11 = _IC - -var ( - _V_writeBarrier = jit.Imm(int64(uintptr(unsafe.Pointer(&_runtime_writeBarrier)))) - - _F_gcWriteBarrier2 = jit.Func(gcWriteBarrier2) -) - -func (self *_Assembler) WritePtrAX(i int, rec obj.Addr, saveDI bool) { - self.Emit("MOVQ", _V_writeBarrier, _R9) - self.Emit("CMPL", jit.Ptr(_R9, 0), jit.Imm(0)) - self.Sjmp("JE", "_no_writeBarrier" + strconv.Itoa(i) + "_{n}") - if saveDI { - self.save(_DI, _R11) - } else { - self.save(_R11) - } - self.Emit("MOVQ", _F_gcWriteBarrier2, _R11) - self.Rjmp("CALL", _R11) - self.Emit("MOVQ", _AX, jit.Ptr(_R11, 0)) - self.Emit("MOVQ", rec, _DI) - self.Emit("MOVQ", _DI, jit.Ptr(_R11, 8)) - if saveDI { - self.load(_DI, _R11) - } else { - self.load(_R11) - } - self.Link("_no_writeBarrier" + strconv.Itoa(i) + "_{n}") - self.Emit("MOVQ", _AX, rec) -} - -func (self *_Assembler) WriteRecNotAX(i int, ptr obj.Addr, rec obj.Addr, saveDI bool, saveAX bool) { - if rec.Reg == x86.REG_AX || rec.Index == x86.REG_AX { - panic("rec contains AX!") - } - self.Emit("MOVQ", _V_writeBarrier, _R9) - self.Emit("CMPL", jit.Ptr(_R9, 0), jit.Imm(0)) - self.Sjmp("JE", "_no_writeBarrier" + strconv.Itoa(i) + "_{n}") - if saveAX { - self.save(_AX, _R11) - } else { - self.save(_R11) - } - self.Emit("MOVQ", _F_gcWriteBarrier2, _R11) - self.Rjmp("CALL", _R11) - self.Emit("MOVQ", ptr, jit.Ptr(_R11, 0)) - self.Emit("MOVQ", rec, _AX) - self.Emit("MOVQ", _AX, jit.Ptr(_R11, 8)) - if saveAX { - self.load(_AX, _R11) - } else { - self.load(_R11) - } - self.Link("_no_writeBarrier" + strconv.Itoa(i) + "_{n}") - self.Emit("MOVQ", ptr, rec) -} - -func (self *_ValueDecoder) WritePtrAX(i int, rec obj.Addr, saveDI bool) { - self.Emit("MOVQ", _V_writeBarrier, _R9) - self.Emit("CMPL", jit.Ptr(_R9, 0), jit.Imm(0)) - self.Sjmp("JE", "_no_writeBarrier" + strconv.Itoa(i) + "_{n}") - if saveDI { - self.save(_DI, _R11) - } else { - self.save(_R11) - } - self.Emit("MOVQ", _F_gcWriteBarrier2, _R11) - self.Rjmp("CALL", _R11) - self.Emit("MOVQ", _AX, jit.Ptr(_R11, 0)) - self.Emit("MOVQ", rec, _DI) - self.Emit("MOVQ", _DI, jit.Ptr(_R11, 8)) - if saveDI { - self.load(_DI, _R11) - } else { - self.load(_R11) - } - self.Link("_no_writeBarrier" + strconv.Itoa(i) + "_{n}") - self.Emit("MOVQ", _AX, rec) -} - -func (self *_ValueDecoder) WriteRecNotAX(i int, ptr obj.Addr, rec obj.Addr, saveDI bool) { - if rec.Reg == x86.REG_AX || rec.Index == x86.REG_AX { - panic("rec contains AX!") - } - self.Emit("MOVQ", _V_writeBarrier, _AX) - self.Emit("CMPL", jit.Ptr(_AX, 0), jit.Imm(0)) - self.Sjmp("JE", "_no_writeBarrier" + strconv.Itoa(i) + "_{n}") - self.save(_R11) - self.Emit("MOVQ", _F_gcWriteBarrier2, _R11) - self.Rjmp("CALL", _R11) - self.Emit("MOVQ", ptr, jit.Ptr(_R11, 0)) - self.Emit("MOVQ", rec, _AX) - self.Emit("MOVQ", _AX, jit.Ptr(_R11, 8)) - self.load(_R11) - self.Link("_no_writeBarrier" + strconv.Itoa(i) + "_{n}") - self.Emit("MOVQ", ptr, rec) -} \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/assembler_regabi_amd64.go b/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/assembler_regabi_amd64.go deleted file mode 100644 index 42b8b502f..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/assembler_regabi_amd64.go +++ /dev/null @@ -1,1971 +0,0 @@ -//go:build go1.17 && !go1.24 -// +build go1.17,!go1.24 - -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package jitdec - -import ( - "encoding/json" - "fmt" - "math" - "reflect" - "strings" - "unsafe" - - "github.com/bytedance/sonic/internal/caching" - "github.com/bytedance/sonic/internal/jit" - "github.com/bytedance/sonic/internal/native" - "github.com/bytedance/sonic/internal/native/types" - "github.com/bytedance/sonic/internal/rt" - "github.com/twitchyliquid64/golang-asm/obj" -) - -/** Register Allocations - * - * State Registers: - * - * %r13 : stack base - * %r10 : input pointer - * %r12 : input length - * %r11 : input cursor - * %r15 : value pointer - * - * Error Registers: - * - * %rax : error type register - * %rbx : error pointer register - */ - -/** Function Prototype & Stack Map - * - * func (s string, ic int, vp unsafe.Pointer, sb *_Stack, fv uint64, sv string) (rc int, err error) - * - * s.buf : (FP) - * s.len : 8(FP) - * ic : 16(FP) - * vp : 24(FP) - * sb : 32(FP) - * fv : 40(FP) - * sv : 56(FP) - * err.vt : 72(FP) - * err.vp : 80(FP) - */ - -const ( - _FP_args = 72 // 72 bytes to pass and spill register arguments - _FP_fargs = 80 // 80 bytes for passing arguments to other Go functions - _FP_saves = 48 // 48 bytes for saving the registers before CALL instructions - _FP_locals = 144 // 144 bytes for local variables -) - -const ( - _FP_offs = _FP_fargs + _FP_saves + _FP_locals - _FP_size = _FP_offs + 8 // 8 bytes for the parent frame pointer - _FP_base = _FP_size + 8 // 8 bytes for the return address -) - -const ( - _IM_null = 0x6c6c756e // 'null' - _IM_true = 0x65757274 // 'true' - _IM_alse = 0x65736c61 // 'alse' ('false' without the 'f') -) - -const ( - _BM_space = (1 << ' ') | (1 << '\t') | (1 << '\r') | (1 << '\n') -) - -const ( - _MODE_JSON = 1 << 3 // base64 mode -) - -const ( - _LB_error = "_error" - _LB_im_error = "_im_error" - _LB_eof_error = "_eof_error" - _LB_type_error = "_type_error" - _LB_field_error = "_field_error" - _LB_range_error = "_range_error" - _LB_stack_error = "_stack_error" - _LB_base64_error = "_base64_error" - _LB_unquote_error = "_unquote_error" - _LB_parsing_error = "_parsing_error" - _LB_parsing_error_v = "_parsing_error_v" - _LB_mismatch_error = "_mismatch_error" -) - -const ( - _LB_char_0_error = "_char_0_error" - _LB_char_1_error = "_char_1_error" - _LB_char_2_error = "_char_2_error" - _LB_char_3_error = "_char_3_error" - _LB_char_4_error = "_char_4_error" - _LB_char_m2_error = "_char_m2_error" - _LB_char_m3_error = "_char_m3_error" -) - -const ( - _LB_skip_one = "_skip_one" - _LB_skip_key_value = "_skip_key_value" -) - -var ( - _AX = jit.Reg("AX") - _BX = jit.Reg("BX") - _CX = jit.Reg("CX") - _DX = jit.Reg("DX") - _DI = jit.Reg("DI") - _SI = jit.Reg("SI") - _BP = jit.Reg("BP") - _SP = jit.Reg("SP") - _R8 = jit.Reg("R8") - _R9 = jit.Reg("R9") - _X0 = jit.Reg("X0") - _X1 = jit.Reg("X1") - _X15 = jit.Reg("X15") -) - -var ( - _IP = jit.Reg("R10") // saved on BP when callc - _IC = jit.Reg("R11") // saved on BX when call_c - _IL = jit.Reg("R12") - _ST = jit.Reg("R13") - _VP = jit.Reg("R15") -) - -var ( - _DF = jit.Reg("AX") // reuse AX in generic decoder for flags - _ET = jit.Reg("AX") - _EP = jit.Reg("BX") -) - - - -var ( - _ARG_s = _ARG_sp - _ARG_sp = jit.Ptr(_SP, _FP_base + 0) - _ARG_sl = jit.Ptr(_SP, _FP_base + 8) - _ARG_ic = jit.Ptr(_SP, _FP_base + 16) - _ARG_vp = jit.Ptr(_SP, _FP_base + 24) - _ARG_sb = jit.Ptr(_SP, _FP_base + 32) - _ARG_fv = jit.Ptr(_SP, _FP_base + 40) -) - -var ( - _ARG_sv = _ARG_sv_p - _ARG_sv_p = jit.Ptr(_SP, _FP_base + 48) - _ARG_sv_n = jit.Ptr(_SP, _FP_base + 56) - _ARG_vk = jit.Ptr(_SP, _FP_base + 64) -) - -var ( - _VAR_st = _VAR_st_Vt - _VAR_sr = jit.Ptr(_SP, _FP_fargs + _FP_saves) -) - -var ( - _VAR_st_Vt = jit.Ptr(_SP, _FP_fargs + _FP_saves + 0) - _VAR_st_Dv = jit.Ptr(_SP, _FP_fargs + _FP_saves + 8) - _VAR_st_Iv = jit.Ptr(_SP, _FP_fargs + _FP_saves + 16) - _VAR_st_Ep = jit.Ptr(_SP, _FP_fargs + _FP_saves + 24) - _VAR_st_Db = jit.Ptr(_SP, _FP_fargs + _FP_saves + 32) - _VAR_st_Dc = jit.Ptr(_SP, _FP_fargs + _FP_saves + 40) -) - -var ( - _VAR_ss_AX = jit.Ptr(_SP, _FP_fargs + _FP_saves + 48) - _VAR_ss_CX = jit.Ptr(_SP, _FP_fargs + _FP_saves + 56) - _VAR_ss_SI = jit.Ptr(_SP, _FP_fargs + _FP_saves + 64) - _VAR_ss_R8 = jit.Ptr(_SP, _FP_fargs + _FP_saves + 72) - _VAR_ss_R9 = jit.Ptr(_SP, _FP_fargs + _FP_saves + 80) -) - -var ( - _VAR_bs_p = jit.Ptr(_SP, _FP_fargs + _FP_saves + 88) - _VAR_bs_n = jit.Ptr(_SP, _FP_fargs + _FP_saves + 96) - _VAR_bs_LR = jit.Ptr(_SP, _FP_fargs + _FP_saves + 104) -) - -var _VAR_fl = jit.Ptr(_SP, _FP_fargs + _FP_saves + 112) - -var ( - _VAR_et = jit.Ptr(_SP, _FP_fargs + _FP_saves + 120) // save mismatched type - _VAR_pc = jit.Ptr(_SP, _FP_fargs + _FP_saves + 128) // save skip return pc - _VAR_ic = jit.Ptr(_SP, _FP_fargs + _FP_saves + 136) // save mismatched position -) - -type _Assembler struct { - jit.BaseAssembler - p _Program - name string -} - -func newAssembler(p _Program) *_Assembler { - return new(_Assembler).Init(p) -} - -/** Assembler Interface **/ - -func (self *_Assembler) Load() _Decoder { - return ptodec(self.BaseAssembler.Load("decode_"+self.name, _FP_size, _FP_args, argPtrs, localPtrs)) -} - -func (self *_Assembler) Init(p _Program) *_Assembler { - self.p = p - self.BaseAssembler.Init(self.compile) - return self -} - -func (self *_Assembler) compile() { - self.prologue() - self.instrs() - self.epilogue() - self.copy_string() - self.escape_string() - self.escape_string_twice() - self.skip_one() - self.skip_key_value() - self.type_error() - self.mismatch_error() - self.field_error() - self.range_error() - self.stack_error() - self.base64_error() - self.parsing_error() -} - -/** Assembler Stages **/ - -var _OpFuncTab = [256]func(*_Assembler, *_Instr) { - _OP_any : (*_Assembler)._asm_OP_any, - _OP_dyn : (*_Assembler)._asm_OP_dyn, - _OP_str : (*_Assembler)._asm_OP_str, - _OP_bin : (*_Assembler)._asm_OP_bin, - _OP_bool : (*_Assembler)._asm_OP_bool, - _OP_num : (*_Assembler)._asm_OP_num, - _OP_i8 : (*_Assembler)._asm_OP_i8, - _OP_i16 : (*_Assembler)._asm_OP_i16, - _OP_i32 : (*_Assembler)._asm_OP_i32, - _OP_i64 : (*_Assembler)._asm_OP_i64, - _OP_u8 : (*_Assembler)._asm_OP_u8, - _OP_u16 : (*_Assembler)._asm_OP_u16, - _OP_u32 : (*_Assembler)._asm_OP_u32, - _OP_u64 : (*_Assembler)._asm_OP_u64, - _OP_f32 : (*_Assembler)._asm_OP_f32, - _OP_f64 : (*_Assembler)._asm_OP_f64, - _OP_unquote : (*_Assembler)._asm_OP_unquote, - _OP_nil_1 : (*_Assembler)._asm_OP_nil_1, - _OP_nil_2 : (*_Assembler)._asm_OP_nil_2, - _OP_nil_3 : (*_Assembler)._asm_OP_nil_3, - _OP_deref : (*_Assembler)._asm_OP_deref, - _OP_index : (*_Assembler)._asm_OP_index, - _OP_is_null : (*_Assembler)._asm_OP_is_null, - _OP_is_null_quote : (*_Assembler)._asm_OP_is_null_quote, - _OP_map_init : (*_Assembler)._asm_OP_map_init, - _OP_map_key_i8 : (*_Assembler)._asm_OP_map_key_i8, - _OP_map_key_i16 : (*_Assembler)._asm_OP_map_key_i16, - _OP_map_key_i32 : (*_Assembler)._asm_OP_map_key_i32, - _OP_map_key_i64 : (*_Assembler)._asm_OP_map_key_i64, - _OP_map_key_u8 : (*_Assembler)._asm_OP_map_key_u8, - _OP_map_key_u16 : (*_Assembler)._asm_OP_map_key_u16, - _OP_map_key_u32 : (*_Assembler)._asm_OP_map_key_u32, - _OP_map_key_u64 : (*_Assembler)._asm_OP_map_key_u64, - _OP_map_key_f32 : (*_Assembler)._asm_OP_map_key_f32, - _OP_map_key_f64 : (*_Assembler)._asm_OP_map_key_f64, - _OP_map_key_str : (*_Assembler)._asm_OP_map_key_str, - _OP_map_key_utext : (*_Assembler)._asm_OP_map_key_utext, - _OP_map_key_utext_p : (*_Assembler)._asm_OP_map_key_utext_p, - _OP_array_skip : (*_Assembler)._asm_OP_array_skip, - _OP_array_clear : (*_Assembler)._asm_OP_array_clear, - _OP_array_clear_p : (*_Assembler)._asm_OP_array_clear_p, - _OP_slice_init : (*_Assembler)._asm_OP_slice_init, - _OP_slice_append : (*_Assembler)._asm_OP_slice_append, - _OP_object_next : (*_Assembler)._asm_OP_object_next, - _OP_struct_field : (*_Assembler)._asm_OP_struct_field, - _OP_unmarshal : (*_Assembler)._asm_OP_unmarshal, - _OP_unmarshal_p : (*_Assembler)._asm_OP_unmarshal_p, - _OP_unmarshal_text : (*_Assembler)._asm_OP_unmarshal_text, - _OP_unmarshal_text_p : (*_Assembler)._asm_OP_unmarshal_text_p, - _OP_lspace : (*_Assembler)._asm_OP_lspace, - _OP_match_char : (*_Assembler)._asm_OP_match_char, - _OP_check_char : (*_Assembler)._asm_OP_check_char, - _OP_load : (*_Assembler)._asm_OP_load, - _OP_save : (*_Assembler)._asm_OP_save, - _OP_drop : (*_Assembler)._asm_OP_drop, - _OP_drop_2 : (*_Assembler)._asm_OP_drop_2, - _OP_recurse : (*_Assembler)._asm_OP_recurse, - _OP_goto : (*_Assembler)._asm_OP_goto, - _OP_switch : (*_Assembler)._asm_OP_switch, - _OP_check_char_0 : (*_Assembler)._asm_OP_check_char_0, - _OP_dismatch_err : (*_Assembler)._asm_OP_dismatch_err, - _OP_go_skip : (*_Assembler)._asm_OP_go_skip, - _OP_skip_emtpy : (*_Assembler)._asm_OP_skip_empty, - _OP_add : (*_Assembler)._asm_OP_add, - _OP_check_empty : (*_Assembler)._asm_OP_check_empty, - _OP_debug : (*_Assembler)._asm_OP_debug, -} - -func (self *_Assembler) _asm_OP_debug(_ *_Instr) { - self.Byte(0xcc) -} - -func (self *_Assembler) instr(v *_Instr) { - if fn := _OpFuncTab[v.op()]; fn != nil { - fn(self, v) - } else { - panic(fmt.Sprintf("invalid opcode: %d", v.op())) - } -} - -func (self *_Assembler) instrs() { - for i, v := range self.p { - self.Mark(i) - self.instr(&v) - self.debug_instr(i, &v) - } -} - -func (self *_Assembler) epilogue() { - self.Mark(len(self.p)) - self.Emit("XORL", _EP, _EP) // XORL EP, EP - self.Emit("MOVQ", _VAR_et, _ET) // MOVQ VAR_et, ET - self.Emit("TESTQ", _ET, _ET) // TESTQ ET, ET - self.Sjmp("JNZ", _LB_mismatch_error) // JNZ _LB_mismatch_error - self.Link(_LB_error) // _error: - self.Emit("MOVQ", _EP, _CX) // MOVQ BX, CX - self.Emit("MOVQ", _ET, _BX) // MOVQ AX, BX - self.Emit("MOVQ", _IC, _AX) // MOVQ IC, AX - self.Emit("MOVQ", jit.Imm(0), _ARG_sp) // MOVQ $0, sv.p<>+48(FP) - self.Emit("MOVQ", jit.Imm(0), _ARG_vp) // MOVQ $0, sv.p<>+48(FP) - self.Emit("MOVQ", jit.Imm(0), _ARG_sv_p) // MOVQ $0, sv.p<>+48(FP) - self.Emit("MOVQ", jit.Imm(0), _ARG_vk) // MOVQ $0, vk<>+64(FP) - self.Emit("MOVQ", jit.Ptr(_SP, _FP_offs), _BP) // MOVQ _FP_offs(SP), BP - self.Emit("ADDQ", jit.Imm(_FP_size), _SP) // ADDQ $_FP_size, SP - self.Emit("RET") // RET -} - -func (self *_Assembler) prologue() { - self.Emit("SUBQ", jit.Imm(_FP_size), _SP) // SUBQ $_FP_size, SP - self.Emit("MOVQ", _BP, jit.Ptr(_SP, _FP_offs)) // MOVQ BP, _FP_offs(SP) - self.Emit("LEAQ", jit.Ptr(_SP, _FP_offs), _BP) // LEAQ _FP_offs(SP), BP - self.Emit("MOVQ", _AX, _ARG_sp) // MOVQ AX, s.p<>+0(FP) - self.Emit("MOVQ", _AX, _IP) // MOVQ AX, IP - self.Emit("MOVQ", _BX, _ARG_sl) // MOVQ BX, s.l<>+8(FP) - self.Emit("MOVQ", _BX, _IL) // MOVQ BX, IL - self.Emit("MOVQ", _CX, _ARG_ic) // MOVQ CX, ic<>+16(FP) - self.Emit("MOVQ", _CX, _IC) // MOVQ CX, IC - self.Emit("MOVQ", _DI, _ARG_vp) // MOVQ DI, vp<>+24(FP) - self.Emit("MOVQ", _DI, _VP) // MOVQ DI, VP - self.Emit("MOVQ", _SI, _ARG_sb) // MOVQ SI, sb<>+32(FP) - self.Emit("MOVQ", _SI, _ST) // MOVQ SI, ST - self.Emit("MOVQ", _R8, _ARG_fv) // MOVQ R8, fv<>+40(FP) - self.Emit("MOVQ", jit.Imm(0), _ARG_sv_p) // MOVQ $0, sv.p<>+48(FP) - self.Emit("MOVQ", jit.Imm(0), _ARG_sv_n) // MOVQ $0, sv.n<>+56(FP) - self.Emit("MOVQ", jit.Imm(0), _ARG_vk) // MOVQ $0, vk<>+64(FP) - self.Emit("MOVQ", jit.Imm(0), _VAR_et) // MOVQ $0, et<>+120(FP) - // initialize digital buffer first - self.Emit("MOVQ", jit.Imm(_MaxDigitNums), _VAR_st_Dc) // MOVQ $_MaxDigitNums, ss.Dcap - self.Emit("LEAQ", jit.Ptr(_ST, _DbufOffset), _AX) // LEAQ _DbufOffset(ST), AX - self.Emit("MOVQ", _AX, _VAR_st_Db) // MOVQ AX, ss.Dbuf -} - -/** Function Calling Helpers **/ - -var ( - _REG_go = []obj.Addr { _ST, _VP, _IP, _IL, _IC } - _REG_rt = []obj.Addr { _ST, _VP, _IP, _IL, _IC } -) - -func (self *_Assembler) save(r ...obj.Addr) { - for i, v := range r { - if i > _FP_saves / 8 - 1 { - panic("too many registers to save") - } else { - self.Emit("MOVQ", v, jit.Ptr(_SP, _FP_fargs + int64(i) * 8)) - } - } -} - -func (self *_Assembler) load(r ...obj.Addr) { - for i, v := range r { - if i > _FP_saves / 8 - 1 { - panic("too many registers to load") - } else { - self.Emit("MOVQ", jit.Ptr(_SP, _FP_fargs + int64(i) * 8), v) - } - } -} - -func (self *_Assembler) call(fn obj.Addr) { - self.Emit("MOVQ", fn, _R9) // MOVQ ${fn}, R11 - self.Rjmp("CALL", _R9) // CALL R11 -} - -func (self *_Assembler) call_go(fn obj.Addr) { - self.save(_REG_go...) // SAVE $REG_go - self.call(fn) - self.load(_REG_go...) // LOAD $REG_go -} - -func (self *_Assembler) callc(fn obj.Addr) { - self.save(_IP) - self.call(fn) - self.Emit("XORPS", _X15, _X15) - self.load(_IP) -} - -func (self *_Assembler) call_c(fn obj.Addr) { - self.Emit("XCHGQ", _IC, _BX) - self.callc(fn) - self.Emit("XCHGQ", _IC, _BX) -} - -func (self *_Assembler) call_sf(fn obj.Addr) { - self.Emit("LEAQ", _ARG_s, _DI) // LEAQ s<>+0(FP), DI - self.Emit("MOVQ", _IC, _ARG_ic) // MOVQ IC, ic<>+16(FP) - self.Emit("LEAQ", _ARG_ic, _SI) // LEAQ ic<>+16(FP), SI - self.Emit("LEAQ", jit.Ptr(_ST, _FsmOffset), _DX) // LEAQ _FsmOffset(ST), DX - self.Emit("MOVQ", _ARG_fv, _CX) - self.callc(fn) - self.Emit("MOVQ", _ARG_ic, _IC) // MOVQ ic<>+16(FP), IC -} - -func (self *_Assembler) call_vf(fn obj.Addr) { - self.Emit("LEAQ", _ARG_s, _DI) // LEAQ s<>+0(FP), DI - self.Emit("MOVQ", _IC, _ARG_ic) // MOVQ IC, ic<>+16(FP) - self.Emit("LEAQ", _ARG_ic, _SI) // LEAQ ic<>+16(FP), SI - self.Emit("LEAQ", _VAR_st, _DX) // LEAQ st, DX - self.callc(fn) - self.Emit("MOVQ", _ARG_ic, _IC) // MOVQ ic<>+16(FP), IC -} - -/** Assembler Error Handlers **/ - -var ( - _F_convT64 = jit.Func(convT64) - _F_error_wrap = jit.Func(error_wrap) - _F_error_type = jit.Func(error_type) - _F_error_field = jit.Func(error_field) - _F_error_value = jit.Func(error_value) - _F_error_mismatch = jit.Func(error_mismatch) -) - -var ( - _I_int8 , _T_int8 = rtype(reflect.TypeOf(int8(0))) - _I_int16 , _T_int16 = rtype(reflect.TypeOf(int16(0))) - _I_int32 , _T_int32 = rtype(reflect.TypeOf(int32(0))) - _I_uint8 , _T_uint8 = rtype(reflect.TypeOf(uint8(0))) - _I_uint16 , _T_uint16 = rtype(reflect.TypeOf(uint16(0))) - _I_uint32 , _T_uint32 = rtype(reflect.TypeOf(uint32(0))) - _I_float32 , _T_float32 = rtype(reflect.TypeOf(float32(0))) -) - -var ( - _T_error = rt.UnpackType(errorType) - _I_base64_CorruptInputError = jit.Itab(_T_error, base64CorruptInputError) -) - -var ( - _V_stackOverflow = jit.Imm(int64(uintptr(unsafe.Pointer(&stackOverflow)))) - _I_json_UnsupportedValueError = jit.Itab(_T_error, reflect.TypeOf(new(json.UnsupportedValueError))) - _I_json_MismatchTypeError = jit.Itab(_T_error, reflect.TypeOf(new(MismatchTypeError))) - _I_json_MismatchQuotedError = jit.Itab(_T_error, reflect.TypeOf(new(MismatchQuotedError))) -) - -func (self *_Assembler) type_error() { - self.Link(_LB_type_error) // _type_error: - self.call_go(_F_error_type) // CALL_GO error_type - self.Sjmp("JMP" , _LB_error) // JMP _error -} - -func (self *_Assembler) mismatch_error() { - self.Link(_LB_mismatch_error) // _type_error: - self.Emit("MOVQ", _VAR_et, _ET) // MOVQ _VAR_et, ET - self.Emit("MOVQ", _I_json_MismatchTypeError, _CX) // MOVQ _I_json_MismatchType, CX - self.Emit("CMPQ", _ET, _CX) // CMPQ ET, CX - self.Emit("MOVQ", jit.Ptr(_ST, _EpOffset), _EP) // MOVQ stack.Ep, EP - self.Sjmp("JE" , _LB_error) // JE _LB_error - self.Emit("MOVQ", _ARG_sp, _AX) - self.Emit("MOVQ", _ARG_sl, _BX) - self.Emit("MOVQ", _VAR_ic, _CX) - self.Emit("MOVQ", _VAR_et, _DI) - self.call_go(_F_error_mismatch) // CALL_GO error_type - self.Sjmp("JMP" , _LB_error) // JMP _error -} - -func (self *_Assembler) field_error() { - self.Link(_LB_field_error) // _field_error: - self.Emit("MOVQ", _ARG_sv_p, _AX) // MOVQ sv.p, AX - self.Emit("MOVQ", _ARG_sv_n, _BX) // MOVQ sv.n, BX - self.call_go(_F_error_field) // CALL_GO error_field - self.Sjmp("JMP" , _LB_error) // JMP _error -} - -func (self *_Assembler) range_error() { - self.Link(_LB_range_error) // _range_error: - self.Emit("MOVQ", _ET, _CX) // MOVQ ET, CX - self.slice_from(_VAR_st_Ep, 0) // SLICE st.Ep, $0 - self.Emit("MOVQ", _DI, _AX) // MOVQ DI, AX - self.Emit("MOVQ", _EP, _DI) // MOVQ EP, DI - self.Emit("MOVQ", _SI, _BX) // MOVQ SI, BX - self.call_go(_F_error_value) // CALL_GO error_value - self.Sjmp("JMP" , _LB_error) // JMP _error -} - -func (self *_Assembler) stack_error() { - self.Link(_LB_stack_error) // _stack_error: - self.Emit("MOVQ", _V_stackOverflow, _EP) // MOVQ ${_V_stackOverflow}, EP - self.Emit("MOVQ", _I_json_UnsupportedValueError, _ET) // MOVQ ${_I_json_UnsupportedValueError}, ET - self.Sjmp("JMP" , _LB_error) // JMP _error -} - -func (self *_Assembler) base64_error() { - self.Link(_LB_base64_error) - self.Emit("NEGQ", _AX) // NEGQ AX - self.Emit("SUBQ", jit.Imm(1), _AX) // SUBQ $1, AX - self.call_go(_F_convT64) // CALL_GO convT64 - self.Emit("MOVQ", _AX, _EP) // MOVQ AX, EP - self.Emit("MOVQ", _I_base64_CorruptInputError, _ET) // MOVQ ${itab(base64.CorruptInputError)}, ET - self.Sjmp("JMP" , _LB_error) // JMP _error -} - -func (self *_Assembler) parsing_error() { - self.Link(_LB_eof_error) // _eof_error: - self.Emit("MOVQ" , _IL, _IC) // MOVQ IL, IC - self.Emit("MOVL" , jit.Imm(int64(types.ERR_EOF)), _EP) // MOVL ${types.ERR_EOF}, EP - self.Sjmp("JMP" , _LB_parsing_error) // JMP _parsing_error - self.Link(_LB_unquote_error) // _unquote_error: - self.Emit("SUBQ" , _VAR_sr, _SI) // SUBQ sr, SI - self.Emit("SUBQ" , _SI, _IC) // SUBQ IL, IC - self.Link(_LB_parsing_error_v) // _parsing_error_v: - self.Emit("MOVQ" , _AX, _EP) // MOVQ AX, EP - self.Emit("NEGQ" , _EP) // NEGQ EP - self.Sjmp("JMP" , _LB_parsing_error) // JMP _parsing_error - self.Link(_LB_char_m3_error) // _char_m3_error: - self.Emit("SUBQ" , jit.Imm(1), _IC) // SUBQ $1, IC - self.Link(_LB_char_m2_error) // _char_m2_error: - self.Emit("SUBQ" , jit.Imm(2), _IC) // SUBQ $2, IC - self.Sjmp("JMP" , _LB_char_0_error) // JMP _char_0_error - self.Link(_LB_im_error) // _im_error: - self.Emit("CMPB" , _CX, jit.Sib(_IP, _IC, 1, 0)) // CMPB CX, (IP)(IC) - self.Sjmp("JNE" , _LB_char_0_error) // JNE _char_0_error - self.Emit("SHRL" , jit.Imm(8), _CX) // SHRL $8, CX - self.Emit("CMPB" , _CX, jit.Sib(_IP, _IC, 1, 1)) // CMPB CX, 1(IP)(IC) - self.Sjmp("JNE" , _LB_char_1_error) // JNE _char_1_error - self.Emit("SHRL" , jit.Imm(8), _CX) // SHRL $8, CX - self.Emit("CMPB" , _CX, jit.Sib(_IP, _IC, 1, 2)) // CMPB CX, 2(IP)(IC) - self.Sjmp("JNE" , _LB_char_2_error) // JNE _char_2_error - self.Sjmp("JMP" , _LB_char_3_error) // JNE _char_3_error - self.Link(_LB_char_4_error) // _char_4_error: - self.Emit("ADDQ" , jit.Imm(1), _IC) // ADDQ $1, IC - self.Link(_LB_char_3_error) // _char_3_error: - self.Emit("ADDQ" , jit.Imm(1), _IC) // ADDQ $1, IC - self.Link(_LB_char_2_error) // _char_2_error: - self.Emit("ADDQ" , jit.Imm(1), _IC) // ADDQ $1, IC - self.Link(_LB_char_1_error) // _char_1_error: - self.Emit("ADDQ" , jit.Imm(1), _IC) // ADDQ $1, IC - self.Link(_LB_char_0_error) // _char_0_error: - self.Emit("MOVL" , jit.Imm(int64(types.ERR_INVALID_CHAR)), _EP) // MOVL ${types.ERR_INVALID_CHAR}, EP - self.Link(_LB_parsing_error) // _parsing_error: - self.Emit("MOVQ" , _EP, _DI) // MOVQ EP, DI - self.Emit("MOVQ", _ARG_sp, _AX) // MOVQ sp, AX - self.Emit("MOVQ", _ARG_sl, _BX) // MOVQ sl, BX - self.Emit("MOVQ" , _IC, _CX) // MOVQ IC, CX - self.call_go(_F_error_wrap) // CALL_GO error_wrap - self.Sjmp("JMP" , _LB_error) // JMP _error -} - -func (self *_Assembler) _asm_OP_dismatch_err(p *_Instr) { - self.Emit("MOVQ", _IC, _VAR_ic) - self.Emit("MOVQ", jit.Type(p.vt()), _ET) - self.Emit("MOVQ", _ET, _VAR_et) -} - -func (self *_Assembler) _asm_OP_go_skip(p *_Instr) { - self.Byte(0x4c, 0x8d, 0x0d) // LEAQ (PC), R9 - self.Xref(p.vi(), 4) - // self.Byte(0xcc) - self.Emit("MOVQ", _R9, _VAR_pc) - self.Sjmp("JMP" , _LB_skip_one) // JMP _skip_one -} - -var _F_IndexByte = jit.Func(strings.IndexByte) - -func (self *_Assembler) _asm_OP_skip_empty(p *_Instr) { - // self.Byte(0xcc) - self.call_sf(_F_skip_one) // CALL_SF skip_one - // self.Byte(0xcc) - self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX - self.Sjmp("JS" , _LB_parsing_error_v) // JS _parse_error_v - self.Emit("BTQ", jit.Imm(_F_disable_unknown), _ARG_fv) - self.Xjmp("JNC", p.vi()) - self.Emit("LEAQ", jit.Sib(_IC, _AX, 1, 0), _BX) - self.Emit("MOVQ", _BX, _ARG_sv_n) - self.Emit("LEAQ", jit.Sib(_IP, _AX, 1, 0), _AX) - self.Emit("MOVQ", _AX, _ARG_sv_p) - self.Emit("MOVQ", jit.Imm(':'), _CX) - self.call_go(_F_IndexByte) - // self.Byte(0xcc) - self.Emit("TESTQ", _AX, _AX) - // disallow unknown field - self.Sjmp("JNS", _LB_field_error) -} - -func (self *_Assembler) skip_one() { - self.Link(_LB_skip_one) // _skip: - self.Emit("MOVQ", _VAR_ic, _IC) // MOVQ _VAR_ic, IC - self.call_sf(_F_skip_one) // CALL_SF skip_one - self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX - self.Sjmp("JS" , _LB_parsing_error_v) // JS _parse_error_v - self.Emit("MOVQ" , _VAR_pc, _R9) // MOVQ pc, R9 - self.Rjmp("JMP" , _R9) // JMP (R9) -} - -func (self *_Assembler) skip_key_value() { - self.Link(_LB_skip_key_value) // _skip: - // skip the key - self.Emit("MOVQ", _VAR_ic, _IC) // MOVQ _VAR_ic, IC - self.call_sf(_F_skip_one) // CALL_SF skip_one - self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX - self.Sjmp("JS" , _LB_parsing_error_v) // JS _parse_error_v - // match char ':' - self.lspace("_global_1") - self.Emit("CMPB", jit.Sib(_IP, _IC, 1, 0), jit.Imm(':')) - self.Sjmp("JNE" , _LB_parsing_error_v) // JNE _parse_error_v - self.Emit("ADDQ", jit.Imm(1), _IC) // ADDQ $1, IC - self.lspace("_global_2") - // skip the value - self.call_sf(_F_skip_one) // CALL_SF skip_one - self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX - self.Sjmp("JS" , _LB_parsing_error_v) // JS _parse_error_v - // jump back to specified address - self.Emit("MOVQ" , _VAR_pc, _R9) // MOVQ pc, R9 - self.Rjmp("JMP" , _R9) // JMP (R9) -} - - -/** Memory Management Routines **/ - -var ( - _T_byte = jit.Type(byteType) - _F_mallocgc = jit.Func(mallocgc) -) - -func (self *_Assembler) malloc_AX(nb obj.Addr, ret obj.Addr) { - self.Emit("MOVQ", nb, _AX) // MOVQ ${nb}, AX - self.Emit("MOVQ", _T_byte, _BX) // MOVQ ${type(byte)}, BX - self.Emit("XORL", _CX, _CX) // XORL CX, CX - self.call_go(_F_mallocgc) // CALL_GO mallocgc - self.Emit("MOVQ", _AX, ret) // MOVQ AX, ${ret} -} - -func (self *_Assembler) valloc(vt reflect.Type, ret obj.Addr) { - self.Emit("MOVQ", jit.Imm(int64(vt.Size())), _AX) // MOVQ ${vt.Size()}, AX - self.Emit("MOVQ", jit.Type(vt), _BX) // MOVQ ${vt}, BX - self.Emit("MOVB", jit.Imm(1), _CX) // MOVB $1, CX - self.call_go(_F_mallocgc) // CALL_GO mallocgc - self.Emit("MOVQ", _AX, ret) // MOVQ AX, ${ret} -} - -func (self *_Assembler) valloc_AX(vt reflect.Type) { - self.Emit("MOVQ", jit.Imm(int64(vt.Size())), _AX) // MOVQ ${vt.Size()}, AX - self.Emit("MOVQ", jit.Type(vt), _BX) // MOVQ ${vt}, BX - self.Emit("MOVB", jit.Imm(1), _CX) // MOVB $1, CX - self.call_go(_F_mallocgc) // CALL_GO mallocgc -} - -func (self *_Assembler) vfollow(vt reflect.Type) { - self.Emit("MOVQ" , jit.Ptr(_VP, 0), _AX) // MOVQ (VP), AX - self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX - self.Sjmp("JNZ" , "_end_{n}") // JNZ _end_{n} - self.valloc_AX(vt) // VALLOC ${vt}, AX - self.WritePtrAX(1, jit.Ptr(_VP, 0), true) // MOVQ AX, (VP) - self.Link("_end_{n}") // _end_{n}: - self.Emit("MOVQ" , _AX, _VP) // MOVQ AX, VP -} - -/** Value Parsing Routines **/ - -var ( - _F_vstring = jit.Imm(int64(native.S_vstring)) - _F_vnumber = jit.Imm(int64(native.S_vnumber)) - _F_vsigned = jit.Imm(int64(native.S_vsigned)) - _F_vunsigned = jit.Imm(int64(native.S_vunsigned)) -) - -func (self *_Assembler) check_err(vt reflect.Type, pin string, pin2 int) { - self.Emit("MOVQ" , _VAR_st_Vt, _AX) // MOVQ st.Vt, AX - self.Emit("TESTQ", _AX, _AX) // CMPQ AX, ${native.V_STRING} - // try to skip the value - if vt != nil { - self.Sjmp("JNS" , "_check_err_{n}") // JNE _parsing_error_v - self.Emit("MOVQ", jit.Type(vt), _ET) - self.Emit("MOVQ", _ET, _VAR_et) - if pin2 != -1 { - self.Emit("SUBQ", jit.Imm(1), _BX) - self.Emit("MOVQ", _BX, _VAR_ic) - self.Byte(0x4c , 0x8d, 0x0d) // LEAQ (PC), R9 - self.Xref(pin2, 4) - self.Emit("MOVQ", _R9, _VAR_pc) - self.Sjmp("JMP" , _LB_skip_key_value) - } else { - self.Emit("MOVQ", _BX, _VAR_ic) - self.Byte(0x4c , 0x8d, 0x0d) // LEAQ (PC), R9 - self.Sref(pin, 4) - self.Emit("MOVQ", _R9, _VAR_pc) - self.Sjmp("JMP" , _LB_skip_one) - } - self.Link("_check_err_{n}") - } else { - self.Sjmp("JS" , _LB_parsing_error_v) // JNE _parsing_error_v - } -} - -func (self *_Assembler) check_eof(d int64) { - if d == 1 { - self.Emit("CMPQ", _IC, _IL) // CMPQ IC, IL - self.Sjmp("JAE" , _LB_eof_error) // JAE _eof_error - } else { - self.Emit("LEAQ", jit.Ptr(_IC, d), _AX) // LEAQ ${d}(IC), AX - self.Emit("CMPQ", _AX, _IL) // CMPQ AX, IL - self.Sjmp("JA" , _LB_eof_error) // JA _eof_error - } -} - - -func (self *_Assembler) parse_string() { - self.Emit("MOVQ", _ARG_fv, _CX) - self.call_vf(_F_vstring) - self.check_err(nil, "", -1) -} - -func (self *_Assembler) parse_number(vt reflect.Type, pin string, pin2 int) { - self.Emit("MOVQ", _IC, _BX) // save ic when call native func - self.call_vf(_F_vnumber) - self.check_err(vt, pin, pin2) -} - -func (self *_Assembler) parse_signed(vt reflect.Type, pin string, pin2 int) { - self.Emit("MOVQ", _IC, _BX) // save ic when call native func - self.call_vf(_F_vsigned) - self.check_err(vt, pin, pin2) -} - -func (self *_Assembler) parse_unsigned(vt reflect.Type, pin string, pin2 int) { - self.Emit("MOVQ", _IC, _BX) // save ic when call native func - self.call_vf(_F_vunsigned) - self.check_err(vt, pin, pin2) -} - -// Pointer: DI, Size: SI, Return: R9 -func (self *_Assembler) copy_string() { - self.Link("_copy_string") - self.Emit("MOVQ", _DI, _VAR_bs_p) - self.Emit("MOVQ", _SI, _VAR_bs_n) - self.Emit("MOVQ", _R9, _VAR_bs_LR) - self.malloc_AX(_SI, _ARG_sv_p) - self.Emit("MOVQ", _VAR_bs_p, _BX) - self.Emit("MOVQ", _VAR_bs_n, _CX) - self.call_go(_F_memmove) - self.Emit("MOVQ", _ARG_sv_p, _DI) - self.Emit("MOVQ", _VAR_bs_n, _SI) - self.Emit("MOVQ", _VAR_bs_LR, _R9) - self.Rjmp("JMP", _R9) -} - -// Pointer: DI, Size: SI, Return: R9 -func (self *_Assembler) escape_string() { - self.Link("_escape_string") - self.Emit("MOVQ" , _DI, _VAR_bs_p) - self.Emit("MOVQ" , _SI, _VAR_bs_n) - self.Emit("MOVQ" , _R9, _VAR_bs_LR) - self.malloc_AX(_SI, _DX) // MALLOC SI, DX - self.Emit("MOVQ" , _DX, _ARG_sv_p) - self.Emit("MOVQ" , _VAR_bs_p, _DI) - self.Emit("MOVQ" , _VAR_bs_n, _SI) - self.Emit("LEAQ" , _VAR_sr, _CX) // LEAQ sr, CX - self.Emit("XORL" , _R8, _R8) // XORL R8, R8 - self.Emit("BTQ" , jit.Imm(_F_disable_urc), _ARG_fv) // BTQ ${_F_disable_urc}, fv - self.Emit("SETCC", _R8) // SETCC R8 - self.Emit("SHLQ" , jit.Imm(types.B_UNICODE_REPLACE), _R8) // SHLQ ${types.B_UNICODE_REPLACE}, R8 - self.call_c(_F_unquote) // CALL unquote - self.Emit("MOVQ" , _VAR_bs_n, _SI) // MOVQ ${n}, SI - self.Emit("ADDQ" , jit.Imm(1), _SI) // ADDQ $1, SI - self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX - self.Sjmp("JS" , _LB_unquote_error) // JS _unquote_error - self.Emit("MOVQ" , _AX, _SI) - self.Emit("MOVQ" , _ARG_sv_p, _DI) - self.Emit("MOVQ" , _VAR_bs_LR, _R9) - self.Rjmp("JMP", _R9) -} - -func (self *_Assembler) escape_string_twice() { - self.Link("_escape_string_twice") - self.Emit("MOVQ" , _DI, _VAR_bs_p) - self.Emit("MOVQ" , _SI, _VAR_bs_n) - self.Emit("MOVQ" , _R9, _VAR_bs_LR) - self.malloc_AX(_SI, _DX) // MALLOC SI, DX - self.Emit("MOVQ" , _DX, _ARG_sv_p) - self.Emit("MOVQ" , _VAR_bs_p, _DI) - self.Emit("MOVQ" , _VAR_bs_n, _SI) - self.Emit("LEAQ" , _VAR_sr, _CX) // LEAQ sr, CX - self.Emit("MOVL" , jit.Imm(types.F_DOUBLE_UNQUOTE), _R8) // MOVL ${types.F_DOUBLE_UNQUOTE}, R8 - self.Emit("BTQ" , jit.Imm(_F_disable_urc), _ARG_fv) // BTQ ${_F_disable_urc}, AX - self.Emit("XORL" , _AX, _AX) // XORL AX, AX - self.Emit("SETCC", _AX) // SETCC AX - self.Emit("SHLQ" , jit.Imm(types.B_UNICODE_REPLACE), _AX) // SHLQ ${types.B_UNICODE_REPLACE}, AX - self.Emit("ORQ" , _AX, _R8) // ORQ AX, R8 - self.call_c(_F_unquote) // CALL unquote - self.Emit("MOVQ" , _VAR_bs_n, _SI) // MOVQ ${n}, SI - self.Emit("ADDQ" , jit.Imm(3), _SI) // ADDQ $3, SI - self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX - self.Sjmp("JS" , _LB_unquote_error) // JS _unquote_error - self.Emit("MOVQ" , _AX, _SI) - self.Emit("MOVQ" , _ARG_sv_p, _DI) - self.Emit("MOVQ" , _VAR_bs_LR, _R9) - self.Rjmp("JMP", _R9) -} - -/** Range Checking Routines **/ - -var ( - _V_max_f32 = jit.Imm(int64(uintptr(unsafe.Pointer(_Vp_max_f32)))) - _V_min_f32 = jit.Imm(int64(uintptr(unsafe.Pointer(_Vp_min_f32)))) -) - -var ( - _Vp_max_f32 = new(float32) - _Vp_min_f32 = new(float32) -) - -func init() { - *_Vp_max_f32 = math.MaxFloat32 - *_Vp_min_f32 = -math.MaxFloat32 -} - -func (self *_Assembler) range_single_X0() { - self.Emit("CVTSD2SS", _VAR_st_Dv, _X0) // CVTSD2SS _VAR_st_Dv, X0 - self.Emit("MOVQ" , _V_max_f32, _CX) // MOVQ _max_f32, CX - self.Emit("MOVQ" , jit.Gitab(_I_float32), _ET) // MOVQ ${itab(float32)}, ET - self.Emit("MOVQ" , jit.Gtype(_T_float32), _EP) // MOVQ ${type(float32)}, EP - self.Emit("UCOMISS" , jit.Ptr(_CX, 0), _X0) // UCOMISS (CX), X0 - self.Sjmp("JA" , _LB_range_error) // JA _range_error - self.Emit("MOVQ" , _V_min_f32, _CX) // MOVQ _min_f32, CX - self.Emit("UCOMISS" , jit.Ptr(_CX, 0), _X0) // UCOMISS (CX), X0 - self.Sjmp("JB" , _LB_range_error) // JB _range_error -} - -func (self *_Assembler) range_signed_CX(i *rt.GoItab, t *rt.GoType, a int64, b int64) { - self.Emit("MOVQ", _VAR_st_Iv, _CX) // MOVQ st.Iv, CX - self.Emit("MOVQ", jit.Gitab(i), _ET) // MOVQ ${i}, ET - self.Emit("MOVQ", jit.Gtype(t), _EP) // MOVQ ${t}, EP - self.Emit("CMPQ", _CX, jit.Imm(a)) // CMPQ CX, ${a} - self.Sjmp("JL" , _LB_range_error) // JL _range_error - self.Emit("CMPQ", _CX, jit.Imm(b)) // CMPQ CX, ${B} - self.Sjmp("JG" , _LB_range_error) // JG _range_error -} - -func (self *_Assembler) range_unsigned_CX(i *rt.GoItab, t *rt.GoType, v uint64) { - self.Emit("MOVQ" , _VAR_st_Iv, _CX) // MOVQ st.Iv, CX - self.Emit("MOVQ" , jit.Gitab(i), _ET) // MOVQ ${i}, ET - self.Emit("MOVQ" , jit.Gtype(t), _EP) // MOVQ ${t}, EP - self.Emit("TESTQ", _CX, _CX) // TESTQ CX, CX - self.Sjmp("JS" , _LB_range_error) // JS _range_error - self.Emit("CMPQ" , _CX, jit.Imm(int64(v))) // CMPQ CX, ${a} - self.Sjmp("JA" , _LB_range_error) // JA _range_error -} - -/** String Manipulating Routines **/ - -var ( - _F_unquote = jit.Imm(int64(native.S_unquote)) -) - -func (self *_Assembler) slice_from(p obj.Addr, d int64) { - self.Emit("MOVQ", p, _SI) // MOVQ ${p}, SI - self.slice_from_r(_SI, d) // SLICE_R SI, ${d} -} - -func (self *_Assembler) slice_from_r(p obj.Addr, d int64) { - self.Emit("LEAQ", jit.Sib(_IP, p, 1, 0), _DI) // LEAQ (IP)(${p}), DI - self.Emit("NEGQ", p) // NEGQ ${p} - self.Emit("LEAQ", jit.Sib(_IC, p, 1, d), _SI) // LEAQ d(IC)(${p}), SI -} - -func (self *_Assembler) unquote_once(p obj.Addr, n obj.Addr, stack bool, copy bool) { - self.slice_from(_VAR_st_Iv, -1) // SLICE st.Iv, $-1 - self.Emit("CMPQ", _VAR_st_Ep, jit.Imm(-1)) // CMPQ st.Ep, $-1 - self.Sjmp("JE" , "_noescape_{n}") // JE _escape_{n} - self.Byte(0x4c, 0x8d, 0x0d) // LEAQ (PC), R9 - self.Sref("_unquote_once_write_{n}", 4) - self.Sjmp("JMP" , "_escape_string") - self.Link("_noescape_{n}") - if copy { - self.Emit("BTQ" , jit.Imm(_F_copy_string), _ARG_fv) - self.Sjmp("JNC", "_unquote_once_write_{n}") - self.Byte(0x4c, 0x8d, 0x0d) // LEAQ (PC), R9 - self.Sref("_unquote_once_write_{n}", 4) - self.Sjmp("JMP", "_copy_string") - } - self.Link("_unquote_once_write_{n}") - self.Emit("MOVQ", _SI, n) // MOVQ SI, ${n} - if stack { - self.Emit("MOVQ", _DI, p) - } else { - self.WriteRecNotAX(10, _DI, p, false, false) - } -} - -func (self *_Assembler) unquote_twice(p obj.Addr, n obj.Addr, stack bool) { - self.Emit("CMPQ" , _VAR_st_Ep, jit.Imm(-1)) // CMPQ st.Ep, $-1 - self.Sjmp("JE" , _LB_eof_error) // JE _eof_error - self.Emit("CMPB" , jit.Sib(_IP, _IC, 1, -3), jit.Imm('\\')) // CMPB -3(IP)(IC), $'\\' - self.Sjmp("JNE" , _LB_char_m3_error) // JNE _char_m3_error - self.Emit("CMPB" , jit.Sib(_IP, _IC, 1, -2), jit.Imm('"')) // CMPB -2(IP)(IC), $'"' - self.Sjmp("JNE" , _LB_char_m2_error) // JNE _char_m2_error - self.slice_from(_VAR_st_Iv, -3) // SLICE st.Iv, $-3 - self.Emit("MOVQ" , _SI, _AX) // MOVQ SI, AX - self.Emit("ADDQ" , _VAR_st_Iv, _AX) // ADDQ st.Iv, AX - self.Emit("CMPQ" , _VAR_st_Ep, _AX) // CMPQ st.Ep, AX - self.Sjmp("JE" , "_noescape_{n}") // JE _noescape_{n} - self.Byte(0x4c, 0x8d, 0x0d) // LEAQ (PC), R9 - self.Sref("_unquote_twice_write_{n}", 4) - self.Sjmp("JMP" , "_escape_string_twice") - self.Link("_noescape_{n}") // _noescape_{n}: - self.Emit("BTQ" , jit.Imm(_F_copy_string), _ARG_fv) - self.Sjmp("JNC", "_unquote_twice_write_{n}") - self.Byte(0x4c, 0x8d, 0x0d) // LEAQ (PC), R9 - self.Sref("_unquote_twice_write_{n}", 4) - self.Sjmp("JMP", "_copy_string") - self.Link("_unquote_twice_write_{n}") - self.Emit("MOVQ" , _SI, n) // MOVQ SI, ${n} - if stack { - self.Emit("MOVQ", _DI, p) - } else { - self.WriteRecNotAX(12, _DI, p, false, false) - } - self.Link("_unquote_twice_end_{n}") -} - -/** Memory Clearing Routines **/ - -var ( - _F_memclrHasPointers = jit.Func(memclrHasPointers) - _F_memclrNoHeapPointers = jit.Func(memclrNoHeapPointers) -) - -func (self *_Assembler) mem_clear_fn(ptrfree bool) { - if !ptrfree { - self.call_go(_F_memclrHasPointers) - } else { - self.call_go(_F_memclrNoHeapPointers) - } -} - -func (self *_Assembler) mem_clear_rem(size int64, ptrfree bool) { - self.Emit("MOVQ", jit.Imm(size), _BX) // MOVQ ${size}, BX - self.Emit("MOVQ", jit.Ptr(_ST, 0), _AX) // MOVQ (ST), AX - self.Emit("MOVQ", jit.Sib(_ST, _AX, 1, 0), _AX) // MOVQ (ST)(AX), AX - self.Emit("SUBQ", _VP, _AX) // SUBQ VP, AX - self.Emit("ADDQ", _AX, _BX) // ADDQ AX, BX - self.Emit("MOVQ", _VP, _AX) // MOVQ VP, (SP) - self.mem_clear_fn(ptrfree) // CALL_GO memclr{Has,NoHeap}Pointers -} - -/** Map Assigning Routines **/ - -var ( - _F_mapassign = jit.Func(mapassign) - _F_mapassign_fast32 = jit.Func(mapassign_fast32) - _F_mapassign_faststr = jit.Func(mapassign_faststr) - _F_mapassign_fast64ptr = jit.Func(mapassign_fast64ptr) -) - -var ( - _F_decodeJsonUnmarshaler obj.Addr - _F_decodeJsonUnmarshalerQuoted obj.Addr - _F_decodeTextUnmarshaler obj.Addr -) - -func init() { - _F_decodeJsonUnmarshaler = jit.Func(decodeJsonUnmarshaler) - _F_decodeJsonUnmarshalerQuoted = jit.Func(decodeJsonUnmarshalerQuoted) - _F_decodeTextUnmarshaler = jit.Func(decodeTextUnmarshaler) -} - -func (self *_Assembler) mapaccess_ptr(t reflect.Type) { - if rt.MapType(rt.UnpackType(t)).IndirectElem() { - self.vfollow(t.Elem()) - } -} - -func (self *_Assembler) mapassign_std(t reflect.Type, v obj.Addr) { - self.Emit("LEAQ", v, _AX) // LEAQ ${v}, AX - self.mapassign_call_from_AX(t, _F_mapassign) // MAPASSIGN ${t}, mapassign -} - -func (self *_Assembler) mapassign_str_fast(t reflect.Type, p obj.Addr, n obj.Addr) { - self.Emit("MOVQ", jit.Type(t), _AX) // MOVQ ${t}, AX - self.Emit("MOVQ", _VP, _BX) // MOVQ VP, BX - self.Emit("MOVQ", p, _CX) // MOVQ ${p}, CX - self.Emit("MOVQ", n, _DI) // MOVQ ${n}, DI - self.call_go(_F_mapassign_faststr) // CALL_GO ${fn} - self.Emit("MOVQ", _AX, _VP) // MOVQ AX, VP - self.mapaccess_ptr(t) -} - -func (self *_Assembler) mapassign_call_from_AX(t reflect.Type, fn obj.Addr) { - self.Emit("MOVQ", _AX, _CX) - self.Emit("MOVQ", jit.Type(t), _AX) // MOVQ ${t}, AX - self.Emit("MOVQ", _VP, _BX) // MOVQ VP, _BX - self.call_go(fn) // CALL_GO ${fn} - self.Emit("MOVQ", _AX, _VP) // MOVQ AX, VP -} - -func (self *_Assembler) mapassign_fastx(t reflect.Type, fn obj.Addr) { - self.mapassign_call_from_AX(t, fn) - self.mapaccess_ptr(t) -} - -func (self *_Assembler) mapassign_utext(t reflect.Type, addressable bool) { - pv := false - vk := t.Key() - tk := t.Key() - - /* deref pointer if needed */ - if vk.Kind() == reflect.Ptr { - pv = true - vk = vk.Elem() - } - - /* addressable value with pointer receiver */ - if addressable { - pv = false - tk = reflect.PtrTo(tk) - } - - /* allocate the key, and call the unmarshaler */ - self.valloc(vk, _BX) // VALLOC ${vk}, BX - // must spill vk pointer since next call_go may invoke GC - self.Emit("MOVQ" , _BX, _ARG_vk) - self.Emit("MOVQ" , jit.Type(tk), _AX) // MOVQ ${tk}, AX - self.Emit("MOVQ" , _ARG_sv_p, _CX) // MOVQ sv.p, CX - self.Emit("MOVQ" , _ARG_sv_n, _DI) // MOVQ sv.n, DI - self.call_go(_F_decodeTextUnmarshaler) // CALL_GO decodeTextUnmarshaler - self.Emit("TESTQ", _ET, _ET) // TESTQ ET, ET - self.Sjmp("JNZ" , _LB_error) // JNZ _error - self.Emit("MOVQ" , _ARG_vk, _AX) // MOVQ VAR.vk, AX - self.Emit("MOVQ", jit.Imm(0), _ARG_vk) - - /* select the correct assignment function */ - if !pv { - self.mapassign_call_from_AX(t, _F_mapassign) - } else { - self.mapassign_fastx(t, _F_mapassign_fast64ptr) - } -} - -/** External Unmarshaler Routines **/ - -var ( - _F_skip_one = jit.Imm(int64(native.S_skip_one)) - _F_skip_array = jit.Imm(int64(native.S_skip_array)) - _F_skip_number = jit.Imm(int64(native.S_skip_number)) -) - -func (self *_Assembler) unmarshal_json(t reflect.Type, deref bool, f obj.Addr) { - self.call_sf(_F_skip_one) // CALL_SF skip_one - self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX - self.Sjmp("JS" , _LB_parsing_error_v) // JS _parse_error_v - self.Emit("MOVQ", _IC, _VAR_ic) // store for mismatche error skip - self.slice_from_r(_AX, 0) // SLICE_R AX, $0 - self.Emit("MOVQ" , _DI, _ARG_sv_p) // MOVQ DI, sv.p - self.Emit("MOVQ" , _SI, _ARG_sv_n) // MOVQ SI, sv.n - self.unmarshal_func(t, f, deref) // UNMARSHAL json, ${t}, ${deref} -} - -func (self *_Assembler) unmarshal_text(t reflect.Type, deref bool) { - self.parse_string() // PARSE STRING - self.unquote_once(_ARG_sv_p, _ARG_sv_n, true, true) // UNQUOTE once, sv.p, sv.n - self.unmarshal_func(t, _F_decodeTextUnmarshaler, deref) // UNMARSHAL text, ${t}, ${deref} -} - -func (self *_Assembler) unmarshal_func(t reflect.Type, fn obj.Addr, deref bool) { - pt := t - vk := t.Kind() - - /* allocate the field if needed */ - if deref && vk == reflect.Ptr { - self.Emit("MOVQ" , _VP, _BX) // MOVQ VP, BX - self.Emit("MOVQ" , jit.Ptr(_BX, 0), _BX) // MOVQ (BX), BX - self.Emit("TESTQ", _BX, _BX) // TESTQ BX, BX - self.Sjmp("JNZ" , "_deref_{n}") // JNZ _deref_{n} - self.valloc(t.Elem(), _BX) // VALLOC ${t.Elem()}, BX - self.WriteRecNotAX(3, _BX, jit.Ptr(_VP, 0), false, false) // MOVQ BX, (VP) - self.Link("_deref_{n}") // _deref_{n}: - } else { - /* set value pointer */ - self.Emit("MOVQ", _VP, _BX) // MOVQ (VP), BX - } - - /* set value type */ - self.Emit("MOVQ", jit.Type(pt), _AX) // MOVQ ${pt}, AX - - /* set the source string and call the unmarshaler */ - self.Emit("MOVQ" , _ARG_sv_p, _CX) // MOVQ sv.p, CX - self.Emit("MOVQ" , _ARG_sv_n, _DI) // MOVQ sv.n, DI - self.call_go(fn) // CALL_GO ${fn} - self.Emit("TESTQ", _ET, _ET) // TESTQ ET, ET - if fn == _F_decodeJsonUnmarshalerQuoted { - self.Sjmp("JZ" , "_unmarshal_func_end_{n}") // JZ _unmarshal_func_end_{n} - self.Emit("MOVQ", _I_json_MismatchQuotedError, _CX) // MOVQ _I_json_MismatchQuotedError, CX - self.Emit("CMPQ", _ET, _CX) // check if MismatchQuotedError - self.Sjmp("JNE" , _LB_error) // JNE _error - self.Emit("MOVQ", jit.Type(t), _CX) // store current type - self.Emit("MOVQ", _CX, _VAR_et) // store current type as mismatched type - self.Emit("MOVQ", _VAR_ic, _IC) // recover the pos at mismatched, continue to parse - self.Emit("XORL", _ET, _ET) // clear ET - self.Link("_unmarshal_func_end_{n}") - } else { - self.Sjmp("JNE" , _LB_error) // JNE _error - } -} - -/** Dynamic Decoding Routine **/ - -var ( - _F_decodeTypedPointer obj.Addr -) - -func init() { - _F_decodeTypedPointer = jit.Func(decodeTypedPointer) -} - -func (self *_Assembler) decode_dynamic(vt obj.Addr, vp obj.Addr) { - self.Emit("MOVQ" , vp, _SI) // MOVQ ${vp}, SI - self.Emit("MOVQ" , vt, _DI) // MOVQ ${vt}, DI - self.Emit("MOVQ", _ARG_sp, _AX) // MOVQ sp, AX - self.Emit("MOVQ", _ARG_sl, _BX) // MOVQ sp, BX - self.Emit("MOVQ" , _IC, _CX) // MOVQ IC, CX - self.Emit("MOVQ" , _ST, _R8) // MOVQ ST, R8 - self.Emit("MOVQ" , _ARG_fv, _R9) // MOVQ fv, R9 - self.save(_REG_rt...) - self.Emit("MOVQ", _F_decodeTypedPointer, _IL) // MOVQ ${fn}, R11 - self.Rjmp("CALL", _IL) // CALL R11 - self.load(_REG_rt...) - self.Emit("MOVQ" , _AX, _IC) // MOVQ AX, IC - self.Emit("MOVQ" , _BX, _ET) // MOVQ BX, ET - self.Emit("MOVQ" , _CX, _EP) // MOVQ CX, EP - self.Emit("TESTQ", _ET, _ET) // TESTQ ET, ET - self.Sjmp("JE", "_decode_dynamic_end_{n}") // JE, _decode_dynamic_end_{n} - self.Emit("MOVQ", _I_json_MismatchTypeError, _CX) // MOVQ _I_json_MismatchTypeError, CX - self.Emit("CMPQ", _ET, _CX) // CMPQ ET, CX - self.Sjmp("JNE", _LB_error) // JNE LB_error - self.Emit("MOVQ", _ET, _VAR_et) // MOVQ ET, VAR_et - self.WriteRecNotAX(14, _EP, jit.Ptr(_ST, _EpOffset), false, false) // MOVQ EP, stack.Ep - self.Link("_decode_dynamic_end_{n}") -} - -/** OpCode Assembler Functions **/ - -var ( - _F_memequal = jit.Func(memequal) - _F_memmove = jit.Func(memmove) - _F_growslice = jit.Func(rt.GrowSlice) - _F_makeslice = jit.Func(makeslice) - _F_makemap_small = jit.Func(makemap_small) - _F_mapassign_fast64 = jit.Func(mapassign_fast64) -) - -var ( - _F_lspace = jit.Imm(int64(native.S_lspace)) - _F_strhash = jit.Imm(int64(caching.S_strhash)) -) - -var ( - _F_b64decode = jit.Imm(int64(_subr__b64decode)) - _F_decodeValue = jit.Imm(int64(_subr_decode_value)) -) - -var ( - _F_FieldMap_GetCaseInsensitive obj.Addr - _Empty_Slice = []byte{} - _Zero_Base = int64(uintptr(((*rt.GoSlice)(unsafe.Pointer(&_Empty_Slice))).Ptr)) -) - -const ( - _MODE_AVX2 = 1 << 2 -) - -const ( - _Fe_ID = int64(unsafe.Offsetof(caching.FieldEntry{}.ID)) - _Fe_Name = int64(unsafe.Offsetof(caching.FieldEntry{}.Name)) - _Fe_Hash = int64(unsafe.Offsetof(caching.FieldEntry{}.Hash)) -) - -const ( - _Vk_Ptr = int64(reflect.Ptr) - _Gt_KindFlags = int64(unsafe.Offsetof(rt.GoType{}.KindFlags)) -) - -func init() { - _F_FieldMap_GetCaseInsensitive = jit.Func((*caching.FieldMap).GetCaseInsensitive) -} - -func (self *_Assembler) _asm_OP_any(_ *_Instr) { - self.Emit("MOVQ" , jit.Ptr(_VP, 8), _CX) // MOVQ 8(VP), CX - self.Emit("TESTQ" , _CX, _CX) // TESTQ CX, CX - self.Sjmp("JZ" , "_decode_{n}") // JZ _decode_{n} - self.Emit("CMPQ" , _CX, _VP) // CMPQ CX, VP - self.Sjmp("JE" , "_decode_{n}") // JE _decode_{n} - self.Emit("MOVQ" , jit.Ptr(_VP, 0), _AX) // MOVQ (VP), AX - self.Emit("MOVBLZX", jit.Ptr(_AX, _Gt_KindFlags), _DX) // MOVBLZX _Gt_KindFlags(AX), DX - self.Emit("ANDL" , jit.Imm(rt.F_kind_mask), _DX) // ANDL ${F_kind_mask}, DX - self.Emit("CMPL" , _DX, jit.Imm(_Vk_Ptr)) // CMPL DX, ${reflect.Ptr} - self.Sjmp("JNE" , "_decode_{n}") // JNE _decode_{n} - self.Emit("LEAQ" , jit.Ptr(_VP, 8), _DI) // LEAQ 8(VP), DI - self.decode_dynamic(_AX, _DI) // DECODE AX, DI - self.Sjmp("JMP" , "_decode_end_{n}") // JMP _decode_end_{n} - self.Link("_decode_{n}") // _decode_{n}: - self.Emit("MOVQ" , _ARG_fv, _DF) // MOVQ fv, DF - self.Emit("MOVQ" , _ST, jit.Ptr(_SP, 0)) // MOVQ _ST, (SP) - self.call(_F_decodeValue) // CALL decodeValue - self.Emit("MOVQ" , jit.Imm(0), jit.Ptr(_SP, 0)) // MOVQ _ST, (SP) - self.Emit("TESTQ" , _EP, _EP) // TESTQ EP, EP - self.Sjmp("JNZ" , _LB_parsing_error) // JNZ _parsing_error - self.Link("_decode_end_{n}") // _decode_end_{n}: -} - -func (self *_Assembler) _asm_OP_dyn(p *_Instr) { - self.Emit("MOVQ" , jit.Type(p.vt()), _ET) // MOVQ ${p.vt()}, ET - self.Emit("CMPQ" , jit.Ptr(_VP, 8), jit.Imm(0)) // CMPQ 8(VP), $0 - self.Sjmp("JE" , _LB_type_error) // JE _type_error - self.Emit("MOVQ" , jit.Ptr(_VP, 0), _CX) // MOVQ (VP), CX - self.Emit("MOVQ" , jit.Ptr(_CX, 8), _CX) // MOVQ 8(CX), CX - self.Emit("MOVBLZX", jit.Ptr(_CX, _Gt_KindFlags), _DX) // MOVBLZX _Gt_KindFlags(CX), DX - self.Emit("ANDL" , jit.Imm(rt.F_kind_mask), _DX) // ANDL ${F_kind_mask}, DX - self.Emit("CMPL" , _DX, jit.Imm(_Vk_Ptr)) // CMPL DX, ${reflect.Ptr} - self.Sjmp("JNE" , _LB_type_error) // JNE _type_error - self.Emit("LEAQ" , jit.Ptr(_VP, 8), _DI) // LEAQ 8(VP), DI - self.decode_dynamic(_CX, _DI) // DECODE CX, DI - self.Link("_decode_end_{n}") // _decode_end_{n}: -} - -func (self *_Assembler) _asm_OP_str(_ *_Instr) { - self.parse_string() // PARSE STRING - self.unquote_once(jit.Ptr(_VP, 0), jit.Ptr(_VP, 8), false, true) // UNQUOTE once, (VP), 8(VP) -} - -func (self *_Assembler) _asm_OP_bin(_ *_Instr) { - self.parse_string() // PARSE STRING - self.slice_from(_VAR_st_Iv, -1) // SLICE st.Iv, $-1 - self.Emit("MOVQ" , _DI, jit.Ptr(_VP, 0)) // MOVQ DI, (VP) - self.Emit("MOVQ" , _SI, jit.Ptr(_VP, 8)) // MOVQ SI, 8(VP) - self.Emit("SHRQ" , jit.Imm(2), _SI) // SHRQ $2, SI - self.Emit("LEAQ" , jit.Sib(_SI, _SI, 2, 0), _SI) // LEAQ (SI)(SI*2), SI - self.Emit("MOVQ" , _SI, jit.Ptr(_VP, 16)) // MOVQ SI, 16(VP) - self.malloc_AX(_SI, _SI) // MALLOC SI, SI - - // TODO: due to base64x's bug, only use AVX mode now - self.Emit("MOVL", jit.Imm(_MODE_JSON), _CX) // MOVL $_MODE_JSON, CX - - /* call the decoder */ - self.Emit("XORL" , _DX, _DX) // XORL DX, DX - self.Emit("MOVQ" , _VP, _DI) // MOVQ VP, DI - - self.Emit("MOVQ" , jit.Ptr(_VP, 0), _R8) // MOVQ SI, (VP) - self.WriteRecNotAX(4, _SI, jit.Ptr(_VP, 0), true, false) // XCHGQ SI, (VP) - self.Emit("MOVQ" , _R8, _SI) - - self.Emit("XCHGQ", _DX, jit.Ptr(_VP, 8)) // XCHGQ DX, 8(VP) - self.call_c(_F_b64decode) // CALL b64decode - self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX - self.Sjmp("JS" , _LB_base64_error) // JS _base64_error - self.Emit("MOVQ" , _AX, jit.Ptr(_VP, 8)) // MOVQ AX, 8(VP) -} - -func (self *_Assembler) _asm_OP_bool(_ *_Instr) { - self.Emit("LEAQ", jit.Ptr(_IC, 4), _AX) // LEAQ 4(IC), AX - self.Emit("CMPQ", _AX, _IL) // CMPQ AX, IL - self.Sjmp("JA" , _LB_eof_error) // JA _eof_error - self.Emit("CMPB", jit.Sib(_IP, _IC, 1, 0), jit.Imm('f')) // CMPB (IP)(IC), $'f' - self.Sjmp("JE" , "_false_{n}") // JE _false_{n} - self.Emit("MOVL", jit.Imm(_IM_true), _CX) // MOVL $"true", CX - self.Emit("CMPL", _CX, jit.Sib(_IP, _IC, 1, 0)) // CMPL CX, (IP)(IC) - self.Sjmp("JE" , "_bool_true_{n}") - // try to skip the value - self.Emit("MOVQ", _IC, _VAR_ic) - self.Emit("MOVQ", _T_bool, _ET) - self.Emit("MOVQ", _ET, _VAR_et) - self.Byte(0x4c, 0x8d, 0x0d) // LEAQ (PC), R9 - self.Sref("_end_{n}", 4) - self.Emit("MOVQ", _R9, _VAR_pc) - self.Sjmp("JMP" , _LB_skip_one) - - self.Link("_bool_true_{n}") - self.Emit("MOVQ", _AX, _IC) // MOVQ AX, IC - self.Emit("MOVB", jit.Imm(1), jit.Ptr(_VP, 0)) // MOVB $1, (VP) - self.Sjmp("JMP" , "_end_{n}") // JMP _end_{n} - self.Link("_false_{n}") // _false_{n}: - self.Emit("ADDQ", jit.Imm(1), _AX) // ADDQ $1, AX - self.Emit("ADDQ", jit.Imm(1), _IC) // ADDQ $1, IC - self.Emit("CMPQ", _AX, _IL) // CMPQ AX, IL - self.Sjmp("JA" , _LB_eof_error) // JA _eof_error - self.Emit("MOVL", jit.Imm(_IM_alse), _CX) // MOVL $"alse", CX - self.Emit("CMPL", _CX, jit.Sib(_IP, _IC, 1, 0)) // CMPL CX, (IP)(IC) - self.Sjmp("JNE" , _LB_im_error) // JNE _im_error - self.Emit("MOVQ", _AX, _IC) // MOVQ AX, IC - self.Emit("XORL", _AX, _AX) // XORL AX, AX - self.Emit("MOVB", _AX, jit.Ptr(_VP, 0)) // MOVB AX, (VP) - self.Link("_end_{n}") // _end_{n}: -} - -func (self *_Assembler) _asm_OP_num(_ *_Instr) { - self.Emit("MOVQ", jit.Imm(0), _VAR_fl) - self.Emit("CMPB", jit.Sib(_IP, _IC, 1, 0), jit.Imm('"')) - self.Emit("MOVQ", _IC, _BX) - self.Sjmp("JNE", "_skip_number_{n}") - self.Emit("MOVQ", jit.Imm(1), _VAR_fl) - self.Emit("ADDQ", jit.Imm(1), _IC) - self.Link("_skip_number_{n}") - - /* call skip_number */ - self.Emit("LEAQ", _ARG_s, _DI) // LEAQ s<>+0(FP), DI - self.Emit("MOVQ", _IC, _ARG_ic) // MOVQ IC, ic<>+16(FP) - self.Emit("LEAQ", _ARG_ic, _SI) // LEAQ ic<>+16(FP), SI - self.callc(_F_skip_number) // CALL _F_skip_number - self.Emit("MOVQ", _ARG_ic, _IC) // MOVQ ic<>+16(FP), IC - self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX - self.Sjmp("JNS" , "_num_next_{n}") - - /* call skip one */ - self.Emit("MOVQ", _BX, _VAR_ic) - self.Emit("MOVQ", _T_number, _ET) - self.Emit("MOVQ", _ET, _VAR_et) - self.Byte(0x4c, 0x8d, 0x0d) - self.Sref("_num_end_{n}", 4) - self.Emit("MOVQ", _R9, _VAR_pc) - self.Sjmp("JMP" , _LB_skip_one) - - /* assign string */ - self.Link("_num_next_{n}") - self.slice_from_r(_AX, 0) - self.Emit("BTQ", jit.Imm(_F_copy_string), _ARG_fv) - self.Sjmp("JNC", "_num_write_{n}") - self.Byte(0x4c, 0x8d, 0x0d) // LEAQ (PC), R9 - self.Sref("_num_write_{n}", 4) - self.Sjmp("JMP", "_copy_string") - self.Link("_num_write_{n}") - self.Emit("MOVQ", _SI, jit.Ptr(_VP, 8)) // MOVQ SI, 8(VP) - self.WriteRecNotAX(13, _DI, jit.Ptr(_VP, 0), false, false) - self.Emit("CMPQ", _VAR_fl, jit.Imm(1)) - self.Sjmp("JNE", "_num_end_{n}") - self.Emit("CMPB", jit.Sib(_IP, _IC, 1, 0), jit.Imm('"')) - self.Sjmp("JNE", _LB_char_0_error) - self.Emit("ADDQ", jit.Imm(1), _IC) - self.Link("_num_end_{n}") -} - -func (self *_Assembler) _asm_OP_i8(_ *_Instr) { - var pin = "_i8_end_{n}" - self.parse_signed(int8Type, pin, -1) // PARSE int8 - self.range_signed_CX(_I_int8, _T_int8, math.MinInt8, math.MaxInt8) // RANGE int8 - self.Emit("MOVB", _CX, jit.Ptr(_VP, 0)) // MOVB CX, (VP) - self.Link(pin) -} - -func (self *_Assembler) _asm_OP_i16(_ *_Instr) { - var pin = "_i16_end_{n}" - self.parse_signed(int16Type, pin, -1) // PARSE int16 - self.range_signed_CX(_I_int16, _T_int16, math.MinInt16, math.MaxInt16) // RANGE int16 - self.Emit("MOVW", _CX, jit.Ptr(_VP, 0)) // MOVW CX, (VP) - self.Link(pin) -} - -func (self *_Assembler) _asm_OP_i32(_ *_Instr) { - var pin = "_i32_end_{n}" - self.parse_signed(int32Type, pin, -1) // PARSE int32 - self.range_signed_CX(_I_int32, _T_int32, math.MinInt32, math.MaxInt32) // RANGE int32 - self.Emit("MOVL", _CX, jit.Ptr(_VP, 0)) // MOVL CX, (VP) - self.Link(pin) -} - -func (self *_Assembler) _asm_OP_i64(_ *_Instr) { - var pin = "_i64_end_{n}" - self.parse_signed(int64Type, pin, -1) // PARSE int64 - self.Emit("MOVQ", _VAR_st_Iv, _AX) // MOVQ st.Iv, AX - self.Emit("MOVQ", _AX, jit.Ptr(_VP, 0)) // MOVQ AX, (VP) - self.Link(pin) -} - -func (self *_Assembler) _asm_OP_u8(_ *_Instr) { - var pin = "_u8_end_{n}" - self.parse_unsigned(uint8Type, pin, -1) // PARSE uint8 - self.range_unsigned_CX(_I_uint8, _T_uint8, math.MaxUint8) // RANGE uint8 - self.Emit("MOVB", _CX, jit.Ptr(_VP, 0)) // MOVB CX, (VP) - self.Link(pin) -} - -func (self *_Assembler) _asm_OP_u16(_ *_Instr) { - var pin = "_u16_end_{n}" - self.parse_unsigned(uint16Type, pin, -1) // PARSE uint16 - self.range_unsigned_CX(_I_uint16, _T_uint16, math.MaxUint16) // RANGE uint16 - self.Emit("MOVW", _CX, jit.Ptr(_VP, 0)) // MOVW CX, (VP) - self.Link(pin) -} - -func (self *_Assembler) _asm_OP_u32(_ *_Instr) { - var pin = "_u32_end_{n}" - self.parse_unsigned(uint32Type, pin, -1) // PARSE uint32 - self.range_unsigned_CX(_I_uint32, _T_uint32, math.MaxUint32) // RANGE uint32 - self.Emit("MOVL", _CX, jit.Ptr(_VP, 0)) // MOVL CX, (VP) - self.Link(pin) -} - -func (self *_Assembler) _asm_OP_u64(_ *_Instr) { - var pin = "_u64_end_{n}" - self.parse_unsigned(uint64Type, pin, -1) // PARSE uint64 - self.Emit("MOVQ", _VAR_st_Iv, _AX) // MOVQ st.Iv, AX - self.Emit("MOVQ", _AX, jit.Ptr(_VP, 0)) // MOVQ AX, (VP) - self.Link(pin) -} - -func (self *_Assembler) _asm_OP_f32(_ *_Instr) { - var pin = "_f32_end_{n}" - self.parse_number(float32Type, pin, -1) // PARSE NUMBER - self.range_single_X0() // RANGE float32 - self.Emit("MOVSS", _X0, jit.Ptr(_VP, 0)) // MOVSS X0, (VP) - self.Link(pin) -} - -func (self *_Assembler) _asm_OP_f64(_ *_Instr) { - var pin = "_f64_end_{n}" - self.parse_number(float64Type, pin, -1) // PARSE NUMBER - self.Emit("MOVSD", _VAR_st_Dv, _X0) // MOVSD st.Dv, X0 - self.Emit("MOVSD", _X0, jit.Ptr(_VP, 0)) // MOVSD X0, (VP) - self.Link(pin) -} - -func (self *_Assembler) _asm_OP_unquote(_ *_Instr) { - self.check_eof(2) - self.Emit("CMPB", jit.Sib(_IP, _IC, 1, 0), jit.Imm('\\')) // CMPB (IP)(IC), $'\\' - self.Sjmp("JNE" , _LB_char_0_error) // JNE _char_0_error - self.Emit("CMPB", jit.Sib(_IP, _IC, 1, 1), jit.Imm('"')) // CMPB 1(IP)(IC), $'"' - self.Sjmp("JNE" , _LB_char_1_error) // JNE _char_1_error - self.Emit("ADDQ", jit.Imm(2), _IC) // ADDQ $2, IC - self.parse_string() // PARSE STRING - self.unquote_twice(jit.Ptr(_VP, 0), jit.Ptr(_VP, 8), false) // UNQUOTE twice, (VP), 8(VP) -} - -func (self *_Assembler) _asm_OP_nil_1(_ *_Instr) { - self.Emit("XORL", _AX, _AX) // XORL AX, AX - self.Emit("MOVQ", _AX, jit.Ptr(_VP, 0)) // MOVQ AX, (VP) -} - -func (self *_Assembler) _asm_OP_nil_2(_ *_Instr) { - self.Emit("PXOR" , _X0, _X0) // PXOR X0, X0 - self.Emit("MOVOU", _X0, jit.Ptr(_VP, 0)) // MOVOU X0, (VP) -} - -func (self *_Assembler) _asm_OP_nil_3(_ *_Instr) { - self.Emit("XORL" , _AX, _AX) // XORL AX, AX - self.Emit("PXOR" , _X0, _X0) // PXOR X0, X0 - self.Emit("MOVOU", _X0, jit.Ptr(_VP, 0)) // MOVOU X0, (VP) - self.Emit("MOVQ" , _AX, jit.Ptr(_VP, 16)) // MOVOU AX, 16(VP) -} - -func (self *_Assembler) _asm_OP_deref(p *_Instr) { - self.vfollow(p.vt()) -} - -func (self *_Assembler) _asm_OP_index(p *_Instr) { - self.Emit("MOVQ", jit.Imm(p.i64()), _AX) // MOVQ ${p.vi()}, AX - self.Emit("ADDQ", _AX, _VP) // ADDQ _AX, _VP -} - -func (self *_Assembler) _asm_OP_is_null(p *_Instr) { - self.Emit("LEAQ" , jit.Ptr(_IC, 4), _AX) // LEAQ 4(IC), AX - self.Emit("CMPQ" , _AX, _IL) // CMPQ AX, IL - self.Sjmp("JA" , "_not_null_{n}") // JA _not_null_{n} - self.Emit("CMPL" , jit.Sib(_IP, _IC, 1, 0), jit.Imm(_IM_null)) // CMPL (IP)(IC), $"null" - self.Emit("CMOVQEQ", _AX, _IC) // CMOVQEQ AX, IC - self.Xjmp("JE" , p.vi()) // JE {p.vi()} - self.Link("_not_null_{n}") // _not_null_{n}: -} - -func (self *_Assembler) _asm_OP_is_null_quote(p *_Instr) { - self.Emit("LEAQ" , jit.Ptr(_IC, 5), _AX) // LEAQ 4(IC), AX - self.Emit("CMPQ" , _AX, _IL) // CMPQ AX, IL - self.Sjmp("JA" , "_not_null_quote_{n}") // JA _not_null_quote_{n} - self.Emit("CMPL" , jit.Sib(_IP, _IC, 1, 0), jit.Imm(_IM_null)) // CMPL (IP)(IC), $"null" - self.Sjmp("JNE" , "_not_null_quote_{n}") // JNE _not_null_quote_{n} - self.Emit("CMPB" , jit.Sib(_IP, _IC, 1, 4), jit.Imm('"')) // CMPB 4(IP)(IC), $'"' - self.Emit("CMOVQEQ", _AX, _IC) // CMOVQEQ AX, IC - self.Xjmp("JE" , p.vi()) // JE {p.vi()} - self.Link("_not_null_quote_{n}") // _not_null_quote_{n}: -} - -func (self *_Assembler) _asm_OP_map_init(_ *_Instr) { - self.Emit("MOVQ" , jit.Ptr(_VP, 0), _AX) // MOVQ (VP), AX - self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX - self.Sjmp("JNZ" , "_end_{n}") // JNZ _end_{n} - self.call_go(_F_makemap_small) // CALL_GO makemap_small - self.WritePtrAX(6, jit.Ptr(_VP, 0), false) // MOVQ AX, (VP) - self.Link("_end_{n}") // _end_{n}: - self.Emit("MOVQ" , _AX, _VP) // MOVQ AX, VP -} - -func (self *_Assembler) _asm_OP_map_key_i8(p *_Instr) { - self.parse_signed(int8Type, "", p.vi()) // PARSE int8 - self.range_signed_CX(_I_int8, _T_int8, math.MinInt8, math.MaxInt8) // RANGE int8 - self.match_char('"') - self.mapassign_std(p.vt(), _VAR_st_Iv) // MAPASSIGN int8, mapassign, st.Iv -} - -func (self *_Assembler) _asm_OP_map_key_i16(p *_Instr) { - self.parse_signed(int16Type, "", p.vi()) // PARSE int16 - self.range_signed_CX(_I_int16, _T_int16, math.MinInt16, math.MaxInt16) // RANGE int16 - self.match_char('"') - self.mapassign_std(p.vt(), _VAR_st_Iv) // MAPASSIGN int16, mapassign, st.Iv -} - -func (self *_Assembler) _asm_OP_map_key_i32(p *_Instr) { - self.parse_signed(int32Type, "", p.vi()) // PARSE int32 - self.range_signed_CX(_I_int32, _T_int32, math.MinInt32, math.MaxInt32) // RANGE int32 - self.match_char('"') - if vt := p.vt(); !mapfast(vt) { - self.mapassign_std(vt, _VAR_st_Iv) // MAPASSIGN int32, mapassign, st.Iv - } else { - self.Emit("MOVQ", _CX, _AX) // MOVQ CX, AX - self.mapassign_fastx(vt, _F_mapassign_fast32) // MAPASSIGN int32, mapassign_fast32 - } -} - -func (self *_Assembler) _asm_OP_map_key_i64(p *_Instr) { - self.parse_signed(int64Type, "", p.vi()) // PARSE int64 - self.match_char('"') - if vt := p.vt(); !mapfast(vt) { - self.mapassign_std(vt, _VAR_st_Iv) // MAPASSIGN int64, mapassign, st.Iv - } else { - self.Emit("MOVQ", _VAR_st_Iv, _AX) // MOVQ st.Iv, AX - self.mapassign_fastx(vt, _F_mapassign_fast64) // MAPASSIGN int64, mapassign_fast64 - } -} - -func (self *_Assembler) _asm_OP_map_key_u8(p *_Instr) { - self.parse_unsigned(uint8Type, "", p.vi()) // PARSE uint8 - self.range_unsigned_CX(_I_uint8, _T_uint8, math.MaxUint8) // RANGE uint8 - self.match_char('"') - self.mapassign_std(p.vt(), _VAR_st_Iv) // MAPASSIGN uint8, vt.Iv -} - -func (self *_Assembler) _asm_OP_map_key_u16(p *_Instr) { - self.parse_unsigned(uint16Type, "", p.vi()) // PARSE uint16 - self.range_unsigned_CX(_I_uint16, _T_uint16, math.MaxUint16) // RANGE uint16 - self.match_char('"') - self.mapassign_std(p.vt(), _VAR_st_Iv) // MAPASSIGN uint16, vt.Iv -} - -func (self *_Assembler) _asm_OP_map_key_u32(p *_Instr) { - self.parse_unsigned(uint32Type, "", p.vi()) // PARSE uint32 - self.range_unsigned_CX(_I_uint32, _T_uint32, math.MaxUint32) // RANGE uint32 - self.match_char('"') - if vt := p.vt(); !mapfast(vt) { - self.mapassign_std(vt, _VAR_st_Iv) // MAPASSIGN uint32, vt.Iv - } else { - self.Emit("MOVQ", _CX, _AX) // MOVQ CX, AX - self.mapassign_fastx(vt, _F_mapassign_fast32) // MAPASSIGN uint32, mapassign_fast32 - } -} - -func (self *_Assembler) _asm_OP_map_key_u64(p *_Instr) { - self.parse_unsigned(uint64Type, "", p.vi()) // PARSE uint64 - self.match_char('"') - if vt := p.vt(); !mapfast(vt) { - self.mapassign_std(vt, _VAR_st_Iv) // MAPASSIGN uint64, vt.Iv - } else { - self.Emit("MOVQ", _VAR_st_Iv, _AX) // MOVQ st.Iv, AX - self.mapassign_fastx(vt, _F_mapassign_fast64) // MAPASSIGN uint64, mapassign_fast64 - } -} - -func (self *_Assembler) _asm_OP_map_key_f32(p *_Instr) { - self.parse_number(float32Type, "", p.vi()) // PARSE NUMBER - self.range_single_X0() // RANGE float32 - self.Emit("MOVSS", _X0, _VAR_st_Dv) // MOVSS X0, st.Dv - self.match_char('"') - self.mapassign_std(p.vt(), _VAR_st_Dv) // MAPASSIGN ${p.vt()}, mapassign, st.Dv -} - -func (self *_Assembler) _asm_OP_map_key_f64(p *_Instr) { - self.parse_number(float64Type, "", p.vi()) // PARSE NUMBER - self.match_char('"') - self.mapassign_std(p.vt(), _VAR_st_Dv) // MAPASSIGN ${p.vt()}, mapassign, st.Dv -} - -func (self *_Assembler) _asm_OP_map_key_str(p *_Instr) { - self.parse_string() // PARSE STRING - self.unquote_once(_ARG_sv_p, _ARG_sv_n, true, true) // UNQUOTE once, sv.p, sv.n - if vt := p.vt(); !mapfast(vt) { - self.valloc(vt.Key(), _DI) - self.Emit("MOVOU", _ARG_sv, _X0) - self.Emit("MOVOU", _X0, jit.Ptr(_DI, 0)) - self.mapassign_std(vt, jit.Ptr(_DI, 0)) // MAPASSIGN string, DI, SI - } else { - self.mapassign_str_fast(vt, _ARG_sv_p, _ARG_sv_n) // MAPASSIGN string, DI, SI - } -} - -func (self *_Assembler) _asm_OP_map_key_utext(p *_Instr) { - self.parse_string() // PARSE STRING - self.unquote_once(_ARG_sv_p, _ARG_sv_n, true, true) // UNQUOTE once, sv.p, sv.n - self.mapassign_utext(p.vt(), false) // MAPASSIGN utext, ${p.vt()}, false -} - -func (self *_Assembler) _asm_OP_map_key_utext_p(p *_Instr) { - self.parse_string() // PARSE STRING - self.unquote_once(_ARG_sv_p, _ARG_sv_n, true, true) // UNQUOTE once, sv.p, sv.n - self.mapassign_utext(p.vt(), true) // MAPASSIGN utext, ${p.vt()}, true -} - -func (self *_Assembler) _asm_OP_array_skip(_ *_Instr) { - self.call_sf(_F_skip_array) // CALL_SF skip_array - self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX - self.Sjmp("JS" , _LB_parsing_error_v) // JS _parse_error_v -} - -func (self *_Assembler) _asm_OP_array_clear(p *_Instr) { - self.mem_clear_rem(p.i64(), true) -} - -func (self *_Assembler) _asm_OP_array_clear_p(p *_Instr) { - self.mem_clear_rem(p.i64(), false) -} - -func (self *_Assembler) _asm_OP_slice_init(p *_Instr) { - self.Emit("XORL" , _AX, _AX) // XORL AX, AX - self.Emit("MOVQ" , _AX, jit.Ptr(_VP, 8)) // MOVQ AX, 8(VP) - self.Emit("MOVQ" , jit.Ptr(_VP, 16), _BX) // MOVQ 16(VP), BX - self.Emit("TESTQ", _BX, _BX) // TESTQ BX, BX - self.Sjmp("JNZ" , "_done_{n}") // JNZ _done_{n} - self.Emit("MOVQ" , jit.Imm(_MinSlice), _CX) // MOVQ ${_MinSlice}, CX - self.Emit("MOVQ" , _CX, jit.Ptr(_VP, 16)) // MOVQ CX, 16(VP) - self.Emit("MOVQ" , jit.Type(p.vt()), _AX) // MOVQ ${p.vt()}, DX - self.call_go(_F_makeslice) // CALL_GO makeslice - self.WritePtrAX(7, jit.Ptr(_VP, 0), false) // MOVQ AX, (VP) - self.Emit("XORL" , _AX, _AX) // XORL AX, AX - self.Emit("MOVQ" , _AX, jit.Ptr(_VP, 8)) // MOVQ AX, 8(VP) - self.Link("_done_{n}") // _done_{n} -} - -func (self *_Assembler) _asm_OP_check_empty(p *_Instr) { - rbracket := p.vb() - if rbracket == ']' { - self.check_eof(1) - self.Emit("LEAQ", jit.Ptr(_IC, 1), _AX) // LEAQ 1(IC), AX - self.Emit("CMPB", jit.Sib(_IP, _IC, 1, 0), jit.Imm(int64(rbracket))) // CMPB (IP)(IC), ']' - self.Sjmp("JNE" , "_not_empty_array_{n}") // JNE _not_empty_array_{n} - self.Emit("MOVQ", _AX, _IC) // MOVQ AX, IC - self.Emit("MOVQ", jit.Imm(_Zero_Base), _AX) - self.WritePtrAX(9, jit.Ptr(_VP, 0), false) - self.Emit("PXOR", _X0, _X0) // PXOR X0, X0 - self.Emit("MOVOU", _X0, jit.Ptr(_VP, 8)) // MOVOU X0, 8(VP) - self.Xjmp("JMP" , p.vi()) // JMP {p.vi()} - self.Link("_not_empty_array_{n}") - } else { - panic("only implement check empty array here!") - } -} - -func (self *_Assembler) _asm_OP_slice_append(p *_Instr) { - self.Emit("MOVQ" , jit.Ptr(_VP, 8), _AX) // MOVQ 8(VP), AX - self.Emit("CMPQ" , _AX, jit.Ptr(_VP, 16)) // CMPQ AX, 16(VP) - self.Sjmp("JB" , "_index_{n}") // JB _index_{n} - self.Emit("MOVQ" , _AX, _SI) // MOVQ AX, SI - self.Emit("SHLQ" , jit.Imm(1), _SI) // SHLQ $1, SI - self.Emit("MOVQ" , jit.Type(p.vt()), _AX) // MOVQ ${p.vt()}, AX - self.Emit("MOVQ" , jit.Ptr(_VP, 0), _BX) // MOVQ (VP), BX - self.Emit("MOVQ" , jit.Ptr(_VP, 8), _CX) // MOVQ 8(VP), CX - self.Emit("MOVQ" , jit.Ptr(_VP, 16), _DI) // MOVQ 16(VP), DI - self.call_go(_F_growslice) // CALL_GO growslice - self.WritePtrAX(8, jit.Ptr(_VP, 0), false) // MOVQ AX, (VP) - self.Emit("MOVQ" , _BX, jit.Ptr(_VP, 8)) // MOVQ BX, 8(VP) - self.Emit("MOVQ" , _CX, jit.Ptr(_VP, 16)) // MOVQ CX, 16(VP) - - // because growslice not zero memory {oldcap, newlen} when append et not has ptrdata. - // but we should zero it, avoid decode it as random values. - if rt.UnpackType(p.vt()).PtrData == 0 { - self.Emit("MOVQ" , _CX, _DI) // MOVQ CX, DI - self.Emit("SUBQ" , _BX, _DI) // MOVQ BX, DI - - self.Emit("ADDQ" , jit.Imm(1), jit.Ptr(_VP, 8)) // ADDQ $1, 8(VP) - self.Emit("MOVQ" , _AX, _VP) // MOVQ AX, VP - self.Emit("MOVQ" , jit.Imm(int64(p.vlen())), _CX) // MOVQ ${p.vlen()}, CX - self.Emit("MOVQ" , _BX, _AX) // MOVQ BX, AX - self.From("MULQ" , _CX) // MULQ CX - self.Emit("ADDQ" , _AX, _VP) // ADDQ AX, VP - - self.Emit("MOVQ" , _DI, _AX) // MOVQ SI, AX - self.From("MULQ" , _CX) // MULQ BX - self.Emit("MOVQ" , _AX, _BX) // ADDQ AX, BX - self.Emit("MOVQ" , _VP, _AX) // MOVQ VP, AX - self.mem_clear_fn(true) // CALL_GO memclr{Has,NoHeap} - self.Sjmp("JMP", "_append_slice_end_{n}") - } - - self.Emit("MOVQ" , _BX, _AX) // MOVQ BX, AX - self.Link("_index_{n}") // _index_{n}: - self.Emit("ADDQ" , jit.Imm(1), jit.Ptr(_VP, 8)) // ADDQ $1, 8(VP) - self.Emit("MOVQ" , jit.Ptr(_VP, 0), _VP) // MOVQ (VP), VP - self.Emit("MOVQ" , jit.Imm(int64(p.vlen())), _CX) // MOVQ ${p.vlen()}, CX - self.From("MULQ" , _CX) // MULQ CX - self.Emit("ADDQ" , _AX, _VP) // ADDQ AX, VP - self.Link("_append_slice_end_{n}") -} - -func (self *_Assembler) _asm_OP_object_next(_ *_Instr) { - self.call_sf(_F_skip_one) // CALL_SF skip_one - self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX - self.Sjmp("JS" , _LB_parsing_error_v) // JS _parse_error_v -} - -func (self *_Assembler) _asm_OP_struct_field(p *_Instr) { - assert_eq(caching.FieldEntrySize, 32, "invalid field entry size") - self.Emit("MOVQ" , jit.Imm(-1), _AX) // MOVQ $-1, AX - self.Emit("MOVQ" , _AX, _VAR_sr) // MOVQ AX, sr - self.parse_string() // PARSE STRING - self.unquote_once(_ARG_sv_p, _ARG_sv_n, true, false) // UNQUOTE once, sv.p, sv.n - self.Emit("LEAQ" , _ARG_sv, _AX) // LEAQ sv, AX - self.Emit("XORL" , _BX, _BX) // XORL BX, BX - self.call_go(_F_strhash) // CALL_GO strhash - self.Emit("MOVQ" , _AX, _R9) // MOVQ AX, R9 - self.Emit("MOVQ" , jit.Imm(freezeFields(p.vf())), _CX) // MOVQ ${p.vf()}, CX - self.Emit("MOVQ" , jit.Ptr(_CX, caching.FieldMap_b), _SI) // MOVQ FieldMap.b(CX), SI - self.Emit("MOVQ" , jit.Ptr(_CX, caching.FieldMap_N), _CX) // MOVQ FieldMap.N(CX), CX - self.Emit("TESTQ", _CX, _CX) // TESTQ CX, CX - self.Sjmp("JZ" , "_try_lowercase_{n}") // JZ _try_lowercase_{n} - self.Link("_loop_{n}") // _loop_{n}: - self.Emit("XORL" , _DX, _DX) // XORL DX, DX - self.From("DIVQ" , _CX) // DIVQ CX - self.Emit("LEAQ" , jit.Ptr(_DX, 1), _AX) // LEAQ 1(DX), AX - self.Emit("SHLQ" , jit.Imm(5), _DX) // SHLQ $5, DX - self.Emit("LEAQ" , jit.Sib(_SI, _DX, 1, 0), _DI) // LEAQ (SI)(DX), DI - self.Emit("MOVQ" , jit.Ptr(_DI, _Fe_Hash), _R8) // MOVQ FieldEntry.Hash(DI), R8 - self.Emit("TESTQ", _R8, _R8) // TESTQ R8, R8 - self.Sjmp("JZ" , "_try_lowercase_{n}") // JZ _try_lowercase_{n} - self.Emit("CMPQ" , _R8, _R9) // CMPQ R8, R9 - self.Sjmp("JNE" , "_loop_{n}") // JNE _loop_{n} - self.Emit("MOVQ" , jit.Ptr(_DI, _Fe_Name + 8), _DX) // MOVQ FieldEntry.Name+8(DI), DX - self.Emit("CMPQ" , _DX, _ARG_sv_n) // CMPQ DX, sv.n - self.Sjmp("JNE" , "_loop_{n}") // JNE _loop_{n} - self.Emit("MOVQ" , jit.Ptr(_DI, _Fe_ID), _R8) // MOVQ FieldEntry.ID(DI), R8 - self.Emit("MOVQ" , _AX, _VAR_ss_AX) // MOVQ AX, ss.AX - self.Emit("MOVQ" , _CX, _VAR_ss_CX) // MOVQ CX, ss.CX - self.Emit("MOVQ" , _SI, _VAR_ss_SI) // MOVQ SI, ss.SI - self.Emit("MOVQ" , _R8, _VAR_ss_R8) // MOVQ R8, ss.R8 - self.Emit("MOVQ" , _R9, _VAR_ss_R9) // MOVQ R9, ss.R9 - self.Emit("MOVQ" , _ARG_sv_p, _AX) // MOVQ _VAR_sv_p, AX - self.Emit("MOVQ" , jit.Ptr(_DI, _Fe_Name), _CX) // MOVQ FieldEntry.Name(DI), CX - self.Emit("MOVQ" , _CX, _BX) // MOVQ CX, 8(SP) - self.Emit("MOVQ" , _DX, _CX) // MOVQ DX, 16(SP) - self.call_go(_F_memequal) // CALL_GO memequal - self.Emit("MOVB" , _AX, _DX) // MOVB 24(SP), DX - self.Emit("MOVQ" , _VAR_ss_AX, _AX) // MOVQ ss.AX, AX - self.Emit("MOVQ" , _VAR_ss_CX, _CX) // MOVQ ss.CX, CX - self.Emit("MOVQ" , _VAR_ss_SI, _SI) // MOVQ ss.SI, SI - self.Emit("MOVQ" , _VAR_ss_R9, _R9) // MOVQ ss.R9, R9 - self.Emit("TESTB", _DX, _DX) // TESTB DX, DX - self.Sjmp("JZ" , "_loop_{n}") // JZ _loop_{n} - self.Emit("MOVQ" , _VAR_ss_R8, _R8) // MOVQ ss.R8, R8 - self.Emit("MOVQ" , _R8, _VAR_sr) // MOVQ R8, sr - self.Sjmp("JMP" , "_end_{n}") // JMP _end_{n} - self.Link("_try_lowercase_{n}") // _try_lowercase_{n}: - self.Emit("MOVQ" , jit.Imm(referenceFields(p.vf())), _AX) // MOVQ ${p.vf()}, AX - self.Emit("MOVQ", _ARG_sv_p, _BX) // MOVQ sv, BX - self.Emit("MOVQ", _ARG_sv_n, _CX) // MOVQ sv, CX - self.call_go(_F_FieldMap_GetCaseInsensitive) // CALL_GO FieldMap::GetCaseInsensitive - self.Emit("MOVQ" , _AX, _VAR_sr) // MOVQ AX, _VAR_sr - self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX - self.Sjmp("JNS" , "_end_{n}") // JNS _end_{n} - self.Emit("BTQ" , jit.Imm(_F_disable_unknown), _ARG_fv) // BTQ ${_F_disable_unknown}, fv - self.Sjmp("JC" , _LB_field_error) // JC _field_error - self.Link("_end_{n}") // _end_{n}: -} - -func (self *_Assembler) _asm_OP_unmarshal(p *_Instr) { - if iv := p.i64(); iv != 0 { - self.unmarshal_json(p.vt(), true, _F_decodeJsonUnmarshalerQuoted) - } else { - self.unmarshal_json(p.vt(), true, _F_decodeJsonUnmarshaler) - } -} - -func (self *_Assembler) _asm_OP_unmarshal_p(p *_Instr) { - if iv := p.i64(); iv != 0 { - self.unmarshal_json(p.vt(), false, _F_decodeJsonUnmarshalerQuoted) - } else { - self.unmarshal_json(p.vt(), false, _F_decodeJsonUnmarshaler) - } -} - -func (self *_Assembler) _asm_OP_unmarshal_text(p *_Instr) { - self.unmarshal_text(p.vt(), true) -} - -func (self *_Assembler) _asm_OP_unmarshal_text_p(p *_Instr) { - self.unmarshal_text(p.vt(), false) -} - -func (self *_Assembler) _asm_OP_lspace(_ *_Instr) { - self.lspace("_{n}") -} - -func (self *_Assembler) lspace(subfix string) { - var label = "_lspace" + subfix - self.Emit("CMPQ" , _IC, _IL) // CMPQ IC, IL - self.Sjmp("JAE" , _LB_eof_error) // JAE _eof_error - self.Emit("MOVQ" , jit.Imm(_BM_space), _DX) // MOVQ _BM_space, DX - self.Emit("MOVBQZX", jit.Sib(_IP, _IC, 1, 0), _AX) // MOVBQZX (IP)(IC), AX - self.Emit("CMPQ" , _AX, jit.Imm(' ')) // CMPQ AX, $' ' - self.Sjmp("JA" , label) // JA _nospace_{n} - self.Emit("BTQ" , _AX, _DX) // BTQ AX, DX - self.Sjmp("JNC" , label) // JNC _nospace_{n} - - /* test up to 4 characters */ - for i := 0; i < 3; i++ { - self.Emit("ADDQ" , jit.Imm(1), _IC) // ADDQ $1, IC - self.Emit("CMPQ" , _IC, _IL) // CMPQ IC, IL - self.Sjmp("JAE" , _LB_eof_error) // JAE _eof_error - self.Emit("MOVBQZX", jit.Sib(_IP, _IC, 1, 0), _AX) // MOVBQZX (IP)(IC), AX - self.Emit("CMPQ" , _AX, jit.Imm(' ')) // CMPQ AX, $' ' - self.Sjmp("JA" , label) // JA _nospace_{n} - self.Emit("BTQ" , _AX, _DX) // BTQ AX, DX - self.Sjmp("JNC" , label) // JNC _nospace_{n} - } - - /* handle over to the native function */ - self.Emit("MOVQ" , _IP, _DI) // MOVQ IP, DI - self.Emit("MOVQ" , _IL, _SI) // MOVQ IL, SI - self.Emit("MOVQ" , _IC, _DX) // MOVQ IC, DX - self.callc(_F_lspace) // CALL lspace - self.Emit("TESTQ" , _AX, _AX) // TESTQ AX, AX - self.Sjmp("JS" , _LB_parsing_error_v) // JS _parsing_error_v - self.Emit("CMPQ" , _AX, _IL) // CMPQ AX, IL - self.Sjmp("JAE" , _LB_eof_error) // JAE _eof_error - self.Emit("MOVQ" , _AX, _IC) // MOVQ AX, IC - self.Link(label) // _nospace_{n}: -} - -func (self *_Assembler) _asm_OP_match_char(p *_Instr) { - self.match_char(p.vb()) -} - -func (self *_Assembler) match_char(char byte) { - self.check_eof(1) - self.Emit("CMPB", jit.Sib(_IP, _IC, 1, 0), jit.Imm(int64(char))) // CMPB (IP)(IC), ${p.vb()} - self.Sjmp("JNE" , _LB_char_0_error) // JNE _char_0_error - self.Emit("ADDQ", jit.Imm(1), _IC) // ADDQ $1, IC -} - -func (self *_Assembler) _asm_OP_check_char(p *_Instr) { - self.check_eof(1) - self.Emit("LEAQ" , jit.Ptr(_IC, 1), _AX) // LEAQ 1(IC), AX - self.Emit("CMPB" , jit.Sib(_IP, _IC, 1, 0), jit.Imm(int64(p.vb()))) // CMPB (IP)(IC), ${p.vb()} - self.Emit("CMOVQEQ", _AX, _IC) // CMOVQEQ AX, IC - self.Xjmp("JE" , p.vi()) // JE {p.vi()} -} - -func (self *_Assembler) _asm_OP_check_char_0(p *_Instr) { - self.check_eof(1) - self.Emit("CMPB", jit.Sib(_IP, _IC, 1, 0), jit.Imm(int64(p.vb()))) // CMPB (IP)(IC), ${p.vb()} - self.Xjmp("JE" , p.vi()) // JE {p.vi()} -} - -func (self *_Assembler) _asm_OP_add(p *_Instr) { - self.Emit("ADDQ", jit.Imm(int64(p.vi())), _IC) // ADDQ ${p.vi()}, IC -} - -func (self *_Assembler) _asm_OP_load(_ *_Instr) { - self.Emit("MOVQ", jit.Ptr(_ST, 0), _AX) // MOVQ (ST), AX - self.Emit("MOVQ", jit.Sib(_ST, _AX, 1, 0), _VP) // MOVQ (ST)(AX), VP -} - -func (self *_Assembler) _asm_OP_save(_ *_Instr) { - self.Emit("MOVQ", jit.Ptr(_ST, 0), _CX) // MOVQ (ST), CX - self.Emit("CMPQ", _CX, jit.Imm(_MaxStackBytes)) // CMPQ CX, ${_MaxStackBytes} - self.Sjmp("JAE" , _LB_stack_error) // JA _stack_error - self.WriteRecNotAX(0 , _VP, jit.Sib(_ST, _CX, 1, 8), false, false) // MOVQ VP, 8(ST)(CX) - self.Emit("ADDQ", jit.Imm(8), _CX) // ADDQ $8, CX - self.Emit("MOVQ", _CX, jit.Ptr(_ST, 0)) // MOVQ CX, (ST) -} - -func (self *_Assembler) _asm_OP_drop(_ *_Instr) { - self.Emit("MOVQ", jit.Ptr(_ST, 0), _AX) // MOVQ (ST), AX - self.Emit("SUBQ", jit.Imm(8), _AX) // SUBQ $8, AX - self.Emit("MOVQ", jit.Sib(_ST, _AX, 1, 8), _VP) // MOVQ 8(ST)(AX), VP - self.Emit("MOVQ", _AX, jit.Ptr(_ST, 0)) // MOVQ AX, (ST) - self.Emit("XORL", _BX, _BX) // XORL BX, BX - self.Emit("MOVQ", _BX, jit.Sib(_ST, _AX, 1, 8)) // MOVQ BX, 8(ST)(AX) -} - -func (self *_Assembler) _asm_OP_drop_2(_ *_Instr) { - self.Emit("MOVQ" , jit.Ptr(_ST, 0), _AX) // MOVQ (ST), AX - self.Emit("SUBQ" , jit.Imm(16), _AX) // SUBQ $16, AX - self.Emit("MOVQ" , jit.Sib(_ST, _AX, 1, 8), _VP) // MOVQ 8(ST)(AX), VP - self.Emit("MOVQ" , _AX, jit.Ptr(_ST, 0)) // MOVQ AX, (ST) - self.Emit("PXOR" , _X0, _X0) // PXOR X0, X0 - self.Emit("MOVOU", _X0, jit.Sib(_ST, _AX, 1, 8)) // MOVOU X0, 8(ST)(AX) -} - -func (self *_Assembler) _asm_OP_recurse(p *_Instr) { - self.Emit("MOVQ", jit.Type(p.vt()), _AX) // MOVQ ${p.vt()}, AX - self.decode_dynamic(_AX, _VP) // DECODE AX, VP -} - -func (self *_Assembler) _asm_OP_goto(p *_Instr) { - self.Xjmp("JMP", p.vi()) -} - -func (self *_Assembler) _asm_OP_switch(p *_Instr) { - self.Emit("MOVQ", _VAR_sr, _AX) // MOVQ sr, AX - self.Emit("CMPQ", _AX, jit.Imm(p.i64())) // CMPQ AX, ${len(p.vs())} - self.Sjmp("JAE" , "_default_{n}") // JAE _default_{n} - - /* jump table selector */ - self.Byte(0x48, 0x8d, 0x3d) // LEAQ ?(PC), DI - self.Sref("_switch_table_{n}", 4) // .... &_switch_table_{n} - self.Emit("MOVLQSX", jit.Sib(_DI, _AX, 4, 0), _AX) // MOVLQSX (DI)(AX*4), AX - self.Emit("ADDQ" , _DI, _AX) // ADDQ DI, AX - self.Rjmp("JMP" , _AX) // JMP AX - self.Link("_switch_table_{n}") // _switch_table_{n}: - - /* generate the jump table */ - for i, v := range p.vs() { - self.Xref(v, int64(-i) * 4) - } - - /* default case */ - self.Link("_default_{n}") - self.NOP() -} - -func (self *_Assembler) print_gc(i int, p1 *_Instr, p2 *_Instr) { - self.Emit("MOVQ", jit.Imm(int64(p2.op())), _CX)// MOVQ $(p2.op()), 16(SP) - self.Emit("MOVQ", jit.Imm(int64(p1.op())), _BX) // MOVQ $(p1.op()), 8(SP) - self.Emit("MOVQ", jit.Imm(int64(i)), _AX) // MOVQ $(i), (SP) - self.call_go(_F_println) -} diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/compiler.go b/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/compiler.go deleted file mode 100644 index 33191262a..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/compiler.go +++ /dev/null @@ -1,1213 +0,0 @@ -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package jitdec - -import ( - `encoding/json` - `fmt` - `reflect` - `sort` - `strconv` - `strings` - `unsafe` - - `github.com/bytedance/sonic/internal/caching` - `github.com/bytedance/sonic/internal/resolver` - `github.com/bytedance/sonic/internal/rt` - `github.com/bytedance/sonic/option` -) - -type _Op uint8 - -const ( - _OP_any _Op = iota + 1 - _OP_dyn - _OP_str - _OP_bin - _OP_bool - _OP_num - _OP_i8 - _OP_i16 - _OP_i32 - _OP_i64 - _OP_u8 - _OP_u16 - _OP_u32 - _OP_u64 - _OP_f32 - _OP_f64 - _OP_unquote - _OP_nil_1 - _OP_nil_2 - _OP_nil_3 - _OP_deref - _OP_index - _OP_is_null - _OP_is_null_quote - _OP_map_init - _OP_map_key_i8 - _OP_map_key_i16 - _OP_map_key_i32 - _OP_map_key_i64 - _OP_map_key_u8 - _OP_map_key_u16 - _OP_map_key_u32 - _OP_map_key_u64 - _OP_map_key_f32 - _OP_map_key_f64 - _OP_map_key_str - _OP_map_key_utext - _OP_map_key_utext_p - _OP_array_skip - _OP_array_clear - _OP_array_clear_p - _OP_slice_init - _OP_slice_append - _OP_object_next - _OP_struct_field - _OP_unmarshal - _OP_unmarshal_p - _OP_unmarshal_text - _OP_unmarshal_text_p - _OP_lspace - _OP_match_char - _OP_check_char - _OP_load - _OP_save - _OP_drop - _OP_drop_2 - _OP_recurse - _OP_goto - _OP_switch - _OP_check_char_0 - _OP_dismatch_err - _OP_go_skip - _OP_skip_emtpy - _OP_add - _OP_check_empty - _OP_debug -) - -const ( - _INT_SIZE = 32 << (^uint(0) >> 63) - _PTR_SIZE = 32 << (^uintptr(0) >> 63) - _PTR_BYTE = unsafe.Sizeof(uintptr(0)) -) - -const ( - _MAX_ILBUF = 100000 // cutoff at 100k of IL instructions - _MAX_FIELDS = 50 // cutoff at 50 fields struct -) - -var _OpNames = [256]string { - _OP_any : "any", - _OP_dyn : "dyn", - _OP_str : "str", - _OP_bin : "bin", - _OP_bool : "bool", - _OP_num : "num", - _OP_i8 : "i8", - _OP_i16 : "i16", - _OP_i32 : "i32", - _OP_i64 : "i64", - _OP_u8 : "u8", - _OP_u16 : "u16", - _OP_u32 : "u32", - _OP_u64 : "u64", - _OP_f32 : "f32", - _OP_f64 : "f64", - _OP_unquote : "unquote", - _OP_nil_1 : "nil_1", - _OP_nil_2 : "nil_2", - _OP_nil_3 : "nil_3", - _OP_deref : "deref", - _OP_index : "index", - _OP_is_null : "is_null", - _OP_is_null_quote : "is_null_quote", - _OP_map_init : "map_init", - _OP_map_key_i8 : "map_key_i8", - _OP_map_key_i16 : "map_key_i16", - _OP_map_key_i32 : "map_key_i32", - _OP_map_key_i64 : "map_key_i64", - _OP_map_key_u8 : "map_key_u8", - _OP_map_key_u16 : "map_key_u16", - _OP_map_key_u32 : "map_key_u32", - _OP_map_key_u64 : "map_key_u64", - _OP_map_key_f32 : "map_key_f32", - _OP_map_key_f64 : "map_key_f64", - _OP_map_key_str : "map_key_str", - _OP_map_key_utext : "map_key_utext", - _OP_map_key_utext_p : "map_key_utext_p", - _OP_array_skip : "array_skip", - _OP_slice_init : "slice_init", - _OP_slice_append : "slice_append", - _OP_object_next : "object_next", - _OP_struct_field : "struct_field", - _OP_unmarshal : "unmarshal", - _OP_unmarshal_p : "unmarshal_p", - _OP_unmarshal_text : "unmarshal_text", - _OP_unmarshal_text_p : "unmarshal_text_p", - _OP_lspace : "lspace", - _OP_match_char : "match_char", - _OP_check_char : "check_char", - _OP_load : "load", - _OP_save : "save", - _OP_drop : "drop", - _OP_drop_2 : "drop_2", - _OP_recurse : "recurse", - _OP_goto : "goto", - _OP_switch : "switch", - _OP_check_char_0 : "check_char_0", - _OP_dismatch_err : "dismatch_err", - _OP_add : "add", - _OP_go_skip : "go_skip", - _OP_check_empty : "check_empty", - _OP_debug : "debug", -} - -func (self _Op) String() string { - if ret := _OpNames[self]; ret != "" { - return ret - } else { - return "" - } -} - -func _OP_int() _Op { - switch _INT_SIZE { - case 32: return _OP_i32 - case 64: return _OP_i64 - default: panic("unsupported int size") - } -} - -func _OP_uint() _Op { - switch _INT_SIZE { - case 32: return _OP_u32 - case 64: return _OP_u64 - default: panic("unsupported uint size") - } -} - -func _OP_uintptr() _Op { - switch _PTR_SIZE { - case 32: return _OP_u32 - case 64: return _OP_u64 - default: panic("unsupported pointer size") - } -} - -func _OP_map_key_int() _Op { - switch _INT_SIZE { - case 32: return _OP_map_key_i32 - case 64: return _OP_map_key_i64 - default: panic("unsupported int size") - } -} - -func _OP_map_key_uint() _Op { - switch _INT_SIZE { - case 32: return _OP_map_key_u32 - case 64: return _OP_map_key_u64 - default: panic("unsupported uint size") - } -} - -func _OP_map_key_uintptr() _Op { - switch _PTR_SIZE { - case 32: return _OP_map_key_u32 - case 64: return _OP_map_key_u64 - default: panic("unsupported pointer size") - } -} - -type _Instr struct { - u uint64 // union {op: 8, vb: 8, vi: 48}, iv maybe int or len([]int) - p unsafe.Pointer // maybe GoSlice.Data, *GoType or *caching.FieldMap -} - -func packOp(op _Op) uint64 { - return uint64(op) << 56 -} - -func newInsOp(op _Op) _Instr { - return _Instr{u: packOp(op)} -} - -func newInsVi(op _Op, vi int) _Instr { - return _Instr{u: packOp(op) | rt.PackInt(vi)} -} - -func newInsVb(op _Op, vb byte) _Instr { - return _Instr{u: packOp(op) | (uint64(vb) << 48)} -} - -func newInsVs(op _Op, vs []int) _Instr { - return _Instr { - u: packOp(op) | rt.PackInt(len(vs)), - p: (*rt.GoSlice)(unsafe.Pointer(&vs)).Ptr, - } -} - -func newInsVt(op _Op, vt reflect.Type) _Instr { - return _Instr { - u: packOp(op), - p: unsafe.Pointer(rt.UnpackType(vt)), - } -} - -func newInsVtI(op _Op, vt reflect.Type, iv int) _Instr { - return _Instr { - u: packOp(op) | rt.PackInt(iv), - p: unsafe.Pointer(rt.UnpackType(vt)), - } -} - -func newInsVf(op _Op, vf *caching.FieldMap) _Instr { - return _Instr { - u: packOp(op), - p: unsafe.Pointer(vf), - } -} - -func (self _Instr) op() _Op { - return _Op(self.u >> 56) -} - -func (self _Instr) vi() int { - return rt.UnpackInt(self.u) -} - -func (self _Instr) vb() byte { - return byte(self.u >> 48) -} - -func (self _Instr) vs() (v []int) { - (*rt.GoSlice)(unsafe.Pointer(&v)).Ptr = self.p - (*rt.GoSlice)(unsafe.Pointer(&v)).Cap = self.vi() - (*rt.GoSlice)(unsafe.Pointer(&v)).Len = self.vi() - return -} - -func (self _Instr) vf() *caching.FieldMap { - return (*caching.FieldMap)(self.p) -} - -func (self _Instr) vk() reflect.Kind { - return (*rt.GoType)(self.p).Kind() -} - -func (self _Instr) vt() reflect.Type { - return (*rt.GoType)(self.p).Pack() -} - -func (self _Instr) i64() int64 { - return int64(self.vi()) -} - -func (self _Instr) vlen() int { - return int((*rt.GoType)(self.p).Size) -} - -func (self _Instr) isBranch() bool { - switch self.op() { - case _OP_goto : fallthrough - case _OP_switch : fallthrough - case _OP_is_null : fallthrough - case _OP_is_null_quote : fallthrough - case _OP_check_char : return true - default : return false - } -} - -func (self _Instr) disassemble() string { - switch self.op() { - case _OP_dyn : fallthrough - case _OP_deref : fallthrough - case _OP_map_key_i8 : fallthrough - case _OP_map_key_i16 : fallthrough - case _OP_map_key_i32 : fallthrough - case _OP_map_key_i64 : fallthrough - case _OP_map_key_u8 : fallthrough - case _OP_map_key_u16 : fallthrough - case _OP_map_key_u32 : fallthrough - case _OP_map_key_u64 : fallthrough - case _OP_map_key_f32 : fallthrough - case _OP_map_key_f64 : fallthrough - case _OP_map_key_str : fallthrough - case _OP_map_key_utext : fallthrough - case _OP_map_key_utext_p : fallthrough - case _OP_slice_init : fallthrough - case _OP_slice_append : fallthrough - case _OP_unmarshal : fallthrough - case _OP_unmarshal_p : fallthrough - case _OP_unmarshal_text : fallthrough - case _OP_unmarshal_text_p : fallthrough - case _OP_recurse : return fmt.Sprintf("%-18s%s", self.op(), self.vt()) - case _OP_goto : fallthrough - case _OP_is_null_quote : fallthrough - case _OP_is_null : return fmt.Sprintf("%-18sL_%d", self.op(), self.vi()) - case _OP_index : fallthrough - case _OP_array_clear : fallthrough - case _OP_array_clear_p : return fmt.Sprintf("%-18s%d", self.op(), self.vi()) - case _OP_switch : return fmt.Sprintf("%-18s%s", self.op(), self.formatSwitchLabels()) - case _OP_struct_field : return fmt.Sprintf("%-18s%s", self.op(), self.formatStructFields()) - case _OP_match_char : return fmt.Sprintf("%-18s%s", self.op(), strconv.QuoteRune(rune(self.vb()))) - case _OP_check_char : return fmt.Sprintf("%-18sL_%d, %s", self.op(), self.vi(), strconv.QuoteRune(rune(self.vb()))) - default : return self.op().String() - } -} - -func (self _Instr) formatSwitchLabels() string { - var i int - var v int - var m []string - - /* format each label */ - for i, v = range self.vs() { - m = append(m, fmt.Sprintf("%d=L_%d", i, v)) - } - - /* join them with "," */ - return strings.Join(m, ", ") -} - -func (self _Instr) formatStructFields() string { - var i uint64 - var r []string - var m []struct{i int; n string} - - /* extract all the fields */ - for i = 0; i < self.vf().N; i++ { - if v := self.vf().At(i); v.Hash != 0 { - m = append(m, struct{i int; n string}{i: v.ID, n: v.Name}) - } - } - - /* sort by field name */ - sort.Slice(m, func(i, j int) bool { - return m[i].n < m[j].n - }) - - /* format each field */ - for _, v := range m { - r = append(r, fmt.Sprintf("%s=%d", v.n, v.i)) - } - - /* join them with "," */ - return strings.Join(r, ", ") -} - -type ( - _Program []_Instr -) - -func (self _Program) pc() int { - return len(self) -} - -func (self _Program) tag(n int) { - if n >= _MaxStack { - panic("type nesting too deep") - } -} - -func (self _Program) pin(i int) { - v := &self[i] - v.u &= 0xffff000000000000 - v.u |= rt.PackInt(self.pc()) -} - -func (self _Program) rel(v []int) { - for _, i := range v { - self.pin(i) - } -} - -func (self *_Program) add(op _Op) { - *self = append(*self, newInsOp(op)) -} - -func (self *_Program) int(op _Op, vi int) { - *self = append(*self, newInsVi(op, vi)) -} - -func (self *_Program) chr(op _Op, vb byte) { - *self = append(*self, newInsVb(op, vb)) -} - -func (self *_Program) tab(op _Op, vs []int) { - *self = append(*self, newInsVs(op, vs)) -} - -func (self *_Program) rtt(op _Op, vt reflect.Type) { - *self = append(*self, newInsVt(op, vt)) -} - -func (self *_Program) rtti(op _Op, vt reflect.Type, iv int) { - *self = append(*self, newInsVtI(op, vt, iv)) -} - -func (self *_Program) fmv(op _Op, vf *caching.FieldMap) { - *self = append(*self, newInsVf(op, vf)) -} - -func (self _Program) disassemble() string { - nb := len(self) - tab := make([]bool, nb + 1) - ret := make([]string, 0, nb + 1) - - /* prescan to get all the labels */ - for _, ins := range self { - if ins.isBranch() { - if ins.op() != _OP_switch { - tab[ins.vi()] = true - } else { - for _, v := range ins.vs() { - tab[v] = true - } - } - } - } - - /* disassemble each instruction */ - for i, ins := range self { - if !tab[i] { - ret = append(ret, "\t" + ins.disassemble()) - } else { - ret = append(ret, fmt.Sprintf("L_%d:\n\t%s", i, ins.disassemble())) - } - } - - /* add the last label, if needed */ - if tab[nb] { - ret = append(ret, fmt.Sprintf("L_%d:", nb)) - } - - /* add an "end" indicator, and join all the strings */ - return strings.Join(append(ret, "\tend"), "\n") -} - -type _Compiler struct { - opts option.CompileOptions - tab map[reflect.Type]bool - rec map[reflect.Type]bool -} - -func newCompiler() *_Compiler { - return &_Compiler { - opts: option.DefaultCompileOptions(), - tab: map[reflect.Type]bool{}, - rec: map[reflect.Type]bool{}, - } -} - -func (self *_Compiler) apply(opts option.CompileOptions) *_Compiler { - self.opts = opts - return self -} - -func (self *_Compiler) rescue(ep *error) { - if val := recover(); val != nil { - if err, ok := val.(error); ok { - *ep = err - } else { - panic(val) - } - } -} - -func (self *_Compiler) compile(vt reflect.Type) (ret _Program, err error) { - defer self.rescue(&err) - self.compileOne(&ret, 0, vt) - return -} - -const ( - checkMarshalerFlags_quoted = 1 -) - -func (self *_Compiler) checkMarshaler(p *_Program, vt reflect.Type, flags int, exec bool) bool { - pt := reflect.PtrTo(vt) - - /* check for `json.Unmarshaler` with pointer receiver */ - if pt.Implements(jsonUnmarshalerType) { - if exec { - p.add(_OP_lspace) - p.rtti(_OP_unmarshal_p, pt, flags) - } - return true - } - - /* check for `json.Unmarshaler` */ - if vt.Implements(jsonUnmarshalerType) { - if exec { - p.add(_OP_lspace) - self.compileUnmarshalJson(p, vt, flags) - } - return true - } - - if flags == checkMarshalerFlags_quoted { - // text marshaler shouldn't be supported for quoted string - return false - } - - /* check for `encoding.TextMarshaler` with pointer receiver */ - if pt.Implements(encodingTextUnmarshalerType) { - if exec { - p.add(_OP_lspace) - self.compileUnmarshalTextPtr(p, pt, flags) - } - return true - } - - /* check for `encoding.TextUnmarshaler` */ - if vt.Implements(encodingTextUnmarshalerType) { - if exec { - p.add(_OP_lspace) - self.compileUnmarshalText(p, vt, flags) - } - return true - } - - return false -} - -func (self *_Compiler) compileOne(p *_Program, sp int, vt reflect.Type) { - /* check for recursive nesting */ - ok := self.tab[vt] - if ok { - p.rtt(_OP_recurse, vt) - return - } - - if self.checkMarshaler(p, vt, 0, true) { - return - } - - /* enter the recursion */ - p.add(_OP_lspace) - self.tab[vt] = true - self.compileOps(p, sp, vt) - delete(self.tab, vt) -} - -func (self *_Compiler) compileOps(p *_Program, sp int, vt reflect.Type) { - switch vt.Kind() { - case reflect.Bool : self.compilePrimitive (vt, p, _OP_bool) - case reflect.Int : self.compilePrimitive (vt, p, _OP_int()) - case reflect.Int8 : self.compilePrimitive (vt, p, _OP_i8) - case reflect.Int16 : self.compilePrimitive (vt, p, _OP_i16) - case reflect.Int32 : self.compilePrimitive (vt, p, _OP_i32) - case reflect.Int64 : self.compilePrimitive (vt, p, _OP_i64) - case reflect.Uint : self.compilePrimitive (vt, p, _OP_uint()) - case reflect.Uint8 : self.compilePrimitive (vt, p, _OP_u8) - case reflect.Uint16 : self.compilePrimitive (vt, p, _OP_u16) - case reflect.Uint32 : self.compilePrimitive (vt, p, _OP_u32) - case reflect.Uint64 : self.compilePrimitive (vt, p, _OP_u64) - case reflect.Uintptr : self.compilePrimitive (vt, p, _OP_uintptr()) - case reflect.Float32 : self.compilePrimitive (vt, p, _OP_f32) - case reflect.Float64 : self.compilePrimitive (vt, p, _OP_f64) - case reflect.String : self.compileString (p, vt) - case reflect.Array : self.compileArray (p, sp, vt) - case reflect.Interface : self.compileInterface (p, vt) - case reflect.Map : self.compileMap (p, sp, vt) - case reflect.Ptr : self.compilePtr (p, sp, vt) - case reflect.Slice : self.compileSlice (p, sp, vt) - case reflect.Struct : self.compileStruct (p, sp, vt) - default : panic (&json.UnmarshalTypeError{Type: vt}) - } -} - -func (self *_Compiler) compileMap(p *_Program, sp int, vt reflect.Type) { - if reflect.PtrTo(vt.Key()).Implements(encodingTextUnmarshalerType) { - self.compileMapOp(p, sp, vt, _OP_map_key_utext_p) - } else if vt.Key().Implements(encodingTextUnmarshalerType) { - self.compileMapOp(p, sp, vt, _OP_map_key_utext) - } else { - self.compileMapUt(p, sp, vt) - } -} - -func (self *_Compiler) compileMapUt(p *_Program, sp int, vt reflect.Type) { - switch vt.Key().Kind() { - case reflect.Int : self.compileMapOp(p, sp, vt, _OP_map_key_int()) - case reflect.Int8 : self.compileMapOp(p, sp, vt, _OP_map_key_i8) - case reflect.Int16 : self.compileMapOp(p, sp, vt, _OP_map_key_i16) - case reflect.Int32 : self.compileMapOp(p, sp, vt, _OP_map_key_i32) - case reflect.Int64 : self.compileMapOp(p, sp, vt, _OP_map_key_i64) - case reflect.Uint : self.compileMapOp(p, sp, vt, _OP_map_key_uint()) - case reflect.Uint8 : self.compileMapOp(p, sp, vt, _OP_map_key_u8) - case reflect.Uint16 : self.compileMapOp(p, sp, vt, _OP_map_key_u16) - case reflect.Uint32 : self.compileMapOp(p, sp, vt, _OP_map_key_u32) - case reflect.Uint64 : self.compileMapOp(p, sp, vt, _OP_map_key_u64) - case reflect.Uintptr : self.compileMapOp(p, sp, vt, _OP_map_key_uintptr()) - case reflect.Float32 : self.compileMapOp(p, sp, vt, _OP_map_key_f32) - case reflect.Float64 : self.compileMapOp(p, sp, vt, _OP_map_key_f64) - case reflect.String : self.compileMapOp(p, sp, vt, _OP_map_key_str) - default : panic(&json.UnmarshalTypeError{Type: vt}) - } -} - -func (self *_Compiler) compileMapOp(p *_Program, sp int, vt reflect.Type, op _Op) { - i := p.pc() - p.add(_OP_is_null) - p.tag(sp + 1) - skip := self.checkIfSkip(p, vt, '{') - p.add(_OP_save) - p.add(_OP_map_init) - p.add(_OP_save) - p.add(_OP_lspace) - j := p.pc() - p.chr(_OP_check_char, '}') - p.chr(_OP_match_char, '"') - skip2 := p.pc() - p.rtt(op, vt) - - /* match the value separator */ - p.add(_OP_lspace) - p.chr(_OP_match_char, ':') - self.compileOne(p, sp + 2, vt.Elem()) - p.pin(skip2) - p.add(_OP_load) - k0 := p.pc() - p.add(_OP_lspace) - k1 := p.pc() - p.chr(_OP_check_char, '}') - p.chr(_OP_match_char, ',') - p.add(_OP_lspace) - p.chr(_OP_match_char, '"') - skip3 := p.pc() - p.rtt(op, vt) - - /* match the value separator */ - p.add(_OP_lspace) - p.chr(_OP_match_char, ':') - self.compileOne(p, sp + 2, vt.Elem()) - p.pin(skip3) - p.add(_OP_load) - p.int(_OP_goto, k0) - p.pin(j) - p.pin(k1) - p.add(_OP_drop_2) - x := p.pc() - p.add(_OP_goto) - p.pin(i) - p.add(_OP_nil_1) - p.pin(skip) - p.pin(x) -} - -func (self *_Compiler) compilePtr(p *_Program, sp int, et reflect.Type) { - i := p.pc() - p.add(_OP_is_null) - - /* dereference all the way down */ - for et.Kind() == reflect.Ptr { - if self.checkMarshaler(p, et, 0, true) { - return - } - et = et.Elem() - p.rtt(_OP_deref, et) - } - - /* check for recursive nesting */ - ok := self.tab[et] - if ok { - p.rtt(_OP_recurse, et) - } else { - /* enter the recursion */ - p.add(_OP_lspace) - self.tab[et] = true - - /* not inline the pointer type - * recursing the defined pointer type's elem will cause issue379. - */ - self.compileOps(p, sp, et) - } - delete(self.tab, et) - - j := p.pc() - p.add(_OP_goto) - - // set val pointer as nil - p.pin(i) - p.add(_OP_nil_1) - - // nothing todo - p.pin(j) -} - -func (self *_Compiler) compileArray(p *_Program, sp int, vt reflect.Type) { - x := p.pc() - p.add(_OP_is_null) - p.tag(sp) - skip := self.checkIfSkip(p, vt, '[') - - p.add(_OP_save) - p.add(_OP_lspace) - v := []int{p.pc()} - p.chr(_OP_check_char, ']') - - /* decode every item */ - for i := 1; i <= vt.Len(); i++ { - self.compileOne(p, sp + 1, vt.Elem()) - p.add(_OP_load) - p.int(_OP_index, i * int(vt.Elem().Size())) - p.add(_OP_lspace) - v = append(v, p.pc()) - p.chr(_OP_check_char, ']') - p.chr(_OP_match_char, ',') - } - - /* drop rest of the array */ - p.add(_OP_array_skip) - w := p.pc() - p.add(_OP_goto) - p.rel(v) - - /* check for pointer data */ - if rt.UnpackType(vt.Elem()).PtrData == 0 { - p.int(_OP_array_clear, int(vt.Size())) - } else { - p.int(_OP_array_clear_p, int(vt.Size())) - } - - /* restore the stack */ - p.pin(w) - p.add(_OP_drop) - - p.pin(skip) - p.pin(x) -} - -func (self *_Compiler) compileSlice(p *_Program, sp int, vt reflect.Type) { - if vt.Elem().Kind() == byteType.Kind() { - self.compileSliceBin(p, sp, vt) - } else { - self.compileSliceList(p, sp, vt) - } -} - -func (self *_Compiler) compileSliceBin(p *_Program, sp int, vt reflect.Type) { - i := p.pc() - p.add(_OP_is_null) - j := p.pc() - p.chr(_OP_check_char, '[') - skip := self.checkIfSkip(p, vt, '"') - k := p.pc() - p.chr(_OP_check_char, '"') - p.add(_OP_bin) - x := p.pc() - p.add(_OP_goto) - p.pin(j) - self.compileSliceBody(p, sp, vt.Elem()) - y := p.pc() - p.add(_OP_goto) - p.pin(i) - p.pin(k) - p.add(_OP_nil_3) - p.pin(x) - p.pin(skip) - p.pin(y) -} - -func (self *_Compiler) compileSliceList(p *_Program, sp int, vt reflect.Type) { - i := p.pc() - p.add(_OP_is_null) - p.tag(sp) - skip := self.checkIfSkip(p, vt, '[') - self.compileSliceBody(p, sp, vt.Elem()) - x := p.pc() - p.add(_OP_goto) - p.pin(i) - p.add(_OP_nil_3) - p.pin(x) - p.pin(skip) -} - -func (self *_Compiler) compileSliceBody(p *_Program, sp int, et reflect.Type) { - p.add(_OP_lspace) - j := p.pc() - p.chr(_OP_check_empty, ']') - p.rtt(_OP_slice_init, et) - p.add(_OP_save) - p.rtt(_OP_slice_append, et) - self.compileOne(p, sp + 1, et) - p.add(_OP_load) - k0 := p.pc() - p.add(_OP_lspace) - k1 := p.pc() - p.chr(_OP_check_char, ']') - p.chr(_OP_match_char, ',') - p.rtt(_OP_slice_append, et) - self.compileOne(p, sp + 1, et) - p.add(_OP_load) - p.int(_OP_goto, k0) - p.pin(k1) - p.add(_OP_drop) - p.pin(j) -} - -func (self *_Compiler) compileString(p *_Program, vt reflect.Type) { - if vt == jsonNumberType { - self.compilePrimitive(vt, p, _OP_num) - } else { - self.compileStringBody(vt, p) - } -} - -func (self *_Compiler) compileStringBody(vt reflect.Type, p *_Program) { - i := p.pc() - p.add(_OP_is_null) - skip := self.checkIfSkip(p, vt, '"') - p.add(_OP_str) - p.pin(i) - p.pin(skip) -} - -func (self *_Compiler) compileStruct(p *_Program, sp int, vt reflect.Type) { - if sp >= self.opts.MaxInlineDepth || p.pc() >= _MAX_ILBUF || (sp > 0 && vt.NumField() >= _MAX_FIELDS) { - p.rtt(_OP_recurse, vt) - if self.opts.RecursiveDepth > 0 { - self.rec[vt] = true - } - } else { - self.compileStructBody(p, sp, vt) - } -} - -func (self *_Compiler) compileStructBody(p *_Program, sp int, vt reflect.Type) { - fv := resolver.ResolveStruct(vt) - fm, sw := caching.CreateFieldMap(len(fv)), make([]int, len(fv)) - - /* start of object */ - p.tag(sp) - n := p.pc() - p.add(_OP_is_null) - - j := p.pc() - p.chr(_OP_check_char_0, '{') - p.rtt(_OP_dismatch_err, vt) - - /* special case for empty object */ - if len(fv) == 0 { - p.pin(j) - s := p.pc() - p.add(_OP_skip_emtpy) - p.pin(s) - p.pin(n) - return - } - - skip := p.pc() - p.add(_OP_go_skip) - p.pin(j) - p.int(_OP_add, 1) - - p.add(_OP_save) - p.add(_OP_lspace) - x := p.pc() - p.chr(_OP_check_char, '}') - p.chr(_OP_match_char, '"') - p.fmv(_OP_struct_field, fm) - p.add(_OP_lspace) - p.chr(_OP_match_char, ':') - p.tab(_OP_switch, sw) - p.add(_OP_object_next) - y0 := p.pc() - p.add(_OP_lspace) - y1 := p.pc() - p.chr(_OP_check_char, '}') - p.chr(_OP_match_char, ',') - - - /* match the remaining fields */ - p.add(_OP_lspace) - p.chr(_OP_match_char, '"') - p.fmv(_OP_struct_field, fm) - p.add(_OP_lspace) - p.chr(_OP_match_char, ':') - p.tab(_OP_switch, sw) - p.add(_OP_object_next) - p.int(_OP_goto, y0) - - /* process each field */ - for i, f := range fv { - sw[i] = p.pc() - fm.Set(f.Name, i) - - /* index to the field */ - for _, o := range f.Path { - if p.int(_OP_index, int(o.Size)); o.Kind == resolver.F_deref { - p.rtt(_OP_deref, o.Type) - } - } - - /* check for "stringnize" option */ - if (f.Opts & resolver.F_stringize) == 0 { - self.compileOne(p, sp + 1, f.Type) - } else { - self.compileStructFieldStr(p, sp + 1, f.Type) - } - - /* load the state, and try next field */ - p.add(_OP_load) - p.int(_OP_goto, y0) - } - - p.pin(x) - p.pin(y1) - p.add(_OP_drop) - p.pin(n) - p.pin(skip) -} - -func (self *_Compiler) compileStructFieldStrUnmarshal(p *_Program, vt reflect.Type) { - p.add(_OP_lspace) - n0 := p.pc() - p.add(_OP_is_null) - self.checkMarshaler(p, vt, checkMarshalerFlags_quoted, true) - p.pin(n0) -} - -func (self *_Compiler) compileStructFieldStr(p *_Program, sp int, vt reflect.Type) { - // according to std, json.Unmarshaler should be called before stringize - // see https://github.com/bytedance/sonic/issues/670 - if self.checkMarshaler(p, vt, checkMarshalerFlags_quoted, false) { - self.compileStructFieldStrUnmarshal(p, vt) - return - } - - n1 := -1 - ft := vt - sv := false - - /* dereference the pointer if needed */ - if ft.Kind() == reflect.Ptr { - ft = ft.Elem() - } - - /* check if it can be stringized */ - switch ft.Kind() { - case reflect.Bool : sv = true - case reflect.Int : sv = true - case reflect.Int8 : sv = true - case reflect.Int16 : sv = true - case reflect.Int32 : sv = true - case reflect.Int64 : sv = true - case reflect.Uint : sv = true - case reflect.Uint8 : sv = true - case reflect.Uint16 : sv = true - case reflect.Uint32 : sv = true - case reflect.Uint64 : sv = true - case reflect.Uintptr : sv = true - case reflect.Float32 : sv = true - case reflect.Float64 : sv = true - case reflect.String : sv = true - } - - /* if it's not, ignore the "string" and follow the regular path */ - if !sv { - self.compileOne(p, sp, vt) - return - } - - /* remove the leading space, and match the leading quote */ - vk := vt.Kind() - p.add(_OP_lspace) - n0 := p.pc() - p.add(_OP_is_null) - - skip := self.checkIfSkip(p, stringType, '"') - - /* also check for inner "null" */ - n1 = p.pc() - p.add(_OP_is_null_quote) - - /* dereference the pointer only when it is not null */ - if vk == reflect.Ptr { - vt = vt.Elem() - p.rtt(_OP_deref, vt) - } - - n2 := p.pc() - p.chr(_OP_check_char_0, '"') - - /* string opcode selector */ - _OP_string := func() _Op { - if ft == jsonNumberType { - return _OP_num - } else { - return _OP_unquote - } - } - - /* compile for each type */ - switch vt.Kind() { - case reflect.Bool : p.add(_OP_bool) - case reflect.Int : p.add(_OP_int()) - case reflect.Int8 : p.add(_OP_i8) - case reflect.Int16 : p.add(_OP_i16) - case reflect.Int32 : p.add(_OP_i32) - case reflect.Int64 : p.add(_OP_i64) - case reflect.Uint : p.add(_OP_uint()) - case reflect.Uint8 : p.add(_OP_u8) - case reflect.Uint16 : p.add(_OP_u16) - case reflect.Uint32 : p.add(_OP_u32) - case reflect.Uint64 : p.add(_OP_u64) - case reflect.Uintptr : p.add(_OP_uintptr()) - case reflect.Float32 : p.add(_OP_f32) - case reflect.Float64 : p.add(_OP_f64) - case reflect.String : p.add(_OP_string()) - default : panic("not reachable") - } - - /* the closing quote is not needed when parsing a pure string */ - if vt == jsonNumberType || vt.Kind() != reflect.String { - p.chr(_OP_match_char, '"') - } - - /* pin the `is_null_quote` jump location */ - if n1 != -1 && vk != reflect.Ptr { - p.pin(n1) - } - - /* "null" but not a pointer, act as if the field is not present */ - if vk != reflect.Ptr { - pc2 := p.pc() - p.add(_OP_goto) - p.pin(n2) - p.rtt(_OP_dismatch_err, vt) - p.int(_OP_add, 1) - p.pin(pc2) - p.pin(n0) - return - } - - /* the "null" case of the pointer */ - pc := p.pc() - p.add(_OP_goto) - p.pin(n0) // `is_null` jump location - p.pin(n1) // `is_null_quote` jump location - p.add(_OP_nil_1) - pc2 := p.pc() - p.add(_OP_goto) - p.pin(n2) - p.rtt(_OP_dismatch_err, vt) - p.int(_OP_add, 1) - p.pin(pc) - p.pin(pc2) - p.pin(skip) -} - -func (self *_Compiler) compileInterface(p *_Program, vt reflect.Type) { - i := p.pc() - p.add(_OP_is_null) - - /* check for empty interface */ - if vt.NumMethod() == 0 { - p.add(_OP_any) - } else { - p.rtt(_OP_dyn, vt) - } - - /* finish the OpCode */ - j := p.pc() - p.add(_OP_goto) - p.pin(i) - p.add(_OP_nil_2) - p.pin(j) -} - -func (self *_Compiler) compilePrimitive(vt reflect.Type, p *_Program, op _Op) { - i := p.pc() - p.add(_OP_is_null) - // skip := self.checkPrimitive(p, vt) - p.add(op) - p.pin(i) - // p.pin(skip) -} - -func (self *_Compiler) compileUnmarshalEnd(p *_Program, vt reflect.Type, i int) { - j := p.pc() - k := vt.Kind() - - /* not a pointer */ - if k != reflect.Ptr { - p.pin(i) - return - } - - /* it seems that in Go JSON library, "null" takes priority over any kind of unmarshaler */ - p.add(_OP_goto) - p.pin(i) - p.add(_OP_nil_1) - p.pin(j) -} - -func (self *_Compiler) compileUnmarshalJson(p *_Program, vt reflect.Type, flags int) { - i := p.pc() - v := _OP_unmarshal - p.add(_OP_is_null) - - /* check for dynamic interface */ - if vt.Kind() == reflect.Interface { - v = _OP_dyn - } - - /* call the unmarshaler */ - p.rtti(v, vt, flags) - self.compileUnmarshalEnd(p, vt, i) -} - -func (self *_Compiler) compileUnmarshalText(p *_Program, vt reflect.Type, iv int) { - i := p.pc() - v := _OP_unmarshal_text - p.add(_OP_is_null) - - /* check for dynamic interface */ - if vt.Kind() == reflect.Interface { - v = _OP_dyn - } else { - p.chr(_OP_match_char, '"') - } - - /* call the unmarshaler */ - p.rtti(v, vt, iv) - self.compileUnmarshalEnd(p, vt, i) -} - -func (self *_Compiler) compileUnmarshalTextPtr(p *_Program, vt reflect.Type, iv int) { - i := p.pc() - p.add(_OP_is_null) - p.chr(_OP_match_char, '"') - p.rtti(_OP_unmarshal_text_p, vt, iv) - p.pin(i) -} - -func (self *_Compiler) checkIfSkip(p *_Program, vt reflect.Type, c byte) int { - j := p.pc() - p.chr(_OP_check_char_0, c) - p.rtt(_OP_dismatch_err, vt) - s := p.pc() - p.add(_OP_go_skip) - p.pin(j) - p.int(_OP_add, 1) - return s -} diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/debug.go b/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/debug.go deleted file mode 100644 index b59a3e571..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/debug.go +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package jitdec - -import ( - `os` - `runtime` - `runtime/debug` - `strings` - - `github.com/bytedance/sonic/internal/jit` -) - - -var ( - debugSyncGC = os.Getenv("SONIC_SYNC_GC") != "" - debugAsyncGC = os.Getenv("SONIC_NO_ASYNC_GC") == "" -) - -var ( - _Instr_End _Instr = newInsOp(_OP_nil_1) - - _F_gc = jit.Func(runtime.GC) - _F_force_gc = jit.Func(debug.FreeOSMemory) - _F_println = jit.Func(println_wrapper) - _F_print = jit.Func(print) -) - -func println_wrapper(i int, op1 int, op2 int){ - println(i, " Intrs ", op1, _OpNames[op1], "next: ", op2, _OpNames[op2]) -} - -func print(i int){ - println(i) -} - -func (self *_Assembler) force_gc() { - self.call_go(_F_gc) - self.call_go(_F_force_gc) -} - -func (self *_Assembler) debug_instr(i int, v *_Instr) { - if debugSyncGC { - if (i+1 == len(self.p)) { - self.print_gc(i, v, &_Instr_End) - } else { - next := &(self.p[i+1]) - self.print_gc(i, v, next) - name := _OpNames[next.op()] - if strings.Contains(name, "save") { - return - } - } - self.force_gc() - } -} diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/decoder.go b/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/decoder.go deleted file mode 100644 index bbb4b4b61..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/decoder.go +++ /dev/null @@ -1,140 +0,0 @@ -package jitdec - -import ( - `unsafe` - `encoding/json` - `reflect` - `runtime` - - `github.com/bytedance/sonic/internal/decoder/consts` - `github.com/bytedance/sonic/internal/decoder/errors` - `github.com/bytedance/sonic/internal/rt` - `github.com/bytedance/sonic/utf8` - `github.com/bytedance/sonic/option` -) - -type ( - MismatchTypeError = errors.MismatchTypeError - SyntaxError = errors.SyntaxError -) - -const ( - _F_allow_control = consts.F_allow_control - _F_copy_string = consts.F_copy_string - _F_disable_unknown = consts.F_disable_unknown - _F_disable_urc = consts.F_disable_urc - _F_use_int64 = consts.F_use_int64 - _F_use_number = consts.F_use_number - _F_no_validate_json = consts.F_no_validate_json - _F_validate_string = consts.F_validate_string -) - -var ( - error_wrap = errors.ErrorWrap - error_type = errors.ErrorType - error_field = errors.ErrorField - error_value = errors.ErrorValue - error_mismatch = errors.ErrorMismatch - stackOverflow = errors.StackOverflow -) - - -// Decode parses the JSON-encoded data from current position and stores the result -// in the value pointed to by val. -func Decode(s *string, i *int, f uint64, val interface{}) error { - /* validate json if needed */ - if (f & (1 << _F_validate_string)) != 0 && !utf8.ValidateString(*s){ - dbuf := utf8.CorrectWith(nil, rt.Str2Mem(*s), "\ufffd") - *s = rt.Mem2Str(dbuf) - } - - vv := rt.UnpackEface(val) - vp := vv.Value - - /* check for nil type */ - if vv.Type == nil { - return &json.InvalidUnmarshalError{} - } - - /* must be a non-nil pointer */ - if vp == nil || vv.Type.Kind() != reflect.Ptr { - return &json.InvalidUnmarshalError{Type: vv.Type.Pack()} - } - - etp := rt.PtrElem(vv.Type) - - /* check the defined pointer type for issue 379 */ - if vv.Type.IsNamed() { - newp := vp - etp = vv.Type - vp = unsafe.Pointer(&newp) - } - - /* create a new stack, and call the decoder */ - sb := newStack() - nb, err := decodeTypedPointer(*s, *i, etp, vp, sb, f) - /* return the stack back */ - *i = nb - freeStack(sb) - - /* avoid GC ahead */ - runtime.KeepAlive(vv) - return err -} - - -// Pretouch compiles vt ahead-of-time to avoid JIT compilation on-the-fly, in -// order to reduce the first-hit latency. -// -// Opts are the compile options, for example, "option.WithCompileRecursiveDepth" is -// a compile option to set the depth of recursive compile for the nested struct type. -func Pretouch(vt reflect.Type, opts ...option.CompileOption) error { - cfg := option.DefaultCompileOptions() - for _, opt := range opts { - opt(&cfg) - } - return pretouchRec(map[reflect.Type]bool{vt:true}, cfg) -} - -func pretouchType(_vt reflect.Type, opts option.CompileOptions) (map[reflect.Type]bool, error) { - /* compile function */ - compiler := newCompiler().apply(opts) - decoder := func(vt *rt.GoType, _ ...interface{}) (interface{}, error) { - if pp, err := compiler.compile(_vt); err != nil { - return nil, err - } else { - as := newAssembler(pp) - as.name = _vt.String() - return as.Load(), nil - } - } - - /* find or compile */ - vt := rt.UnpackType(_vt) - if val := programCache.Get(vt); val != nil { - return nil, nil - } else if _, err := programCache.Compute(vt, decoder); err == nil { - return compiler.rec, nil - } else { - return nil, err - } -} - -func pretouchRec(vtm map[reflect.Type]bool, opts option.CompileOptions) error { - if opts.RecursiveDepth < 0 || len(vtm) == 0 { - return nil - } - next := make(map[reflect.Type]bool) - for vt := range(vtm) { - sub, err := pretouchType(vt, opts) - if err != nil { - return err - } - for svt := range(sub) { - next[svt] = true - } - } - opts.RecursiveDepth -= 1 - return pretouchRec(next, opts) -} - diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/generic_regabi_amd64.go b/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/generic_regabi_amd64.go deleted file mode 100644 index e6d5e3e84..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/generic_regabi_amd64.go +++ /dev/null @@ -1,729 +0,0 @@ -// +build go1.17,!go1.24 - -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package jitdec - -import ( - `encoding/json` - `fmt` - `reflect` - - `github.com/bytedance/sonic/internal/jit` - `github.com/bytedance/sonic/internal/native` - `github.com/bytedance/sonic/internal/native/types` - `github.com/twitchyliquid64/golang-asm/obj` -) - -/** Crucial Registers: - * - * ST(R13) && 0(SP) : ro, decoder stack - * DF(AX) : ro, decoder flags - * EP(BX) : wo, error pointer - * IP(R10) : ro, input pointer - * IL(R12) : ro, input length - * IC(R11) : rw, input cursor - * VP(R15) : ro, value pointer (to an interface{}) - */ - -const ( - _VD_args = 8 // 8 bytes for passing arguments to this functions - _VD_fargs = 64 // 64 bytes for passing arguments to other Go functions - _VD_saves = 48 // 48 bytes for saving the registers before CALL instructions - _VD_locals = 96 // 96 bytes for local variables -) - -const ( - _VD_offs = _VD_fargs + _VD_saves + _VD_locals - _VD_size = _VD_offs + 8 // 8 bytes for the parent frame pointer -) - -var ( - _VAR_ss = _VAR_ss_Vt - _VAR_df = jit.Ptr(_SP, _VD_fargs + _VD_saves) -) - -var ( - _VAR_ss_Vt = jit.Ptr(_SP, _VD_fargs + _VD_saves + 8) - _VAR_ss_Dv = jit.Ptr(_SP, _VD_fargs + _VD_saves + 16) - _VAR_ss_Iv = jit.Ptr(_SP, _VD_fargs + _VD_saves + 24) - _VAR_ss_Ep = jit.Ptr(_SP, _VD_fargs + _VD_saves + 32) - _VAR_ss_Db = jit.Ptr(_SP, _VD_fargs + _VD_saves + 40) - _VAR_ss_Dc = jit.Ptr(_SP, _VD_fargs + _VD_saves + 48) -) - -var ( - _VAR_R9 = jit.Ptr(_SP, _VD_fargs + _VD_saves + 56) -) -type _ValueDecoder struct { - jit.BaseAssembler -} - -var ( - _VAR_cs_LR = jit.Ptr(_SP, _VD_fargs + _VD_saves + 64) - _VAR_cs_p = jit.Ptr(_SP, _VD_fargs + _VD_saves + 72) - _VAR_cs_n = jit.Ptr(_SP, _VD_fargs + _VD_saves + 80) - _VAR_cs_d = jit.Ptr(_SP, _VD_fargs + _VD_saves + 88) -) - -func (self *_ValueDecoder) build() uintptr { - self.Init(self.compile) - return *(*uintptr)(self.Load("decode_value", _VD_size, _VD_args, argPtrs_generic, localPtrs_generic)) -} - -/** Function Calling Helpers **/ - -func (self *_ValueDecoder) save(r ...obj.Addr) { - for i, v := range r { - if i > _VD_saves / 8 - 1 { - panic("too many registers to save") - } else { - self.Emit("MOVQ", v, jit.Ptr(_SP, _VD_fargs + int64(i) * 8)) - } - } -} - -func (self *_ValueDecoder) load(r ...obj.Addr) { - for i, v := range r { - if i > _VD_saves / 8 - 1 { - panic("too many registers to load") - } else { - self.Emit("MOVQ", jit.Ptr(_SP, _VD_fargs + int64(i) * 8), v) - } - } -} - -func (self *_ValueDecoder) call(fn obj.Addr) { - self.Emit("MOVQ", fn, _R9) // MOVQ ${fn}, AX - self.Rjmp("CALL", _R9) // CALL AX -} - -func (self *_ValueDecoder) call_go(fn obj.Addr) { - self.save(_REG_go...) // SAVE $REG_go - self.call(fn) // CALL ${fn} - self.load(_REG_go...) // LOAD $REG_go -} - -func (self *_ValueDecoder) callc(fn obj.Addr) { - self.save(_IP) - self.call(fn) - self.load(_IP) -} - -func (self *_ValueDecoder) call_c(fn obj.Addr) { - self.Emit("XCHGQ", _IC, _BX) - self.callc(fn) - self.Emit("XCHGQ", _IC, _BX) -} - -/** Decoder Assembler **/ - -const ( - _S_val = iota + 1 - _S_arr - _S_arr_0 - _S_obj - _S_obj_0 - _S_obj_delim - _S_obj_sep -) - -const ( - _S_omask_key = (1 << _S_obj_0) | (1 << _S_obj_sep) - _S_omask_end = (1 << _S_obj_0) | (1 << _S_obj) - _S_vmask = (1 << _S_val) | (1 << _S_arr_0) -) - -const ( - _A_init_len = 1 - _A_init_cap = 16 -) - -const ( - _ST_Sp = 0 - _ST_Vt = _PtrBytes - _ST_Vp = _PtrBytes * (types.MAX_RECURSE + 1) -) - -var ( - _V_true = jit.Imm(int64(pbool(true))) - _V_false = jit.Imm(int64(pbool(false))) - _F_value = jit.Imm(int64(native.S_value)) -) - -var ( - _V_max = jit.Imm(int64(types.V_MAX)) - _E_eof = jit.Imm(int64(types.ERR_EOF)) - _E_invalid = jit.Imm(int64(types.ERR_INVALID_CHAR)) - _E_recurse = jit.Imm(int64(types.ERR_RECURSE_EXCEED_MAX)) -) - -var ( - _F_convTslice = jit.Func(convTslice) - _F_convTstring = jit.Func(convTstring) - _F_invalid_vtype = jit.Func(invalid_vtype) -) - -var ( - _T_map = jit.Type(reflect.TypeOf((map[string]interface{})(nil))) - _T_bool = jit.Type(reflect.TypeOf(false)) - _T_int64 = jit.Type(reflect.TypeOf(int64(0))) - _T_eface = jit.Type(reflect.TypeOf((*interface{})(nil)).Elem()) - _T_slice = jit.Type(reflect.TypeOf(([]interface{})(nil))) - _T_string = jit.Type(reflect.TypeOf("")) - _T_number = jit.Type(reflect.TypeOf(json.Number(""))) - _T_float64 = jit.Type(reflect.TypeOf(float64(0))) -) - -var _R_tab = map[int]string { - '[': "_decode_V_ARRAY", - '{': "_decode_V_OBJECT", - ':': "_decode_V_KEY_SEP", - ',': "_decode_V_ELEM_SEP", - ']': "_decode_V_ARRAY_END", - '}': "_decode_V_OBJECT_END", -} - -func (self *_ValueDecoder) compile() { - self.Emit("SUBQ", jit.Imm(_VD_size), _SP) // SUBQ $_VD_size, SP - self.Emit("MOVQ", _BP, jit.Ptr(_SP, _VD_offs)) // MOVQ BP, _VD_offs(SP) - self.Emit("LEAQ", jit.Ptr(_SP, _VD_offs), _BP) // LEAQ _VD_offs(SP), BP - - /* initialize the state machine */ - self.Emit("XORL", _CX, _CX) // XORL CX, CX - self.Emit("MOVQ", _DF, _VAR_df) // MOVQ DF, df - /* initialize digital buffer first */ - self.Emit("MOVQ", jit.Imm(_MaxDigitNums), _VAR_ss_Dc) // MOVQ $_MaxDigitNums, ss.Dcap - self.Emit("LEAQ", jit.Ptr(_ST, _DbufOffset), _AX) // LEAQ _DbufOffset(ST), AX - self.Emit("MOVQ", _AX, _VAR_ss_Db) // MOVQ AX, ss.Dbuf - /* add ST offset */ - self.Emit("ADDQ", jit.Imm(_FsmOffset), _ST) // ADDQ _FsmOffset, _ST - self.Emit("MOVQ", _CX, jit.Ptr(_ST, _ST_Sp)) // MOVQ CX, ST.Sp - self.WriteRecNotAX(0, _VP, jit.Ptr(_ST, _ST_Vp), false) // MOVQ VP, ST.Vp[0] - self.Emit("MOVQ", jit.Imm(_S_val), jit.Ptr(_ST, _ST_Vt)) // MOVQ _S_val, ST.Vt[0] - self.Sjmp("JMP" , "_next") // JMP _next - - /* set the value from previous round */ - self.Link("_set_value") // _set_value: - self.Emit("MOVL" , jit.Imm(_S_vmask), _DX) // MOVL _S_vmask, DX - self.Emit("MOVQ" , jit.Ptr(_ST, _ST_Sp), _CX) // MOVQ ST.Sp, CX - self.Emit("MOVQ" , jit.Sib(_ST, _CX, 8, _ST_Vt), _AX) // MOVQ ST.Vt[CX], AX - self.Emit("BTQ" , _AX, _DX) // BTQ AX, DX - self.Sjmp("JNC" , "_vtype_error") // JNC _vtype_error - self.Emit("XORL" , _SI, _SI) // XORL SI, SI - self.Emit("SUBQ" , jit.Imm(1), jit.Ptr(_ST, _ST_Sp)) // SUBQ $1, ST.Sp - self.Emit("XCHGQ", jit.Sib(_ST, _CX, 8, _ST_Vp), _SI) // XCHGQ ST.Vp[CX], SI - self.Emit("MOVQ" , _R8, jit.Ptr(_SI, 0)) // MOVQ R8, (SI) - self.WriteRecNotAX(1, _R9, jit.Ptr(_SI, 8), false) // MOVQ R9, 8(SI) - - /* check for value stack */ - self.Link("_next") // _next: - self.Emit("MOVQ" , jit.Ptr(_ST, _ST_Sp), _AX) // MOVQ ST.Sp, AX - self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX - self.Sjmp("JS" , "_return") // JS _return - - /* fast path: test up to 4 characters manually */ - self.Emit("CMPQ" , _IC, _IL) // CMPQ IC, IL - self.Sjmp("JAE" , "_decode_V_EOF") // JAE _decode_V_EOF - self.Emit("MOVBQZX", jit.Sib(_IP, _IC, 1, 0), _AX) // MOVBQZX (IP)(IC), AX - self.Emit("MOVQ" , jit.Imm(_BM_space), _DX) // MOVQ _BM_space, DX - self.Emit("CMPQ" , _AX, jit.Imm(' ')) // CMPQ AX, $' ' - self.Sjmp("JA" , "_decode_fast") // JA _decode_fast - self.Emit("BTQ" , _AX, _DX) // BTQ _AX, _DX - self.Sjmp("JNC" , "_decode_fast") // JNC _decode_fast - self.Emit("ADDQ" , jit.Imm(1), _IC) // ADDQ $1, IC - - /* at least 1 to 3 spaces */ - for i := 0; i < 3; i++ { - self.Emit("CMPQ" , _IC, _IL) // CMPQ IC, IL - self.Sjmp("JAE" , "_decode_V_EOF") // JAE _decode_V_EOF - self.Emit("MOVBQZX", jit.Sib(_IP, _IC, 1, 0), _AX) // MOVBQZX (IP)(IC), AX - self.Emit("CMPQ" , _AX, jit.Imm(' ')) // CMPQ AX, $' ' - self.Sjmp("JA" , "_decode_fast") // JA _decode_fast - self.Emit("BTQ" , _AX, _DX) // BTQ _AX, _DX - self.Sjmp("JNC" , "_decode_fast") // JNC _decode_fast - self.Emit("ADDQ" , jit.Imm(1), _IC) // ADDQ $1, IC - } - - /* at least 4 spaces */ - self.Emit("CMPQ" , _IC, _IL) // CMPQ IC, IL - self.Sjmp("JAE" , "_decode_V_EOF") // JAE _decode_V_EOF - self.Emit("MOVBQZX", jit.Sib(_IP, _IC, 1, 0), _AX) // MOVBQZX (IP)(IC), AX - - /* fast path: use lookup table to select decoder */ - self.Link("_decode_fast") // _decode_fast: - self.Byte(0x48, 0x8d, 0x3d) // LEAQ ?(PC), DI - self.Sref("_decode_tab", 4) // .... &_decode_tab - self.Emit("MOVLQSX", jit.Sib(_DI, _AX, 4, 0), _AX) // MOVLQSX (DI)(AX*4), AX - self.Emit("TESTQ" , _AX, _AX) // TESTQ AX, AX - self.Sjmp("JZ" , "_decode_native") // JZ _decode_native - self.Emit("ADDQ" , jit.Imm(1), _IC) // ADDQ $1, IC - self.Emit("ADDQ" , _DI, _AX) // ADDQ DI, AX - self.Rjmp("JMP" , _AX) // JMP AX - - /* decode with native decoder */ - self.Link("_decode_native") // _decode_native: - self.Emit("MOVQ", _IP, _DI) // MOVQ IP, DI - self.Emit("MOVQ", _IL, _SI) // MOVQ IL, SI - self.Emit("MOVQ", _IC, _DX) // MOVQ IC, DX - self.Emit("LEAQ", _VAR_ss, _CX) // LEAQ ss, CX - self.Emit("MOVQ", _VAR_df, _R8) // MOVQ $df, R8 - self.Emit("BTSQ", jit.Imm(_F_allow_control), _R8) // ANDQ $1<<_F_allow_control, R8 - self.callc(_F_value) // CALL value - self.Emit("MOVQ", _AX, _IC) // MOVQ AX, IC - - /* check for errors */ - self.Emit("MOVQ" , _VAR_ss_Vt, _AX) // MOVQ ss.Vt, AX - self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX - self.Sjmp("JS" , "_parsing_error") - self.Sjmp("JZ" , "_invalid_vtype") // JZ _invalid_vtype - self.Emit("CMPQ" , _AX, _V_max) // CMPQ AX, _V_max - self.Sjmp("JA" , "_invalid_vtype") // JA _invalid_vtype - - /* jump table selector */ - self.Byte(0x48, 0x8d, 0x3d) // LEAQ ?(PC), DI - self.Sref("_switch_table", 4) // .... &_switch_table - self.Emit("MOVLQSX", jit.Sib(_DI, _AX, 4, -4), _AX) // MOVLQSX -4(DI)(AX*4), AX - self.Emit("ADDQ" , _DI, _AX) // ADDQ DI, AX - self.Rjmp("JMP" , _AX) // JMP AX - - /** V_EOF **/ - self.Link("_decode_V_EOF") // _decode_V_EOF: - self.Emit("MOVL", _E_eof, _EP) // MOVL _E_eof, EP - self.Sjmp("JMP" , "_error") // JMP _error - - /** V_NULL **/ - self.Link("_decode_V_NULL") // _decode_V_NULL: - self.Emit("XORL", _R8, _R8) // XORL R8, R8 - self.Emit("XORL", _R9, _R9) // XORL R9, R9 - self.Emit("LEAQ", jit.Ptr(_IC, -4), _DI) // LEAQ -4(IC), DI - self.Sjmp("JMP" , "_set_value") // JMP _set_value - - /** V_TRUE **/ - self.Link("_decode_V_TRUE") // _decode_V_TRUE: - self.Emit("MOVQ", _T_bool, _R8) // MOVQ _T_bool, R8 - // TODO: maybe modified by users? - self.Emit("MOVQ", _V_true, _R9) // MOVQ _V_true, R9 - self.Emit("LEAQ", jit.Ptr(_IC, -4), _DI) // LEAQ -4(IC), DI - self.Sjmp("JMP" , "_set_value") // JMP _set_value - - /** V_FALSE **/ - self.Link("_decode_V_FALSE") // _decode_V_FALSE: - self.Emit("MOVQ", _T_bool, _R8) // MOVQ _T_bool, R8 - self.Emit("MOVQ", _V_false, _R9) // MOVQ _V_false, R9 - self.Emit("LEAQ", jit.Ptr(_IC, -5), _DI) // LEAQ -5(IC), DI - self.Sjmp("JMP" , "_set_value") // JMP _set_value - - /** V_ARRAY **/ - self.Link("_decode_V_ARRAY") // _decode_V_ARRAY - self.Emit("MOVL", jit.Imm(_S_vmask), _DX) // MOVL _S_vmask, DX - self.Emit("MOVQ", jit.Ptr(_ST, _ST_Sp), _CX) // MOVQ ST.Sp, CX - self.Emit("MOVQ", jit.Sib(_ST, _CX, 8, _ST_Vt), _AX) // MOVQ ST.Vt[CX], AX - self.Emit("BTQ" , _AX, _DX) // BTQ AX, DX - self.Sjmp("JNC" , "_invalid_char") // JNC _invalid_char - - /* create a new array */ - self.Emit("MOVQ", _T_eface, _AX) // MOVQ _T_eface, AX - self.Emit("MOVQ", jit.Imm(_A_init_len), _BX) // MOVQ _A_init_len, BX - self.Emit("MOVQ", jit.Imm(_A_init_cap), _CX) // MOVQ _A_init_cap, CX - self.call_go(_F_makeslice) // CALL_GO runtime.makeslice - - /* pack into an interface */ - self.Emit("MOVQ", jit.Imm(_A_init_len), _BX) // MOVQ _A_init_len, BX - self.Emit("MOVQ", jit.Imm(_A_init_cap), _CX) // MOVQ _A_init_cap, CX - self.call_go(_F_convTslice) // CALL_GO runtime.convTslice - self.Emit("MOVQ", _AX, _R8) // MOVQ AX, R8 - - /* replace current state with an array */ - self.Emit("MOVQ", jit.Ptr(_ST, _ST_Sp), _CX) // MOVQ ST.Sp, CX - self.Emit("MOVQ", jit.Sib(_ST, _CX, 8, _ST_Vp), _SI) // MOVQ ST.Vp[CX], SI - self.Emit("MOVQ", jit.Imm(_S_arr), jit.Sib(_ST, _CX, 8, _ST_Vt)) // MOVQ _S_arr, ST.Vt[CX] - self.Emit("MOVQ", _T_slice, _AX) // MOVQ _T_slice, AX - self.Emit("MOVQ", _AX, jit.Ptr(_SI, 0)) // MOVQ AX, (SI) - self.WriteRecNotAX(2, _R8, jit.Ptr(_SI, 8), false) // MOVQ R8, 8(SI) - - /* add a new slot for the first element */ - self.Emit("ADDQ", jit.Imm(1), _CX) // ADDQ $1, CX - self.Emit("CMPQ", _CX, jit.Imm(types.MAX_RECURSE)) // CMPQ CX, ${types.MAX_RECURSE} - self.Sjmp("JAE" , "_stack_overflow") // JA _stack_overflow - self.Emit("MOVQ", jit.Ptr(_R8, 0), _AX) // MOVQ (R8), AX - self.Emit("MOVQ", _CX, jit.Ptr(_ST, _ST_Sp)) // MOVQ CX, ST.Sp - self.WritePtrAX(3, jit.Sib(_ST, _CX, 8, _ST_Vp), false) // MOVQ AX, ST.Vp[CX] - self.Emit("MOVQ", jit.Imm(_S_arr_0), jit.Sib(_ST, _CX, 8, _ST_Vt)) // MOVQ _S_arr_0, ST.Vt[CX] - self.Sjmp("JMP" , "_next") // JMP _next - - /** V_OBJECT **/ - self.Link("_decode_V_OBJECT") // _decode_V_OBJECT: - self.Emit("MOVL", jit.Imm(_S_vmask), _DX) // MOVL _S_vmask, DX - self.Emit("MOVQ", jit.Ptr(_ST, _ST_Sp), _CX) // MOVQ ST.Sp, CX - self.Emit("MOVQ", jit.Sib(_ST, _CX, 8, _ST_Vt), _AX) // MOVQ ST.Vt[CX], AX - self.Emit("BTQ" , _AX, _DX) // BTQ AX, DX - self.Sjmp("JNC" , "_invalid_char") // JNC _invalid_char - self.call_go(_F_makemap_small) // CALL_GO runtime.makemap_small - self.Emit("MOVQ", jit.Ptr(_ST, _ST_Sp), _CX) // MOVQ ST.Sp, CX - self.Emit("MOVQ", jit.Imm(_S_obj_0), jit.Sib(_ST, _CX, 8, _ST_Vt)) // MOVQ _S_obj_0, ST.Vt[CX] - self.Emit("MOVQ", jit.Sib(_ST, _CX, 8, _ST_Vp), _SI) // MOVQ ST.Vp[CX], SI - self.Emit("MOVQ", _T_map, _DX) // MOVQ _T_map, DX - self.Emit("MOVQ", _DX, jit.Ptr(_SI, 0)) // MOVQ DX, (SI) - self.WritePtrAX(4, jit.Ptr(_SI, 8), false) // MOVQ AX, 8(SI) - self.Sjmp("JMP" , "_next") // JMP _next - - /** V_STRING **/ - self.Link("_decode_V_STRING") // _decode_V_STRING: - self.Emit("MOVQ", _VAR_ss_Iv, _CX) // MOVQ ss.Iv, CX - self.Emit("MOVQ", _IC, _AX) // MOVQ IC, AX - self.Emit("SUBQ", _CX, _AX) // SUBQ CX, AX - - /* check for escapes */ - self.Emit("CMPQ", _VAR_ss_Ep, jit.Imm(-1)) // CMPQ ss.Ep, $-1 - self.Sjmp("JNE" , "_unquote") // JNE _unquote - self.Emit("SUBQ", jit.Imm(1), _AX) // SUBQ $1, AX - self.Emit("LEAQ", jit.Sib(_IP, _CX, 1, 0), _R8) // LEAQ (IP)(CX), R8 - self.Byte(0x48, 0x8d, 0x3d) // LEAQ (PC), DI - self.Sref("_copy_string_end", 4) - self.Emit("BTQ", jit.Imm(_F_copy_string), _VAR_df) - self.Sjmp("JC", "copy_string") - self.Link("_copy_string_end") - self.Emit("XORL", _DX, _DX) - - /* strings with no escape sequences */ - self.Link("_noescape") // _noescape: - self.Emit("MOVL", jit.Imm(_S_omask_key), _DI) // MOVL _S_omask, DI - self.Emit("MOVQ", jit.Ptr(_ST, _ST_Sp), _CX) // MOVQ ST.Sp, CX - self.Emit("MOVQ", jit.Sib(_ST, _CX, 8, _ST_Vt), _SI) // MOVQ ST.Vt[CX], SI - self.Emit("BTQ" , _SI, _DI) // BTQ SI, DI - self.Sjmp("JC" , "_object_key") // JC _object_key - - /* check for pre-packed strings, avoid 1 allocation */ - self.Emit("TESTQ", _DX, _DX) // TESTQ DX, DX - self.Sjmp("JNZ" , "_packed_str") // JNZ _packed_str - self.Emit("MOVQ" , _AX, _BX) // MOVQ AX, BX - self.Emit("MOVQ" , _R8, _AX) // MOVQ R8, AX - self.call_go(_F_convTstring) // CALL_GO runtime.convTstring - self.Emit("MOVQ" , _AX, _R9) // MOVQ AX, R9 - - /* packed string already in R9 */ - self.Link("_packed_str") // _packed_str: - self.Emit("MOVQ", _T_string, _R8) // MOVQ _T_string, R8 - self.Emit("MOVQ", _VAR_ss_Iv, _DI) // MOVQ ss.Iv, DI - self.Emit("SUBQ", jit.Imm(1), _DI) // SUBQ $1, DI - self.Sjmp("JMP" , "_set_value") // JMP _set_value - - /* the string is an object key, get the map */ - self.Link("_object_key") - self.Emit("MOVQ", jit.Ptr(_ST, _ST_Sp), _CX) // MOVQ ST.Sp, CX - self.Emit("MOVQ", jit.Sib(_ST, _CX, 8, _ST_Vp), _SI) // MOVQ ST.Vp[CX], SI - self.Emit("MOVQ", jit.Ptr(_SI, 8), _SI) // MOVQ 8(SI), SI - - /* add a new delimiter */ - self.Emit("ADDQ", jit.Imm(1), _CX) // ADDQ $1, CX - self.Emit("CMPQ", _CX, jit.Imm(types.MAX_RECURSE)) // CMPQ CX, ${types.MAX_RECURSE} - self.Sjmp("JAE" , "_stack_overflow") // JA _stack_overflow - self.Emit("MOVQ", _CX, jit.Ptr(_ST, _ST_Sp)) // MOVQ CX, ST.Sp - self.Emit("MOVQ", jit.Imm(_S_obj_delim), jit.Sib(_ST, _CX, 8, _ST_Vt)) // MOVQ _S_obj_delim, ST.Vt[CX] - - /* add a new slot int the map */ - self.Emit("MOVQ", _AX, _DI) // MOVQ AX, DI - self.Emit("MOVQ", _T_map, _AX) // MOVQ _T_map, AX - self.Emit("MOVQ", _SI, _BX) // MOVQ SI, BX - self.Emit("MOVQ", _R8, _CX) // MOVQ R9, CX - self.call_go(_F_mapassign_faststr) // CALL_GO runtime.mapassign_faststr - - /* add to the pointer stack */ - self.Emit("MOVQ", jit.Ptr(_ST, _ST_Sp), _CX) // MOVQ ST.Sp, CX - self.WritePtrAX(6, jit.Sib(_ST, _CX, 8, _ST_Vp), false) // MOVQ AX, ST.Vp[CX] - self.Sjmp("JMP" , "_next") // JMP _next - - /* allocate memory to store the string header and unquoted result */ - self.Link("_unquote") // _unquote: - self.Emit("ADDQ", jit.Imm(15), _AX) // ADDQ $15, AX - self.Emit("MOVQ", _T_byte, _BX) // MOVQ _T_byte, BX - self.Emit("MOVB", jit.Imm(0), _CX) // MOVB $0, CX - self.call_go(_F_mallocgc) // CALL_GO runtime.mallocgc - self.Emit("MOVQ", _AX, _R9) // MOVQ AX, R9 - - /* prepare the unquoting parameters */ - self.Emit("MOVQ" , _VAR_ss_Iv, _CX) // MOVQ ss.Iv, CX - self.Emit("LEAQ" , jit.Sib(_IP, _CX, 1, 0), _DI) // LEAQ (IP)(CX), DI - self.Emit("NEGQ" , _CX) // NEGQ CX - self.Emit("LEAQ" , jit.Sib(_IC, _CX, 1, -1), _SI) // LEAQ -1(IC)(CX), SI - self.Emit("LEAQ" , jit.Ptr(_R9, 16), _DX) // LEAQ 16(R8), DX - self.Emit("LEAQ" , _VAR_ss_Ep, _CX) // LEAQ ss.Ep, CX - self.Emit("XORL" , _R8, _R8) // XORL R8, R8 - self.Emit("BTQ" , jit.Imm(_F_disable_urc), _VAR_df) // BTQ ${_F_disable_urc}, fv - self.Emit("SETCC", _R8) // SETCC R8 - self.Emit("SHLQ" , jit.Imm(types.B_UNICODE_REPLACE), _R8) // SHLQ ${types.B_UNICODE_REPLACE}, R8 - - /* unquote the string, with R9 been preserved */ - self.Emit("MOVQ", _R9, _VAR_R9) // SAVE R9 - self.call_c(_F_unquote) // CALL unquote - self.Emit("MOVQ", _VAR_R9, _R9) // LOAD R9 - - /* check for errors */ - self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX - self.Sjmp("JS" , "_unquote_error") // JS _unquote_error - self.Emit("MOVL" , jit.Imm(1), _DX) // MOVL $1, DX - self.Emit("LEAQ" , jit.Ptr(_R9, 16), _R8) // ADDQ $16, R8 - self.Emit("MOVQ" , _R8, jit.Ptr(_R9, 0)) // MOVQ R8, (R9) - self.Emit("MOVQ" , _AX, jit.Ptr(_R9, 8)) // MOVQ AX, 8(R9) - self.Sjmp("JMP" , "_noescape") // JMP _noescape - - /** V_DOUBLE **/ - self.Link("_decode_V_DOUBLE") // _decode_V_DOUBLE: - self.Emit("BTQ" , jit.Imm(_F_use_number), _VAR_df) // BTQ _F_use_number, df - self.Sjmp("JC" , "_use_number") // JC _use_number - self.Emit("MOVSD", _VAR_ss_Dv, _X0) // MOVSD ss.Dv, X0 - self.Sjmp("JMP" , "_use_float64") // JMP _use_float64 - - /** V_INTEGER **/ - self.Link("_decode_V_INTEGER") // _decode_V_INTEGER: - self.Emit("BTQ" , jit.Imm(_F_use_number), _VAR_df) // BTQ _F_use_number, df - self.Sjmp("JC" , "_use_number") // JC _use_number - self.Emit("BTQ" , jit.Imm(_F_use_int64), _VAR_df) // BTQ _F_use_int64, df - self.Sjmp("JC" , "_use_int64") // JC _use_int64 - //TODO: use ss.Dv directly - self.Emit("MOVSD", _VAR_ss_Dv, _X0) // MOVSD ss.Dv, X0 - - /* represent numbers as `float64` */ - self.Link("_use_float64") // _use_float64: - self.Emit("MOVQ" , _X0, _AX) // MOVQ X0, AX - self.call_go(_F_convT64) // CALL_GO runtime.convT64 - self.Emit("MOVQ" , _T_float64, _R8) // MOVQ _T_float64, R8 - self.Emit("MOVQ" , _AX, _R9) // MOVQ AX, R9 - self.Emit("MOVQ" , _VAR_ss_Ep, _DI) // MOVQ ss.Ep, DI - self.Sjmp("JMP" , "_set_value") // JMP _set_value - - /* represent numbers as `json.Number` */ - self.Link("_use_number") // _use_number - self.Emit("MOVQ", _VAR_ss_Ep, _AX) // MOVQ ss.Ep, AX - self.Emit("LEAQ", jit.Sib(_IP, _AX, 1, 0), _SI) // LEAQ (IP)(AX), SI - self.Emit("MOVQ", _IC, _CX) // MOVQ IC, CX - self.Emit("SUBQ", _AX, _CX) // SUBQ AX, CX - self.Emit("MOVQ", _SI, _AX) // MOVQ SI, AX - self.Emit("MOVQ", _CX, _BX) // MOVQ CX, BX - self.call_go(_F_convTstring) // CALL_GO runtime.convTstring - self.Emit("MOVQ", _T_number, _R8) // MOVQ _T_number, R8 - self.Emit("MOVQ", _AX, _R9) // MOVQ AX, R9 - self.Emit("MOVQ", _VAR_ss_Ep, _DI) // MOVQ ss.Ep, DI - self.Sjmp("JMP" , "_set_value") // JMP _set_value - - /* represent numbers as `int64` */ - self.Link("_use_int64") // _use_int64: - self.Emit("MOVQ", _VAR_ss_Iv, _AX) // MOVQ ss.Iv, AX - self.call_go(_F_convT64) // CALL_GO runtime.convT64 - self.Emit("MOVQ", _T_int64, _R8) // MOVQ _T_int64, R8 - self.Emit("MOVQ", _AX, _R9) // MOVQ AX, R9 - self.Emit("MOVQ", _VAR_ss_Ep, _DI) // MOVQ ss.Ep, DI - self.Sjmp("JMP" , "_set_value") // JMP _set_value - - /** V_KEY_SEP **/ - self.Link("_decode_V_KEY_SEP") // _decode_V_KEY_SEP: - self.Emit("MOVQ", jit.Ptr(_ST, _ST_Sp), _CX) // MOVQ ST.Sp, CX - self.Emit("MOVQ", jit.Sib(_ST, _CX, 8, _ST_Vt), _AX) // MOVQ ST.Vt[CX], AX - self.Emit("CMPQ", _AX, jit.Imm(_S_obj_delim)) // CMPQ AX, _S_obj_delim - self.Sjmp("JNE" , "_invalid_char") // JNE _invalid_char - self.Emit("MOVQ", jit.Imm(_S_val), jit.Sib(_ST, _CX, 8, _ST_Vt)) // MOVQ _S_val, ST.Vt[CX] - self.Emit("MOVQ", jit.Imm(_S_obj), jit.Sib(_ST, _CX, 8, _ST_Vt - 8)) // MOVQ _S_obj, ST.Vt[CX - 1] - self.Sjmp("JMP" , "_next") // JMP _next - - /** V_ELEM_SEP **/ - self.Link("_decode_V_ELEM_SEP") // _decode_V_ELEM_SEP: - self.Emit("MOVQ" , jit.Ptr(_ST, _ST_Sp), _CX) // MOVQ ST.Sp, CX - self.Emit("MOVQ" , jit.Sib(_ST, _CX, 8, _ST_Vt), _AX) // MOVQ ST.Vt[CX], AX - self.Emit("CMPQ" , _AX, jit.Imm(_S_arr)) - self.Sjmp("JE" , "_array_sep") // JZ _next - self.Emit("CMPQ" , _AX, jit.Imm(_S_obj)) // CMPQ _AX, _S_arr - self.Sjmp("JNE" , "_invalid_char") // JNE _invalid_char - self.Emit("MOVQ" , jit.Imm(_S_obj_sep), jit.Sib(_ST, _CX, 8, _ST_Vt)) - self.Sjmp("JMP" , "_next") // JMP _next - - /* arrays */ - self.Link("_array_sep") - self.Emit("MOVQ", jit.Sib(_ST, _CX, 8, _ST_Vp), _SI) // MOVQ ST.Vp[CX], SI - self.Emit("MOVQ", jit.Ptr(_SI, 8), _SI) // MOVQ 8(SI), SI - self.Emit("MOVQ", jit.Ptr(_SI, 8), _DX) // MOVQ 8(SI), DX - self.Emit("CMPQ", _DX, jit.Ptr(_SI, 16)) // CMPQ DX, 16(SI) - self.Sjmp("JAE" , "_array_more") // JAE _array_more - - /* add a slot for the new element */ - self.Link("_array_append") // _array_append: - self.Emit("ADDQ", jit.Imm(1), jit.Ptr(_SI, 8)) // ADDQ $1, 8(SI) - self.Emit("MOVQ", jit.Ptr(_SI, 0), _SI) // MOVQ (SI), SI - self.Emit("ADDQ", jit.Imm(1), _CX) // ADDQ $1, CX - self.Emit("CMPQ", _CX, jit.Imm(types.MAX_RECURSE)) // CMPQ CX, ${types.MAX_RECURSE} - self.Sjmp("JAE" , "_stack_overflow") // JA _stack_overflow - self.Emit("SHLQ", jit.Imm(1), _DX) // SHLQ $1, DX - self.Emit("LEAQ", jit.Sib(_SI, _DX, 8, 0), _SI) // LEAQ (SI)(DX*8), SI - self.Emit("MOVQ", _CX, jit.Ptr(_ST, _ST_Sp)) // MOVQ CX, ST.Sp - self.WriteRecNotAX(7 , _SI, jit.Sib(_ST, _CX, 8, _ST_Vp), false) // MOVQ SI, ST.Vp[CX] - self.Emit("MOVQ", jit.Imm(_S_val), jit.Sib(_ST, _CX, 8, _ST_Vt)) // MOVQ _S_val, ST.Vt[CX} - self.Sjmp("JMP" , "_next") // JMP _next - - /** V_ARRAY_END **/ - self.Link("_decode_V_ARRAY_END") // _decode_V_ARRAY_END: - self.Emit("XORL", _DX, _DX) // XORL DX, DX - self.Emit("MOVQ", jit.Ptr(_ST, _ST_Sp), _CX) // MOVQ ST.Sp, CX - self.Emit("MOVQ", jit.Sib(_ST, _CX, 8, _ST_Vt), _AX) // MOVQ ST.Vt[CX], AX - self.Emit("CMPQ", _AX, jit.Imm(_S_arr_0)) // CMPQ AX, _S_arr_0 - self.Sjmp("JE" , "_first_item") // JE _first_item - self.Emit("CMPQ", _AX, jit.Imm(_S_arr)) // CMPQ AX, _S_arr - self.Sjmp("JNE" , "_invalid_char") // JNE _invalid_char - self.Emit("SUBQ", jit.Imm(1), jit.Ptr(_ST, _ST_Sp)) // SUBQ $1, ST.Sp - self.Emit("MOVQ", _DX, jit.Sib(_ST, _CX, 8, _ST_Vp)) // MOVQ DX, ST.Vp[CX] - self.Sjmp("JMP" , "_next") // JMP _next - - /* first element of an array */ - self.Link("_first_item") // _first_item: - self.Emit("MOVQ", jit.Ptr(_ST, _ST_Sp), _CX) // MOVQ ST.Sp, CX - self.Emit("SUBQ", jit.Imm(2), jit.Ptr(_ST, _ST_Sp)) // SUBQ $2, ST.Sp - self.Emit("MOVQ", jit.Sib(_ST, _CX, 8, _ST_Vp - 8), _SI) // MOVQ ST.Vp[CX - 1], SI - self.Emit("MOVQ", jit.Ptr(_SI, 8), _SI) // MOVQ 8(SI), SI - self.Emit("MOVQ", _DX, jit.Sib(_ST, _CX, 8, _ST_Vp - 8)) // MOVQ DX, ST.Vp[CX - 1] - self.Emit("MOVQ", _DX, jit.Sib(_ST, _CX, 8, _ST_Vp)) // MOVQ DX, ST.Vp[CX] - self.Emit("MOVQ", _DX, jit.Ptr(_SI, 8)) // MOVQ DX, 8(SI) - self.Sjmp("JMP" , "_next") // JMP _next - - /** V_OBJECT_END **/ - self.Link("_decode_V_OBJECT_END") // _decode_V_OBJECT_END: - self.Emit("MOVL", jit.Imm(_S_omask_end), _DI) // MOVL _S_omask, DI - self.Emit("MOVQ", jit.Ptr(_ST, _ST_Sp), _CX) // MOVQ ST.Sp, CX - self.Emit("MOVQ", jit.Sib(_ST, _CX, 8, _ST_Vt), _AX) // MOVQ ST.Vt[CX], AX - self.Emit("BTQ" , _AX, _DI) - self.Sjmp("JNC" , "_invalid_char") // JNE _invalid_char - self.Emit("XORL", _AX, _AX) // XORL AX, AX - self.Emit("SUBQ", jit.Imm(1), jit.Ptr(_ST, _ST_Sp)) // SUBQ $1, ST.Sp - self.Emit("MOVQ", _AX, jit.Sib(_ST, _CX, 8, _ST_Vp)) // MOVQ AX, ST.Vp[CX] - self.Sjmp("JMP" , "_next") // JMP _next - - /* return from decoder */ - self.Link("_return") // _return: - self.Emit("XORL", _EP, _EP) // XORL EP, EP - self.Emit("MOVQ", _EP, jit.Ptr(_ST, _ST_Vp)) // MOVQ EP, ST.Vp[0] - self.Link("_epilogue") // _epilogue: - self.Emit("SUBQ", jit.Imm(_FsmOffset), _ST) // SUBQ _FsmOffset, _ST - self.Emit("MOVQ", jit.Ptr(_SP, _VD_offs), _BP) // MOVQ _VD_offs(SP), BP - self.Emit("ADDQ", jit.Imm(_VD_size), _SP) // ADDQ $_VD_size, SP - self.Emit("RET") // RET - - /* array expand */ - self.Link("_array_more") // _array_more: - self.Emit("MOVQ" , _T_eface, _AX) // MOVQ _T_eface, AX - self.Emit("MOVQ" , jit.Ptr(_SI, 0), _BX) // MOVQ (SI), BX - self.Emit("MOVQ" , jit.Ptr(_SI, 8), _CX) // MOVQ 8(SI), CX - self.Emit("MOVQ" , jit.Ptr(_SI, 16), _DI) // MOVQ 16(SI), DI - self.Emit("MOVQ" , _DI, _SI) // MOVQ DI, 24(SP) - self.Emit("SHLQ" , jit.Imm(1), _SI) // SHLQ $1, SI - self.call_go(_F_growslice) // CALL_GO runtime.growslice - self.Emit("MOVQ" , _AX, _DI) // MOVQ AX, DI - self.Emit("MOVQ" , _BX, _DX) // MOVQ BX, DX - self.Emit("MOVQ" , _CX, _AX) // MOVQ CX, AX - - /* update the slice */ - self.Emit("MOVQ", jit.Ptr(_ST, _ST_Sp), _CX) // MOVQ ST.Sp, CX - self.Emit("MOVQ", jit.Sib(_ST, _CX, 8, _ST_Vp), _SI) // MOVQ ST.Vp[CX], SI - self.Emit("MOVQ", jit.Ptr(_SI, 8), _SI) // MOVQ 8(SI), SI - self.Emit("MOVQ", _DX, jit.Ptr(_SI, 8)) // MOVQ DX, 8(SI) - self.Emit("MOVQ", _AX, jit.Ptr(_SI, 16)) // MOVQ AX, 16(AX) - self.WriteRecNotAX(8 , _DI, jit.Ptr(_SI, 0), false) // MOVQ R10, (SI) - self.Sjmp("JMP" , "_array_append") // JMP _array_append - - /* copy string */ - self.Link("copy_string") // pointer: R8, length: AX, return addr: DI - self.Emit("MOVQ", _R8, _VAR_cs_p) - self.Emit("MOVQ", _AX, _VAR_cs_n) - self.Emit("MOVQ", _DI, _VAR_cs_LR) - self.Emit("MOVQ", _AX, _BX) - self.Emit("MOVQ", _AX, _CX) - self.Emit("MOVQ", _T_byte, _AX) - self.call_go(_F_makeslice) - self.Emit("MOVQ", _AX, _VAR_cs_d) - self.Emit("MOVQ", _VAR_cs_p, _BX) - self.Emit("MOVQ", _VAR_cs_n, _CX) - self.call_go(_F_memmove) - self.Emit("MOVQ", _VAR_cs_d, _R8) - self.Emit("MOVQ", _VAR_cs_n, _AX) - self.Emit("MOVQ", _VAR_cs_LR, _DI) - self.Rjmp("JMP", _DI) - - /* error handlers */ - self.Link("_stack_overflow") - self.Emit("MOVL" , _E_recurse, _EP) // MOVQ _E_recurse, EP - self.Sjmp("JMP" , "_error") // JMP _error - self.Link("_vtype_error") // _vtype_error: - self.Emit("MOVQ" , _DI, _IC) // MOVQ DI, IC - self.Emit("MOVL" , _E_invalid, _EP) // MOVL _E_invalid, EP - self.Sjmp("JMP" , "_error") // JMP _error - self.Link("_invalid_char") // _invalid_char: - self.Emit("SUBQ" , jit.Imm(1), _IC) // SUBQ $1, IC - self.Emit("MOVL" , _E_invalid, _EP) // MOVL _E_invalid, EP - self.Sjmp("JMP" , "_error") // JMP _error - self.Link("_unquote_error") // _unquote_error: - self.Emit("MOVQ" , _VAR_ss_Iv, _IC) // MOVQ ss.Iv, IC - self.Emit("SUBQ" , jit.Imm(1), _IC) // SUBQ $1, IC - self.Link("_parsing_error") // _parsing_error: - self.Emit("NEGQ" , _AX) // NEGQ AX - self.Emit("MOVQ" , _AX, _EP) // MOVQ AX, EP - self.Link("_error") // _error: - self.Emit("PXOR" , _X0, _X0) // PXOR X0, X0 - self.Emit("MOVOU", _X0, jit.Ptr(_VP, 0)) // MOVOU X0, (VP) - self.Sjmp("JMP" , "_epilogue") // JMP _epilogue - - /* invalid value type, never returns */ - self.Link("_invalid_vtype") - self.call_go(_F_invalid_vtype) // CALL invalid_type - self.Emit("UD2") // UD2 - - /* switch jump table */ - self.Link("_switch_table") // _switch_table: - self.Sref("_decode_V_EOF", 0) // SREF &_decode_V_EOF, $0 - self.Sref("_decode_V_NULL", -4) // SREF &_decode_V_NULL, $-4 - self.Sref("_decode_V_TRUE", -8) // SREF &_decode_V_TRUE, $-8 - self.Sref("_decode_V_FALSE", -12) // SREF &_decode_V_FALSE, $-12 - self.Sref("_decode_V_ARRAY", -16) // SREF &_decode_V_ARRAY, $-16 - self.Sref("_decode_V_OBJECT", -20) // SREF &_decode_V_OBJECT, $-20 - self.Sref("_decode_V_STRING", -24) // SREF &_decode_V_STRING, $-24 - self.Sref("_decode_V_DOUBLE", -28) // SREF &_decode_V_DOUBLE, $-28 - self.Sref("_decode_V_INTEGER", -32) // SREF &_decode_V_INTEGER, $-32 - self.Sref("_decode_V_KEY_SEP", -36) // SREF &_decode_V_KEY_SEP, $-36 - self.Sref("_decode_V_ELEM_SEP", -40) // SREF &_decode_V_ELEM_SEP, $-40 - self.Sref("_decode_V_ARRAY_END", -44) // SREF &_decode_V_ARRAY_END, $-44 - self.Sref("_decode_V_OBJECT_END", -48) // SREF &_decode_V_OBJECT_END, $-48 - - /* fast character lookup table */ - self.Link("_decode_tab") // _decode_tab: - self.Sref("_decode_V_EOF", 0) // SREF &_decode_V_EOF, $0 - - /* generate rest of the tabs */ - for i := 1; i < 256; i++ { - if to, ok := _R_tab[i]; ok { - self.Sref(to, -int64(i) * 4) - } else { - self.Byte(0x00, 0x00, 0x00, 0x00) - } - } -} - -/** Generic Decoder **/ - -var ( - _subr_decode_value = new(_ValueDecoder).build() -) - -//go:nosplit -func invalid_vtype(vt types.ValueType) { - throw(fmt.Sprintf("invalid value type: %d", vt)) -} diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/generic_regabi_amd64_test.s b/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/generic_regabi_amd64_test.s deleted file mode 100644 index 19ed3752f..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/generic_regabi_amd64_test.s +++ /dev/null @@ -1,37 +0,0 @@ -// +build go1.17,!go1.24 - -// -// Copyright 2021 ByteDance Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#include "go_asm.h" -#include "funcdata.h" -#include "textflag.h" - -TEXT ·decodeValueStub(SB), NOSPLIT, $0 - 72 - NO_LOCAL_POINTERS - PXOR X0, X0 - MOVOU X0, rv+48(FP) - MOVQ st+0(FP) , R13 - MOVQ sp+8(FP) , R10 - MOVQ sn+16(FP), R12 - MOVQ ic+24(FP), R11 - MOVQ vp+32(FP), R15 - MOVQ df+40(FP), AX - MOVQ ·_subr_decode_value(SB), BX - CALL BX - MOVQ R11, rp+48(FP) - MOVQ BX, ex+56(FP) - RET diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/pools.go b/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/pools.go deleted file mode 100644 index 200af6a60..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/pools.go +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package jitdec - -import ( - `sync` - `unsafe` - - `github.com/bytedance/sonic/internal/caching` - `github.com/bytedance/sonic/internal/native/types` - `github.com/bytedance/sonic/internal/rt` -) - -const ( - _MinSlice = 2 - _MaxStack = 4096 // 4k slots - _MaxStackBytes = _MaxStack * _PtrBytes - _MaxDigitNums = types.MaxDigitNums // used in atof fallback algorithm -) - -const ( - _PtrBytes = _PTR_SIZE / 8 - _FsmOffset = (_MaxStack + 1) * _PtrBytes - _DbufOffset = _FsmOffset + int64(unsafe.Sizeof(types.StateMachine{})) + types.MAX_RECURSE * _PtrBytes - _EpOffset = _DbufOffset + _MaxDigitNums - _StackSize = unsafe.Sizeof(_Stack{}) -) - -var ( - stackPool = sync.Pool{} - valueCache = []unsafe.Pointer(nil) - fieldCache = []*caching.FieldMap(nil) - fieldCacheMux = sync.Mutex{} - programCache = caching.CreateProgramCache() -) - -type _Stack struct { - sp uintptr - sb [_MaxStack]unsafe.Pointer - mm types.StateMachine - vp [types.MAX_RECURSE]unsafe.Pointer - dp [_MaxDigitNums]byte - ep unsafe.Pointer -} - -type _Decoder func( - s string, - i int, - vp unsafe.Pointer, - sb *_Stack, - fv uint64, - sv string, // DO NOT pass value to this argument, since it is only used for local _VAR_sv - vk unsafe.Pointer, // DO NOT pass value to this argument, since it is only used for local _VAR_vk -) (int, error) - -var _KeepAlive struct { - s string - i int - vp unsafe.Pointer - sb *_Stack - fv uint64 - sv string - vk unsafe.Pointer - - ret int - err error - - frame_decoder [_FP_offs]byte - frame_generic [_VD_offs]byte -} - -var ( - argPtrs = []bool{true, false, false, true, true, false, true, false, true} - localPtrs = []bool{} -) - -var ( - argPtrs_generic = []bool{true} - localPtrs_generic = []bool{} -) - -func newStack() *_Stack { - if ret := stackPool.Get(); ret == nil { - return new(_Stack) - } else { - return ret.(*_Stack) - } -} - -func resetStack(p *_Stack) { - memclrNoHeapPointers(unsafe.Pointer(p), _StackSize) -} - -func freeStack(p *_Stack) { - p.sp = 0 - stackPool.Put(p) -} - -func freezeValue(v unsafe.Pointer) uintptr { - valueCache = append(valueCache, v) - return uintptr(v) -} - -func freezeFields(v *caching.FieldMap) int64 { - fieldCacheMux.Lock() - fieldCache = append(fieldCache, v) - fieldCacheMux.Unlock() - return referenceFields(v) -} - -func referenceFields(v *caching.FieldMap) int64 { - return int64(uintptr(unsafe.Pointer(v))) -} - -func makeDecoder(vt *rt.GoType, _ ...interface{}) (interface{}, error) { - if pp, err := newCompiler().compile(vt.Pack()); err != nil { - return nil, err - } else { - return newAssembler(pp).Load(), nil - } -} - -func findOrCompile(vt *rt.GoType) (_Decoder, error) { - if val := programCache.Get(vt); val != nil { - return val.(_Decoder), nil - } else if ret, err := programCache.Compute(vt, makeDecoder); err == nil { - return ret.(_Decoder), nil - } else { - return nil, err - } -} diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/primitives.go b/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/primitives.go deleted file mode 100644 index 9de885007..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/primitives.go +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package jitdec - -import ( - `encoding` - `encoding/json` - `unsafe` - - `github.com/bytedance/sonic/internal/native` - `github.com/bytedance/sonic/internal/rt` -) - -func decodeTypedPointer(s string, i int, vt *rt.GoType, vp unsafe.Pointer, sb *_Stack, fv uint64) (int, error) { - if fn, err := findOrCompile(vt); err != nil { - return 0, err - } else { - rt.MoreStack(_FP_size + _VD_size + native.MaxFrameSize) - ret, err := fn(s, i, vp, sb, fv, "", nil) - return ret, err - } -} - -func decodeJsonUnmarshaler(vv interface{}, s string) error { - return vv.(json.Unmarshaler).UnmarshalJSON(rt.Str2Mem(s)) -} - -// used to distinguish between MismatchQuoted and other MismatchedTyped errors, see issue #670 and #716 -type MismatchQuotedError struct {} - -func (*MismatchQuotedError) Error() string { - return "mismatch quoted" -} - -func decodeJsonUnmarshalerQuoted(vv interface{}, s string) error { - if len(s) < 2 || s[0] != '"' || s[len(s)-1] != '"' { - return &MismatchQuotedError{} - } - return vv.(json.Unmarshaler).UnmarshalJSON(rt.Str2Mem(s[1:len(s)-1])) -} - -func decodeTextUnmarshaler(vv interface{}, s string) error { - return vv.(encoding.TextUnmarshaler).UnmarshalText(rt.Str2Mem(s)) -} diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/stubs_go116.go b/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/stubs_go116.go deleted file mode 100644 index 8fa7c32fc..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/stubs_go116.go +++ /dev/null @@ -1,106 +0,0 @@ -// +build go1.17,!go1.20 - -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package jitdec - -import ( - `unsafe` - `reflect` - - _ `github.com/cloudwego/base64x` - - `github.com/bytedance/sonic/internal/rt` -) - -//go:linkname _subr__b64decode github.com/cloudwego/base64x._subr__b64decode -var _subr__b64decode uintptr - -// runtime.maxElementSize -const _max_map_element_size uintptr = 128 - -func mapfast(vt reflect.Type) bool { - return vt.Elem().Size() <= _max_map_element_size -} - -//go:nosplit -//go:linkname throw runtime.throw -//goland:noinspection GoUnusedParameter -func throw(s string) - -//go:linkname convT64 runtime.convT64 -//goland:noinspection GoUnusedParameter -func convT64(v uint64) unsafe.Pointer - -//go:linkname convTslice runtime.convTslice -//goland:noinspection GoUnusedParameter -func convTslice(v []byte) unsafe.Pointer - -//go:linkname convTstring runtime.convTstring -//goland:noinspection GoUnusedParameter -func convTstring(v string) unsafe.Pointer - -//go:noescape -//go:linkname memequal runtime.memequal -//goland:noinspection GoUnusedParameter -func memequal(a unsafe.Pointer, b unsafe.Pointer, size uintptr) bool - -//go:noescape -//go:linkname memmove runtime.memmove -//goland:noinspection GoUnusedParameter -func memmove(to unsafe.Pointer, from unsafe.Pointer, n uintptr) - -//go:linkname mallocgc runtime.mallocgc -//goland:noinspection GoUnusedParameter -func mallocgc(size uintptr, typ *rt.GoType, needzero bool) unsafe.Pointer - -//go:linkname makeslice runtime.makeslice -//goland:noinspection GoUnusedParameter -func makeslice(et *rt.GoType, len int, cap int) unsafe.Pointer - -//go:linkname makemap_small runtime.makemap_small -func makemap_small() unsafe.Pointer - -//go:linkname mapassign runtime.mapassign -//goland:noinspection GoUnusedParameter -func mapassign(t *rt.GoType, h unsafe.Pointer, k unsafe.Pointer) unsafe.Pointer - -//go:linkname mapassign_fast32 runtime.mapassign_fast32 -//goland:noinspection GoUnusedParameter -func mapassign_fast32(t *rt.GoType, h unsafe.Pointer, k uint32) unsafe.Pointer - -//go:linkname mapassign_fast64 runtime.mapassign_fast64 -//goland:noinspection GoUnusedParameter -func mapassign_fast64(t *rt.GoType, h unsafe.Pointer, k uint64) unsafe.Pointer - -//go:linkname mapassign_fast64ptr runtime.mapassign_fast64ptr -//goland:noinspection GoUnusedParameter -func mapassign_fast64ptr(t *rt.GoType, h unsafe.Pointer, k unsafe.Pointer) unsafe.Pointer - -//go:linkname mapassign_faststr runtime.mapassign_faststr -//goland:noinspection GoUnusedParameter -func mapassign_faststr(t *rt.GoType, h unsafe.Pointer, s string) unsafe.Pointer - -//go:nosplit -//go:linkname memclrHasPointers runtime.memclrHasPointers -//goland:noinspection GoUnusedParameter -func memclrHasPointers(ptr unsafe.Pointer, n uintptr) - -//go:noescape -//go:linkname memclrNoHeapPointers runtime.memclrNoHeapPointers -//goland:noinspection GoUnusedParameter -func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr) \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/stubs_go120.go b/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/stubs_go120.go deleted file mode 100644 index a6dad26d7..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/stubs_go120.go +++ /dev/null @@ -1,106 +0,0 @@ -// +build go1.20 - -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package jitdec - -import ( - `unsafe` - `reflect` - - _ `github.com/cloudwego/base64x` - - `github.com/bytedance/sonic/internal/rt` -) - -//go:linkname _subr__b64decode github.com/cloudwego/base64x._subr__b64decode -var _subr__b64decode uintptr - -// runtime.maxElementSize -const _max_map_element_size uintptr = 128 - -func mapfast(vt reflect.Type) bool { - return vt.Elem().Size() <= _max_map_element_size -} - -//go:nosplit -//go:linkname throw runtime.throw -//goland:noinspection GoUnusedParameter -func throw(s string) - -//go:linkname convT64 runtime.convT64 -//goland:noinspection GoUnusedParameter -func convT64(v uint64) unsafe.Pointer - -//go:linkname convTslice runtime.convTslice -//goland:noinspection GoUnusedParameter -func convTslice(v []byte) unsafe.Pointer - -//go:linkname convTstring runtime.convTstring -//goland:noinspection GoUnusedParameter -func convTstring(v string) unsafe.Pointer - -//go:noescape -//go:linkname memequal runtime.memequal -//goland:noinspection GoUnusedParameter -func memequal(a unsafe.Pointer, b unsafe.Pointer, size uintptr) bool - -//go:noescape -//go:linkname memmove runtime.memmove -//goland:noinspection GoUnusedParameter -func memmove(to unsafe.Pointer, from unsafe.Pointer, n uintptr) - -//go:linkname mallocgc runtime.mallocgc -//goland:noinspection GoUnusedParameter -func mallocgc(size uintptr, typ *rt.GoType, needzero bool) unsafe.Pointer - -//go:linkname makeslice runtime.makeslice -//goland:noinspection GoUnusedParameter -func makeslice(et *rt.GoType, len int, cap int) unsafe.Pointer - -//go:linkname makemap_small runtime.makemap_small -func makemap_small() unsafe.Pointer - -//go:linkname mapassign runtime.mapassign -//goland:noinspection GoUnusedParameter -func mapassign(t *rt.GoMapType, h unsafe.Pointer, k unsafe.Pointer) unsafe.Pointer - -//go:linkname mapassign_fast32 runtime.mapassign_fast32 -//goland:noinspection GoUnusedParameter -func mapassign_fast32(t *rt.GoMapType, h unsafe.Pointer, k uint32) unsafe.Pointer - -//go:linkname mapassign_fast64 runtime.mapassign_fast64 -//goland:noinspection GoUnusedParameter -func mapassign_fast64(t *rt.GoMapType, h unsafe.Pointer, k uint64) unsafe.Pointer - -//go:linkname mapassign_fast64ptr runtime.mapassign_fast64ptr -//goland:noinspection GoUnusedParameter -func mapassign_fast64ptr(t *rt.GoMapType, h unsafe.Pointer, k unsafe.Pointer) unsafe.Pointer - -//go:linkname mapassign_faststr runtime.mapassign_faststr -//goland:noinspection GoUnusedParameter -func mapassign_faststr(t *rt.GoMapType, h unsafe.Pointer, s string) unsafe.Pointer - -//go:nosplit -//go:linkname memclrHasPointers runtime.memclrHasPointers -//goland:noinspection GoUnusedParameter -func memclrHasPointers(ptr unsafe.Pointer, n uintptr) - -//go:noescape -//go:linkname memclrNoHeapPointers runtime.memclrNoHeapPointers -//goland:noinspection GoUnusedParameter -func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr) diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/types.go b/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/types.go deleted file mode 100644 index c196eb5b7..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/types.go +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package jitdec - -import ( - `encoding` - `encoding/base64` - `encoding/json` - `reflect` - `unsafe` - - `github.com/bytedance/sonic/internal/rt` -) - -var ( - byteType = reflect.TypeOf(byte(0)) - intType = reflect.TypeOf(int(0)) - int8Type = reflect.TypeOf(int8(0)) - int16Type = reflect.TypeOf(int16(0)) - int32Type = reflect.TypeOf(int32(0)) - int64Type = reflect.TypeOf(int64(0)) - uintType = reflect.TypeOf(uint(0)) - uint8Type = reflect.TypeOf(uint8(0)) - uint16Type = reflect.TypeOf(uint16(0)) - uint32Type = reflect.TypeOf(uint32(0)) - uint64Type = reflect.TypeOf(uint64(0)) - float32Type = reflect.TypeOf(float32(0)) - float64Type = reflect.TypeOf(float64(0)) - stringType = reflect.TypeOf("") - bytesType = reflect.TypeOf([]byte(nil)) - jsonNumberType = reflect.TypeOf(json.Number("")) - base64CorruptInputError = reflect.TypeOf(base64.CorruptInputError(0)) -) - -var ( - errorType = reflect.TypeOf((*error)(nil)).Elem() - jsonUnmarshalerType = reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() - encodingTextUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem() -) - -func rtype(t reflect.Type) (*rt.GoItab, *rt.GoType) { - p := (*rt.GoIface)(unsafe.Pointer(&t)) - return p.Itab, (*rt.GoType)(p.Value) -} diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/utils.go b/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/utils.go deleted file mode 100644 index 0a7a20289..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/jitdec/utils.go +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package jitdec - -import ( - `unsafe` - - `github.com/bytedance/sonic/loader` -) - -//go:nosplit -func pbool(v bool) uintptr { - return freezeValue(unsafe.Pointer(&v)) -} - -//go:nosplit -func ptodec(p loader.Function) _Decoder { - return *(*_Decoder)(unsafe.Pointer(&p)) -} - -func assert_eq(v int64, exp int64, msg string) { - if v != exp { - panic(msg) - } -} diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/compile_struct.go b/vendor/github.com/bytedance/sonic/internal/decoder/optdec/compile_struct.go deleted file mode 100644 index 713fb6561..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/compile_struct.go +++ /dev/null @@ -1,174 +0,0 @@ -package optdec - -import ( - "fmt" - "reflect" - - caching "github.com/bytedance/sonic/internal/optcaching" - "github.com/bytedance/sonic/internal/rt" - "github.com/bytedance/sonic/internal/resolver" -) - -const ( - _MAX_FIELDS = 50 // cutoff at 50 fields struct -) - -func (c *compiler) compileIntStringOption(vt reflect.Type) decFunc { - switch vt.Size() { - case 4: - switch vt.Kind() { - case reflect.Uint: - fallthrough - case reflect.Uintptr: - return &u32StringDecoder{} - case reflect.Int: - return &i32StringDecoder{} - } - case 8: - switch vt.Kind() { - case reflect.Uint: - fallthrough - case reflect.Uintptr: - return &u64StringDecoder{} - case reflect.Int: - return &i64StringDecoder{} - } - default: - panic("not supported pointer size: " + fmt.Sprint(vt.Size())) - } - panic("unreachable") -} - -func isInteger(vt reflect.Type) bool { - switch vt.Kind() { - case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint, reflect.Uintptr, reflect.Int: return true - default: return false - } -} - -func (c *compiler) assertStringOptTypes(vt reflect.Type) { - if c.depth > _CompileMaxDepth { - panic(*stackOverflow) - } - - c.depth += 1 - defer func () { - c.depth -= 1 - }() - - if isInteger(vt) { - return - } - - switch vt.Kind() { - case reflect.String, reflect.Bool, reflect.Float32, reflect.Float64: - return - case reflect.Ptr: c.assertStringOptTypes(vt.Elem()) - default: - panicForInvalidStrType(vt) - } -} - -func (c *compiler) compileFieldStringOption(vt reflect.Type) decFunc { - c.assertStringOptTypes(vt) - unmDec := c.tryCompilePtrUnmarshaler(vt, true) - if unmDec != nil { - return unmDec - } - - switch vt.Kind() { - case reflect.String: - if vt == jsonNumberType { - return &numberStringDecoder{} - } - return &strStringDecoder{} - case reflect.Bool: - return &boolStringDecoder{} - case reflect.Int8: - return &i8StringDecoder{} - case reflect.Int16: - return &i16StringDecoder{} - case reflect.Int32: - return &i32StringDecoder{} - case reflect.Int64: - return &i64StringDecoder{} - case reflect.Uint8: - return &u8StringDecoder{} - case reflect.Uint16: - return &u16StringDecoder{} - case reflect.Uint32: - return &u32StringDecoder{} - case reflect.Uint64: - return &u64StringDecoder{} - case reflect.Float32: - return &f32StringDecoder{} - case reflect.Float64: - return &f64StringDecoder{} - case reflect.Uint: - fallthrough - case reflect.Uintptr: - fallthrough - case reflect.Int: - return c.compileIntStringOption(vt) - case reflect.Ptr: - return &ptrStrDecoder{ - typ: rt.UnpackType(vt.Elem()), - deref: c.compileFieldStringOption(vt.Elem()), - } - default: - panicForInvalidStrType(vt) - return nil - } -} - -func (c *compiler) compileStruct(vt reflect.Type) decFunc { - c.enter(vt) - defer c.exit(vt) - if c.namedPtr { - c.namedPtr = false - return c.compileStructBody(vt) - } - - if c.depth >= c.opts.MaxInlineDepth + 1 || (c.counts > 0 && vt.NumField() >= _MAX_FIELDS) { - return &recuriveDecoder{ - typ: rt.UnpackType(vt), - } - } else { - return c.compileStructBody(vt) - } -} - -func (c *compiler) compileStructBody(vt reflect.Type) decFunc { - fv := resolver.ResolveStruct(vt) - entries := make([]fieldEntry, 0, len(fv)) - - for _, f := range fv { - var dec decFunc - /* dealt with field tag options */ - if f.Opts&resolver.F_stringize != 0 { - dec = c.compileFieldStringOption(f.Type) - } else { - dec = c.compile(f.Type) - } - - /* deal with embedded pointer fields */ - if f.Path[0].Kind == resolver.F_deref { - dec = &embeddedFieldPtrDecoder{ - field: f, - fieldDec: dec, - fieldName: f.Name, - } - } - - entries = append(entries, fieldEntry{ - FieldMeta: f, - fieldDec: dec, - }) - } - return &structDecoder{ - fieldMap: caching.NewFieldLookup(fv), - fields: entries, - structName: vt.Name(), - typ: vt, - } -} diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/compiler.go b/vendor/github.com/bytedance/sonic/internal/decoder/optdec/compiler.go deleted file mode 100644 index 7d9d60a01..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/compiler.go +++ /dev/null @@ -1,449 +0,0 @@ -package optdec - -import ( - "encoding/json" - "fmt" - "reflect" - - "github.com/bytedance/sonic/option" - "github.com/bytedance/sonic/internal/rt" - "github.com/bytedance/sonic/internal/caching" -) - -var ( - programCache = caching.CreateProgramCache() -) - -func findOrCompile(vt *rt.GoType) (decFunc, error) { - makeDecoder := func(vt *rt.GoType, _ ...interface{}) (interface{}, error) { - ret, err := newCompiler().compileType(vt.Pack()) - return ret, err - } - if val := programCache.Get(vt); val != nil { - return val.(decFunc), nil - } else if ret, err := programCache.Compute(vt, makeDecoder); err == nil { - return ret.(decFunc), nil - } else { - return nil, err - } -} - -type compiler struct { - visited map[reflect.Type]bool - depth int - counts int - opts option.CompileOptions - namedPtr bool -} - -func newCompiler() *compiler { - return &compiler{ - visited: make(map[reflect.Type]bool), - opts: option.DefaultCompileOptions(), - } -} - -func (self *compiler) apply(opts option.CompileOptions) *compiler { - self.opts = opts - return self -} - -const _CompileMaxDepth = 4096 - -func (c *compiler) enter(vt reflect.Type) { - c.visited[vt] = true - c.depth += 1 - - if c.depth > _CompileMaxDepth { - panic(*stackOverflow) - } -} - -func (c *compiler) exit(vt reflect.Type) { - c.visited[vt] = false - c.depth -= 1 -} - -func (c *compiler) compileInt(vt reflect.Type) decFunc { - switch vt.Size() { - case 4: - switch vt.Kind() { - case reflect.Uint: - fallthrough - case reflect.Uintptr: - return &u32Decoder{} - case reflect.Int: - return &i32Decoder{} - } - case 8: - switch vt.Kind() { - case reflect.Uint: - fallthrough - case reflect.Uintptr: - return &u64Decoder{} - case reflect.Int: - return &i64Decoder{} - } - default: - panic("not supported pointer size: " + fmt.Sprint(vt.Size())) - } - panic("unreachable") -} - -func (c *compiler) rescue(ep *error) { - if val := recover(); val != nil { - if err, ok := val.(error); ok { - *ep = err - } else { - panic(val) - } - } -} - -func (c *compiler) compileType(vt reflect.Type) (rt decFunc, err error) { - defer c.rescue(&err) - rt = c.compile(vt) - return rt, err -} - -func (c *compiler) compile(vt reflect.Type) decFunc { - if c.visited[vt] { - return &recuriveDecoder{ - typ: rt.UnpackType(vt), - } - } - - dec := c.tryCompilePtrUnmarshaler(vt, false) - if dec != nil { - return dec - } - - return c.compileBasic(vt) -} - -func (c *compiler) compileBasic(vt reflect.Type) decFunc { - defer func() { - c.counts += 1 - }() - switch vt.Kind() { - case reflect.Bool: - return &boolDecoder{} - case reflect.Int8: - return &i8Decoder{} - case reflect.Int16: - return &i16Decoder{} - case reflect.Int32: - return &i32Decoder{} - case reflect.Int64: - return &i64Decoder{} - case reflect.Uint8: - return &u8Decoder{} - case reflect.Uint16: - return &u16Decoder{} - case reflect.Uint32: - return &u32Decoder{} - case reflect.Uint64: - return &u64Decoder{} - case reflect.Float32: - return &f32Decoder{} - case reflect.Float64: - return &f64Decoder{} - case reflect.Uint: - fallthrough - case reflect.Uintptr: - fallthrough - case reflect.Int: - return c.compileInt(vt) - case reflect.String: - return c.compileString(vt) - case reflect.Array: - return c.compileArray(vt) - case reflect.Interface: - return c.compileInterface(vt) - case reflect.Map: - return c.compileMap(vt) - case reflect.Ptr: - return c.compilePtr(vt) - case reflect.Slice: - return c.compileSlice(vt) - case reflect.Struct: - return c.compileStruct(vt) - default: - panic(&json.UnmarshalTypeError{Type: vt}) - } -} - -func (c *compiler) compilePtr(vt reflect.Type) decFunc { - c.enter(vt) - defer c.exit(vt) - - // special logic for Named Ptr, issue 379 - if reflect.PtrTo(vt.Elem()) != vt { - c.namedPtr = true - return &ptrDecoder{ - typ: rt.UnpackType(vt.Elem()), - deref: c.compileBasic(vt.Elem()), - } - } - - return &ptrDecoder{ - typ: rt.UnpackType(vt.Elem()), - deref: c.compile(vt.Elem()), - } -} - -func (c *compiler) compileArray(vt reflect.Type) decFunc { - c.enter(vt) - defer c.exit(vt) - return &arrayDecoder{ - len: vt.Len(), - elemType: rt.UnpackType(vt.Elem()), - elemDec: c.compile(vt.Elem()), - typ: vt, - } -} - -func (c *compiler) compileString(vt reflect.Type) decFunc { - if vt == jsonNumberType { - return &numberDecoder{} - } - return &stringDecoder{} - -} - -func (c *compiler) tryCompileSliceUnmarshaler(vt reflect.Type) decFunc { - pt := reflect.PtrTo(vt.Elem()) - if pt.Implements(jsonUnmarshalerType) { - return &sliceDecoder{ - elemType: rt.UnpackType(vt.Elem()), - elemDec: c.compile(vt.Elem()), - typ: vt, - } - } - - if pt.Implements(encodingTextUnmarshalerType) { - return &sliceDecoder{ - elemType: rt.UnpackType(vt.Elem()), - elemDec: c.compile(vt.Elem()), - typ: vt, - } - } - return nil -} - -func (c *compiler) compileSlice(vt reflect.Type) decFunc { - c.enter(vt) - defer c.exit(vt) - - // Some common slice, use a decoder, to avoid function calls - et := rt.UnpackType(vt.Elem()) - - /* first checking `[]byte` */ - if et.Kind() == reflect.Uint8 /* []byte */ { - return c.compileSliceBytes(vt) - } - - dec := c.tryCompileSliceUnmarshaler(vt) - if dec != nil { - return dec - } - - if vt == reflect.TypeOf([]interface{}{}) { - return &sliceEfaceDecoder{} - } - if et.IsInt32() { - return &sliceI32Decoder{} - } - if et.IsInt64() { - return &sliceI64Decoder{} - } - if et.IsUint32() { - return &sliceU32Decoder{} - } - if et.IsUint64() { - return &sliceU64Decoder{} - } - if et.Kind() == reflect.String { - return &sliceStringDecoder{} - } - - return &sliceDecoder{ - elemType: rt.UnpackType(vt.Elem()), - elemDec: c.compile(vt.Elem()), - typ: vt, - } -} - -func (c *compiler) compileSliceBytes(vt reflect.Type) decFunc { - ep := reflect.PtrTo(vt.Elem()) - - if ep.Implements(jsonUnmarshalerType) { - return &sliceBytesUnmarshalerDecoder{ - elemType: rt.UnpackType(vt.Elem()), - elemDec: c.compile(vt.Elem()), - typ: vt, - } - } - - if ep.Implements(encodingTextUnmarshalerType) { - return &sliceBytesUnmarshalerDecoder{ - elemType: rt.UnpackType(vt.Elem()), - elemDec: c.compile(vt.Elem()), - typ: vt, - } - } - - return &sliceBytesDecoder{} -} - -func (c *compiler) compileInterface(vt reflect.Type) decFunc { - c.enter(vt) - defer c.exit(vt) - if vt.NumMethod() == 0 { - return &efaceDecoder{} - } - - if vt.Implements(jsonUnmarshalerType) { - return &unmarshalJSONDecoder{ - typ: rt.UnpackType(vt), - } - } - - if vt.Implements(encodingTextUnmarshalerType) { - return &unmarshalTextDecoder{ - typ: rt.UnpackType(vt), - } - } - - return &ifaceDecoder{ - typ: rt.UnpackType(vt), - } -} - -func (c *compiler) compileMap(vt reflect.Type) decFunc { - c.enter(vt) - defer c.exit(vt) - // check the key unmarshaler at first - decKey := tryCompileKeyUnmarshaler(vt) - if decKey != nil { - return &mapDecoder{ - mapType: rt.MapType(rt.UnpackType(vt)), - keyDec: decKey, - elemDec: c.compile(vt.Elem()), - } - } - - // Most common map, use a decoder, to avoid function calls - if vt == reflect.TypeOf(map[string]interface{}{}) { - return &mapEfaceDecoder{} - } else if vt == reflect.TypeOf(map[string]string{}) { - return &mapStringDecoder{} - } - - // Some common integer map later - mt := rt.MapType(rt.UnpackType(vt)) - - if mt.Key.Kind() == reflect.String { - return &mapStrKeyDecoder{ - mapType: mt, - assign: rt.GetMapStrAssign(vt), - elemDec: c.compile(vt.Elem()), - } - } - - if mt.Key.IsInt64() { - return &mapI64KeyDecoder{ - mapType: mt, - elemDec: c.compile(vt.Elem()), - assign: rt.GetMap64Assign(vt), - } - } - - if mt.Key.IsInt32() { - return &mapI32KeyDecoder{ - mapType: mt, - elemDec: c.compile(vt.Elem()), - assign: rt.GetMap32Assign(vt), - } - } - - if mt.Key.IsUint64() { - return &mapU64KeyDecoder{ - mapType: mt, - elemDec: c.compile(vt.Elem()), - assign: rt.GetMap64Assign(vt), - } - } - - if mt.Key.IsUint32() { - return &mapU32KeyDecoder{ - mapType: mt, - elemDec: c.compile(vt.Elem()), - assign: rt.GetMap32Assign(vt), - } - } - - // Generic map - return &mapDecoder{ - mapType: mt, - keyDec: c.compileMapKey(vt), - elemDec: c.compile(vt.Elem()), - } -} - -func tryCompileKeyUnmarshaler(vt reflect.Type) decKey { - pt := reflect.PtrTo(vt.Key()) - - /* check for `encoding.TextUnmarshaler` with pointer receiver */ - if pt.Implements(encodingTextUnmarshalerType) { - return decodeKeyTextUnmarshaler - } - - /* not support map key with `json.Unmarshaler` */ - return nil -} - -func (c *compiler) compileMapKey(vt reflect.Type) decKey { - switch vt.Key().Kind() { - case reflect.Int8: - return decodeKeyI8 - case reflect.Int16: - return decodeKeyI16 - case reflect.Uint8: - return decodeKeyU8 - case reflect.Uint16: - return decodeKeyU16 - default: - panic(&json.UnmarshalTypeError{Type: vt}) - } -} - -// maybe vt is a named type, and not a pointer receiver, see issue 379 -func (c *compiler) tryCompilePtrUnmarshaler(vt reflect.Type, strOpt bool) decFunc { - pt := reflect.PtrTo(vt) - - /* check for `json.Unmarshaler` with pointer receiver */ - if pt.Implements(jsonUnmarshalerType) { - return &unmarshalJSONDecoder{ - typ: rt.UnpackType(pt), - strOpt: strOpt, - } - } - - /* check for `encoding.TextMarshaler` with pointer receiver */ - if pt.Implements(encodingTextUnmarshalerType) { - /* TextUnmarshal not support, string tag */ - if strOpt { - panicForInvalidStrType(vt) - } - return &unmarshalTextDecoder{ - typ: rt.UnpackType(pt), - } - } - - return nil -} - -func panicForInvalidStrType(vt reflect.Type) { - panic(error_type(rt.UnpackType(vt))) -} diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/const.go b/vendor/github.com/bytedance/sonic/internal/decoder/optdec/const.go deleted file mode 100644 index 77879fafe..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/const.go +++ /dev/null @@ -1,60 +0,0 @@ -package optdec - -import "math" - -/* -Copied from sonic-rs -// JSON Value Type -const NULL: u64 = 0; -const BOOL: u64 = 2; -const FALSE: u64 = BOOL; -const TRUE: u64 = (1 << 3) | BOOL; -const NUMBER: u64 = 3; -const UINT: u64 = NUMBER; -const SINT: u64 = (1 << 3) | NUMBER; -const REAL: u64 = (2 << 3) | NUMBER; -const RAWNUMBER: u64 = (3 << 3) | NUMBER; -const STRING: u64 = 4; -const STRING_COMMON: u64 = STRING; -const STRING_HASESCAPED: u64 = (1 << 3) | STRING; -const OBJECT: u64 = 6; -const ARRAY: u64 = 7; - -/// JSON Type Mask -const POS_MASK: u64 = (!0) << 32; -const POS_BITS: u64 = 32; -const TYPE_MASK: u64 = 0xFF; -const TYPE_BITS: u64 = 8; - -*/ - -const ( - // BasicType: 3 bits - KNull = 0 // xxxxx000 - KBool = 2 // xxxxx010 - KNumber = 3 // xxxxx011 - KString = 4 // xxxxx100 - KRaw = 5 // xxxxx101 - KObject = 6 // xxxxx110 - KArray = 7 // xxxxx111 - - // SubType: 2 bits - KFalse = (0 << 3) | KBool // xxx00_010, 2 - KTrue = (1 << 3) | KBool // xxx01_010, 10 - KUint = (0 << 3) | KNumber // xxx00_011, 3 - KSint = (1 << 3) | KNumber // xxx01_011, 11 - KReal = (2 << 3) | KNumber // xxx10_011, 19 - KRawNumber = (3 << 3) | KNumber // xxx11_011, 27 - KStringCommon = KString // xxx00_100, 4 - KStringEscaped = (1 << 3) | KString // xxx01_100, 12 -) - -const ( - PosMask = math.MaxUint64 << 32 - PosBits = 32 - TypeMask = 0xFF - TypeBits = 8 - - ConLenMask = uint64(math.MaxUint32) - ConLenBits = 32 -) diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/context.go b/vendor/github.com/bytedance/sonic/internal/decoder/optdec/context.go deleted file mode 100644 index 93ed9b7e0..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/context.go +++ /dev/null @@ -1,3 +0,0 @@ -package optdec - -type context = Context diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/decoder.go b/vendor/github.com/bytedance/sonic/internal/decoder/optdec/decoder.go deleted file mode 100644 index 81eed34ea..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/decoder.go +++ /dev/null @@ -1,160 +0,0 @@ -package optdec - -import ( - "reflect" - "unsafe" - - "encoding/json" - "github.com/bytedance/sonic/internal/rt" - "github.com/bytedance/sonic/option" - "github.com/bytedance/sonic/internal/decoder/errors" - "github.com/bytedance/sonic/internal/decoder/consts" -) - - -type ( - MismatchTypeError = errors.MismatchTypeError - SyntaxError = errors.SyntaxError -) - -const ( - _F_allow_control = consts.F_allow_control - _F_copy_string = consts.F_copy_string - _F_disable_unknown = consts.F_disable_unknown - _F_disable_urc = consts.F_disable_urc - _F_use_int64 = consts.F_use_int64 - _F_use_number = consts.F_use_number - _F_validate_string = consts.F_validate_string -) - -type Options = consts.Options - -const ( - OptionUseInt64 = consts.OptionUseInt64 - OptionUseNumber = consts.OptionUseNumber - OptionUseUnicodeErrors = consts.OptionUseUnicodeErrors - OptionDisableUnknown = consts.OptionDisableUnknown - OptionCopyString = consts.OptionCopyString - OptionValidateString = consts.OptionValidateString -) - - -func Decode(s *string, i *int, f uint64, val interface{}) error { - vv := rt.UnpackEface(val) - vp := vv.Value - - /* check for nil type */ - if vv.Type == nil { - return &json.InvalidUnmarshalError{} - } - - /* must be a non-nil pointer */ - if vp == nil || vv.Type.Kind() != reflect.Ptr { - return &json.InvalidUnmarshalError{Type: vv.Type.Pack()} - } - - etp := rt.PtrElem(vv.Type) - - /* check the defined pointer type for issue 379 */ - if vv.Type.IsNamed() { - newp := vp - etp = vv.Type - vp = unsafe.Pointer(&newp) - } - - dec, err := findOrCompile(etp) - if err != nil { - return err - } - - /* parse into document */ - ctx, err := NewContext(*s, *i, uint64(f), etp) - defer ctx.Delete() - if ctx.Parser.Utf8Inv { - *s = ctx.Parser.Json - } - if err != nil { - goto fix_error; - } - err = dec.FromDom(vp, ctx.Root(), &ctx) - -fix_error: - err = fix_error(*s, *i, err) - - // update position at last - *i += ctx.Parser.Pos() - return err -} - -func fix_error(json string, pos int, err error) error { - if e, ok := err.(SyntaxError); ok { - return SyntaxError{ - Pos: int(e.Pos) + pos, - Src: json, - Msg: e.Msg, - } - } - - if e, ok := err.(MismatchTypeError); ok { - return &MismatchTypeError { - Pos: int(e.Pos) + pos, - Src: json, - Type: e.Type, - } - } - - return err -} - -// Pretouch compiles vt ahead-of-time to avoid JIT compilation on-the-fly, in -// order to reduce the first-hit latency. -// -// Opts are the compile options, for example, "option.WithCompileRecursiveDepth" is -// a compile option to set the depth of recursive compile for the nested struct type. -func Pretouch(vt reflect.Type, opts ...option.CompileOption) error { - cfg := option.DefaultCompileOptions() - for _, opt := range opts { - opt(&cfg) - } - return pretouchRec(map[reflect.Type]bool{vt:true}, cfg) -} - -func pretouchType(_vt reflect.Type, opts option.CompileOptions) (map[reflect.Type]bool, error) { - /* compile function */ - compiler := newCompiler().apply(opts) - decoder := func(vt *rt.GoType, _ ...interface{}) (interface{}, error) { - if f, err := compiler.compileType(_vt); err != nil { - return nil, err - } else { - return f, nil - } - } - - /* find or compile */ - vt := rt.UnpackType(_vt) - if val := programCache.Get(vt); val != nil { - return nil, nil - } else if _, err := programCache.Compute(vt, decoder); err == nil { - return compiler.visited, nil - } else { - return nil, err - } -} - -func pretouchRec(vtm map[reflect.Type]bool, opts option.CompileOptions) error { - if opts.RecursiveDepth < 0 || len(vtm) == 0 { - return nil - } - next := make(map[reflect.Type]bool) - for vt := range(vtm) { - sub, err := pretouchType(vt, opts) - if err != nil { - return err - } - for svt := range(sub) { - next[svt] = true - } - } - opts.RecursiveDepth -= 1 - return pretouchRec(next, opts) -} diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/errors.go b/vendor/github.com/bytedance/sonic/internal/decoder/optdec/errors.go deleted file mode 100644 index db0af547b..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/errors.go +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - package optdec - - import ( - "encoding/json" - "errors" - "reflect" - "strconv" - - "github.com/bytedance/sonic/internal/rt" - ) - - /** JIT Error Helpers **/ - - var stackOverflow = &json.UnsupportedValueError{ - Str: "Value nesting too deep", - Value: reflect.ValueOf("..."), - } - - func error_type(vt *rt.GoType) error { - return &json.UnmarshalTypeError{Type: vt.Pack()} - } - - func error_mismatch(node Node, ctx *context, typ reflect.Type) error { - return MismatchTypeError{ - Pos: node.Position(), - Src: ctx.Parser.Json, - Type: typ, - } - } - - func newUnmatched(pos int, vt *rt.GoType) error { - return MismatchTypeError{ - Pos: pos, - Src: "", - Type: vt.Pack(), - } - } - - func error_field(name string) error { - return errors.New("json: unknown field " + strconv.Quote(name)) - } - - func error_value(value string, vtype reflect.Type) error { - return &json.UnmarshalTypeError{ - Type: vtype, - Value: value, - } - } - - func error_syntax(pos int, src string, msg string) error { - return SyntaxError{ - Pos: pos, - Src: src, - Msg: msg, - } - } - \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/functor.go b/vendor/github.com/bytedance/sonic/internal/decoder/optdec/functor.go deleted file mode 100644 index 2a0523d5e..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/functor.go +++ /dev/null @@ -1,281 +0,0 @@ -package optdec - -import ( - "encoding/json" - "math" - "unsafe" - - "github.com/bytedance/sonic/internal/rt" - "github.com/bytedance/sonic/internal/resolver" -) - -type decFunc interface { - FromDom(vp unsafe.Pointer, node Node, ctx *context) error -} - -type ptrDecoder struct { - typ *rt.GoType - deref decFunc -} - -// Pointer Value is allocated in the Caller -func (d *ptrDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - *(*unsafe.Pointer)(vp) = nil - return nil - } - - if *(*unsafe.Pointer)(vp) == nil { - *(*unsafe.Pointer)(vp) = rt.Mallocgc(d.typ.Size, d.typ, true) - } - - return d.deref.FromDom(*(*unsafe.Pointer)(vp), node, ctx) -} - -type embeddedFieldPtrDecoder struct { - field resolver.FieldMeta - fieldDec decFunc - fieldName string -} - -// Pointer Value is allocated in the Caller -func (d *embeddedFieldPtrDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - return nil - } - - // seek into the pointer - vp = unsafe.Pointer(uintptr(vp) - uintptr(d.field.Path[0].Size)) - for _, f := range d.field.Path { - deref := rt.UnpackType(f.Type) - vp = unsafe.Pointer(uintptr(vp) + f.Size) - if f.Kind == resolver.F_deref { - if *(*unsafe.Pointer)(vp) == nil { - *(*unsafe.Pointer)(vp) = rt.Mallocgc(deref.Size, deref, true) - } - vp = *(*unsafe.Pointer)(vp) - } - } - return d.fieldDec.FromDom(vp, node, ctx) -} - -type i8Decoder struct{} - -func (d *i8Decoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - return nil - } - - ret, ok := node.AsI64(ctx) - if !ok || ret > math.MaxInt8 || ret < math.MinInt8 { - return error_mismatch(node, ctx, int8Type) - } - - *(*int8)(vp) = int8(ret) - return nil -} - -type i16Decoder struct{} - -func (d *i16Decoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - return nil - } - - ret, ok := node.AsI64(ctx) - if !ok || ret > math.MaxInt16 || ret < math.MinInt16 { - return error_mismatch(node, ctx, int16Type) - } - - *(*int16)(vp) = int16(ret) - return nil -} - -type i32Decoder struct{} - -func (d *i32Decoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - return nil - } - - ret, ok := node.AsI64(ctx) - if !ok || ret > math.MaxInt32 || ret < math.MinInt32 { - return error_mismatch(node, ctx, int32Type) - } - - *(*int32)(vp) = int32(ret) - return nil -} - -type i64Decoder struct{} - -func (d *i64Decoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - return nil - } - - ret, ok := node.AsI64(ctx) - if !ok { - return error_mismatch(node, ctx, int64Type) - } - - *(*int64)(vp) = int64(ret) - return nil -} - -type u8Decoder struct{} - -func (d *u8Decoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - return nil - } - - ret, ok := node.AsU64(ctx) - if !ok || ret > math.MaxUint8 { - err := error_mismatch(node, ctx, uint8Type) - return err - } - - *(*uint8)(vp) = uint8(ret) - return nil -} - -type u16Decoder struct{} - -func (d *u16Decoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - return nil - } - - ret, ok := node.AsU64(ctx) - if !ok || ret > math.MaxUint16 { - return error_mismatch(node, ctx, uint16Type) - } - *(*uint16)(vp) = uint16(ret) - return nil -} - -type u32Decoder struct{} - -func (d *u32Decoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - return nil - } - - ret, ok := node.AsU64(ctx) - if !ok || ret > math.MaxUint32 { - return error_mismatch(node, ctx, uint32Type) - } - - *(*uint32)(vp) = uint32(ret) - return nil -} - -type u64Decoder struct{} - -func (d *u64Decoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - return nil - } - - ret, ok := node.AsU64(ctx) - if !ok { - return error_mismatch(node, ctx, uint64Type) - } - - *(*uint64)(vp) = uint64(ret) - return nil -} - -type f32Decoder struct{} - -func (d *f32Decoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - return nil - } - - ret, ok := node.AsF64(ctx) - if !ok || ret > math.MaxFloat32 || ret < -math.MaxFloat32 { - return error_mismatch(node, ctx, float32Type) - } - - *(*float32)(vp) = float32(ret) - return nil -} - -type f64Decoder struct{} - -func (d *f64Decoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - return nil - } - - ret, ok := node.AsF64(ctx) - if !ok { - return error_mismatch(node, ctx, float64Type) - } - - *(*float64)(vp) = float64(ret) - return nil -} - -type boolDecoder struct { -} - -func (d *boolDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - return nil - } - - ret, ok := node.AsBool() - if !ok { - return error_mismatch(node, ctx, boolType) - } - - *(*bool)(vp) = bool(ret) - return nil -} - -type stringDecoder struct { -} - -func (d *stringDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - return nil - } - - ret, ok := node.AsStr(ctx) - if !ok { - return error_mismatch(node, ctx, stringType) - } - *(*string)(vp) = ret - return nil -} - -type numberDecoder struct { -} - -func (d *numberDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - return nil - } - - num, ok := node.AsNumber(ctx) - if !ok { - return error_mismatch(node, ctx, jsonNumberType) - } - *(*json.Number)(vp) = num - return nil -} - -type recuriveDecoder struct { - typ *rt.GoType -} - -func (d *recuriveDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - dec, err := findOrCompile(d.typ) - if err != nil { - return err - } - return dec.FromDom(vp, node, ctx) -} diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/helper.go b/vendor/github.com/bytedance/sonic/internal/decoder/optdec/helper.go deleted file mode 100644 index 61faa6c80..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/helper.go +++ /dev/null @@ -1,110 +0,0 @@ -package optdec - -import ( - "encoding/json" - "strconv" - - "github.com/bytedance/sonic/internal/native" - "github.com/bytedance/sonic/internal/utils" - "github.com/bytedance/sonic/internal/native/types" -) - - -func SkipNumberFast(json string, start int) (int, bool) { - // find the number ending, we parsed in native, it always valid - pos := start - for pos < len(json) && json[pos] != ']' && json[pos] != '}' && json[pos] != ',' { - if json[pos] >= '0' && json[pos] <= '9' || json[pos] == '.' || json[pos] == '-' || json[pos] == '+' || json[pos] == 'e' || json[pos] == 'E' { - pos += 1 - } else { - break - } - } - - // if not found number, return false - if pos == start { - return pos, false - } - return pos, true -} - - -func isSpace(c byte) bool { - return c == ' ' || c == '\t' || c == '\n' || c == '\r' -} - -// pos is the start index of the raw -func ValidNumberFast(raw string) bool { - ret := utils.SkipNumber(raw, 0) - if ret < 0 { - return false - } - - // check trailing chars - for ret < len(raw) { - return false - } - - return true -} - -func SkipOneFast2(json string, pos *int) (int, error) { - // find the number ending, we parsed in sonic-cpp, it always valid - start := native.SkipOneFast(&json, pos) - if start < 0 { - return -1, error_syntax(*pos, json, types.ParsingError(-start).Error()) - } - return start, nil -} - -func SkipOneFast(json string, pos int) (string, error) { - // find the number ending, we parsed in sonic-cpp, it always valid - start := native.SkipOneFast(&json, &pos) - if start < 0 { - // TODO: details error code - return "", error_syntax(pos, json, types.ParsingError(-start).Error()) - } - return json[start:pos], nil -} - -func ParseI64(raw string) (int64, error) { - i64, err := strconv.ParseInt(raw, 10, 64) - if err != nil { - return 0, err - } - return i64, nil -} - -func ParseBool(raw string) (bool, error) { - var b bool - err := json.Unmarshal([]byte(raw), &b) - if err != nil { - return false, err - } - return b, nil -} - -func ParseU64(raw string) (uint64, error) { - u64, err := strconv.ParseUint(raw, 10, 64) - if err != nil { - return 0, err - } - return u64, nil -} - -func ParseF64(raw string) (float64, error) { - f64, err := strconv.ParseFloat(raw, 64) - if err != nil { - return 0, err - } - return f64, nil -} - -func Unquote(raw string) (string, error) { - var u string - err := json.Unmarshal([]byte(raw), &u) - if err != nil { - return "", err - } - return u, nil -} diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/interface.go b/vendor/github.com/bytedance/sonic/internal/decoder/optdec/interface.go deleted file mode 100644 index 0c063d55f..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/interface.go +++ /dev/null @@ -1,169 +0,0 @@ -package optdec - -import ( - "encoding" - "encoding/json" - "unsafe" - "reflect" - - "github.com/bytedance/sonic/internal/rt" -) - -type efaceDecoder struct { -} - -func (d *efaceDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - *(*interface{})(vp) = interface{}(nil) - return nil - } - - eface := *(*rt.GoEface)(vp) - - // not pointer type, or nil pointer, or *interface{} - if eface.Value == nil || eface.Type.Kind() != reflect.Ptr || rt.PtrElem(eface.Type) == anyType { - ret, err := node.AsEface(ctx) - if err != nil { - return err - } - - *(*interface{})(vp) = ret - return nil - } - - etp := rt.PtrElem(eface.Type) - vp = eface.Value - - /* check the defined pointer type for issue 379 */ - if eface.Type.IsNamed() { - newp := vp - etp = eface.Type - vp = unsafe.Pointer(&newp) - } - - dec, err := findOrCompile(etp) - if err != nil { - return err - } - - return dec.FromDom(vp, node, ctx) -} - -type ifaceDecoder struct { - typ *rt.GoType -} - -func (d *ifaceDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - *(*unsafe.Pointer)(vp) = nil - return nil - } - - iface := *(*rt.GoIface)(vp) - if iface.Itab == nil { - return error_type(d.typ) - } - - vt := iface.Itab.Vt - - // not pointer type, or nil pointer, or *interface{} - if vp == nil || vt.Kind() != reflect.Ptr || rt.PtrElem(vt) == anyType { - ret, err := node.AsEface(ctx) - if err != nil { - return err - } - - *(*interface{})(vp) = ret - return nil - } - - - etp := rt.PtrElem(vt) - vp = iface.Value - - /* check the defined pointer type for issue 379 */ - if vt.IsNamed() { - newp := vp - etp = vt - vp = unsafe.Pointer(&newp) - } - - dec, err := findOrCompile(etp) - if err != nil { - return err - } - - return dec.FromDom(vp, node, ctx) -} - -type unmarshalTextDecoder struct { - typ *rt.GoType -} - -func (d *unmarshalTextDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - *(*unsafe.Pointer)(vp) = nil - return nil - } - - txt, ok := node.AsStringText(ctx) - if !ok { - return error_mismatch(node, ctx, d.typ.Pack()) - } - - v := *(*interface{})(unsafe.Pointer(&rt.GoEface{ - Type: d.typ, - Value: vp, - })) - - // fast path - if u, ok := v.(encoding.TextUnmarshaler); ok { - return u.UnmarshalText(txt) - } - - // slow path - rv := reflect.ValueOf(v) - if u, ok := rv.Interface().(encoding.TextUnmarshaler); ok { - return u.UnmarshalText(txt) - } - - return error_type(d.typ) -} - -type unmarshalJSONDecoder struct { - typ *rt.GoType - strOpt bool -} - -func (d *unmarshalJSONDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - v := *(*interface{})(unsafe.Pointer(&rt.GoEface{ - Type: d.typ, - Value: vp, - })) - - var input []byte - if d.strOpt && node.IsNull() { - input = []byte("null") - } else if d.strOpt { - s, ok := node.AsStringText(ctx) - if !ok { - return error_mismatch(node, ctx, d.typ.Pack()) - } - input = s - } else { - input = []byte(node.AsRaw(ctx)) - } - - // fast path - if u, ok := v.(json.Unmarshaler); ok { - return u.UnmarshalJSON((input)) - } - - // slow path - rv := reflect.ValueOf(v) - if u, ok := rv.Interface().(json.Unmarshaler); ok { - return u.UnmarshalJSON(input) - } - - return error_type(d.typ) -} diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/map.go b/vendor/github.com/bytedance/sonic/internal/decoder/optdec/map.go deleted file mode 100644 index 1a2bda8f3..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/map.go +++ /dev/null @@ -1,430 +0,0 @@ -package optdec - -import ( - "encoding" - "encoding/json" - "math" - "reflect" - "unsafe" - - "github.com/bytedance/sonic/internal/rt" -) - -/** Decoder for most common map types: map[string]interface{}, map[string]string **/ - -type mapEfaceDecoder struct { -} - -func (d *mapEfaceDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - *(*map[string]interface{})(vp) = nil - return nil - } - - return node.AsMapEface(ctx, vp) -} - -type mapStringDecoder struct { -} - -func (d *mapStringDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - *(*map[string]string)(vp) = nil - return nil - } - - return node.AsMapString(ctx, vp) -} - -/** Decoder for map with string key **/ - -type mapStrKeyDecoder struct { - mapType *rt.GoMapType - elemDec decFunc - assign rt.MapStrAssign - typ reflect.Type -} - -func (d *mapStrKeyDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - *(*unsafe.Pointer)(vp) = nil - return nil - } - - obj, ok := node.AsObj() - if !ok { - return error_mismatch(node, ctx, d.mapType.Pack()) - } - - // allocate map - m := *(*unsafe.Pointer)(vp) - if m == nil { - m = rt.Makemap(&d.mapType.GoType, obj.Len()) - } - - var gerr error - next := obj.Children() - for i := 0; i < obj.Len(); i++ { - keyn := NewNode(next) - key, _ := keyn.AsStr(ctx) - - valn := NewNode(PtrOffset(next, 1)) - valp := d.assign(d.mapType, m, key) - err := d.elemDec.FromDom(valp, valn, ctx) - if gerr == nil && err != nil { - gerr = err - } - next = valn.Next() - } - - *(*unsafe.Pointer)(vp) = m - return gerr -} - -/** Decoder for map with int32 or int64 key **/ - -type mapI32KeyDecoder struct { - mapType *rt.GoMapType - elemDec decFunc - assign rt.Map32Assign -} - -func (d *mapI32KeyDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - *(*unsafe.Pointer)(vp) = nil - return nil - } - - obj, ok := node.AsObj() - if !ok { - return error_mismatch(node, ctx, d.mapType.Pack()) - } - - // allocate map - m := *(*unsafe.Pointer)(vp) - if m == nil { - m = rt.Makemap(&d.mapType.GoType, obj.Len()) - } - - next := obj.Children() - var gerr error - for i := 0; i < obj.Len(); i++ { - keyn := NewNode(next) - k, ok := keyn.ParseI64(ctx) - if !ok || k > math.MaxInt32 || k < math.MinInt32 { - if gerr == nil { - gerr = error_mismatch(keyn, ctx, d.mapType.Pack()) - } - valn := NewNode(PtrOffset(next, 1)) - next = valn.Next() - continue - } - - key := int32(k) - ku32 := *(*uint32)(unsafe.Pointer(&key)) - valn := NewNode(PtrOffset(next, 1)) - valp := d.assign(d.mapType, m, ku32) - err := d.elemDec.FromDom(valp, valn, ctx) - if gerr == nil && err != nil { - gerr = err - } - - next = valn.Next() - } - - *(*unsafe.Pointer)(vp) = m - return gerr -} - -type mapI64KeyDecoder struct { - mapType *rt.GoMapType - elemDec decFunc - assign rt.Map64Assign -} - -func (d *mapI64KeyDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - *(*unsafe.Pointer)(vp) = nil - return nil - } - - obj, ok := node.AsObj() - if !ok { - return error_mismatch(node, ctx, d.mapType.Pack()) - } - - // allocate map - m := *(*unsafe.Pointer)(vp) - if m == nil { - m = rt.Makemap(&d.mapType.GoType, obj.Len()) - } - - var gerr error - next := obj.Children() - for i := 0; i < obj.Len(); i++ { - keyn := NewNode(next) - key, ok := keyn.ParseI64(ctx) - - if !ok { - if gerr == nil { - gerr = error_mismatch(keyn, ctx, d.mapType.Pack()) - } - valn := NewNode(PtrOffset(next, 1)) - next = valn.Next() - continue - } - - ku64 := *(*uint64)(unsafe.Pointer(&key)) - valn := NewNode(PtrOffset(next, 1)) - valp := d.assign(d.mapType, m, ku64) - err := d.elemDec.FromDom(valp, valn, ctx) - if gerr == nil && err != nil { - gerr = err - } - next = valn.Next() - } - - *(*unsafe.Pointer)(vp) = m - return gerr -} - -/** Decoder for map with unt32 or uint64 key **/ - -type mapU32KeyDecoder struct { - mapType *rt.GoMapType - elemDec decFunc - assign rt.Map32Assign -} - -func (d *mapU32KeyDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - *(*unsafe.Pointer)(vp) = nil - return nil - } - - obj, ok := node.AsObj() - if !ok { - return error_mismatch(node, ctx, d.mapType.Pack()) - } - - // allocate map - m := *(*unsafe.Pointer)(vp) - if m == nil { - m = rt.Makemap(&d.mapType.GoType, obj.Len()) - } - - var gerr error - next := obj.Children() - for i := 0; i < obj.Len(); i++ { - keyn := NewNode(next) - k, ok := keyn.ParseU64(ctx) - if !ok || k > math.MaxUint32 { - if gerr == nil { - gerr = error_mismatch(keyn, ctx, d.mapType.Pack()) - } - valn := NewNode(PtrOffset(next, 1)) - next = valn.Next() - continue - } - - key := uint32(k) - valn := NewNode(PtrOffset(next, 1)) - valp := d.assign(d.mapType, m, key) - err := d.elemDec.FromDom(valp, valn, ctx) - if gerr == nil && err != nil { - gerr = err - } - next = valn.Next() - } - - *(*unsafe.Pointer)(vp) = m - return gerr -} - -type mapU64KeyDecoder struct { - mapType *rt.GoMapType - elemDec decFunc - assign rt.Map64Assign -} - -func (d *mapU64KeyDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - *(*unsafe.Pointer)(vp) = nil - return nil - } - - obj, ok := node.AsObj() - if !ok { - return error_mismatch(node, ctx, d.mapType.Pack()) - } - // allocate map - m := *(*unsafe.Pointer)(vp) - if m == nil { - m = rt.Makemap(&d.mapType.GoType, obj.Len()) - } - - var gerr error - next := obj.Children() - for i := 0; i < obj.Len(); i++ { - keyn := NewNode(next) - key, ok := keyn.ParseU64(ctx) - if !ok { - if gerr == nil { - gerr = error_mismatch(keyn, ctx, d.mapType.Pack()) - } - valn := NewNode(PtrOffset(next, 1)) - next = valn.Next() - continue - } - - valn := NewNode(PtrOffset(next, 1)) - valp := d.assign(d.mapType, m, key) - err := d.elemDec.FromDom(valp, valn, ctx) - if gerr == nil && err != nil { - gerr = err - } - next = valn.Next() - } - - *(*unsafe.Pointer)(vp) = m - return gerr -} - -/** Decoder for generic cases */ - -type decKey func(dec *mapDecoder, raw string, ctx *context) (interface{}, error) - -func decodeKeyU8(dec *mapDecoder, raw string, ctx *context) (interface{}, error) { - key, err := Unquote(raw) - if err != nil { - return nil, err - } - ret, err := ParseU64(key) - if err != nil { - return nil, err - } - if ret > math.MaxUint8 { - return nil, error_value(key, dec.mapType.Key.Pack()) - } - return uint8(ret), nil -} - -func decodeKeyU16(dec *mapDecoder, raw string, ctx *context) (interface{}, error) { - key, err := Unquote(raw) - if err != nil { - return nil, err - } - ret, err := ParseU64(key) - if err != nil { - return nil, err - } - if ret > math.MaxUint16 { - return nil, error_value(key, dec.mapType.Key.Pack()) - } - return uint16(ret), nil -} - -func decodeKeyI8(dec *mapDecoder, raw string, ctx *context) (interface{}, error) { - key, err := Unquote(raw) - if err != nil { - return nil, err - } - ret, err := ParseI64(key) - if err != nil { - return nil, err - } - if ret > math.MaxInt8 || ret < math.MinInt8 { - return nil, error_value(key, dec.mapType.Key.Pack()) - } - return int8(ret), nil -} - -func decodeKeyI16(dec *mapDecoder, raw string, ctx *context) (interface{}, error) { - key, err := Unquote(raw) - if err != nil { - return nil, err - } - ret, err := ParseI64(key) - if err != nil { - return nil, err - } - if ret > math.MaxInt16 || ret < math.MinInt16 { - return nil, error_value(key, dec.mapType.Key.Pack()) - } - return int16(ret), nil -} - -func decodeKeyJSONUnmarshaler(dec *mapDecoder, raw string, _ *context) (interface{}, error) { - ret := reflect.New(dec.mapType.Key.Pack()).Interface() - err := ret.(json.Unmarshaler).UnmarshalJSON([]byte(raw)) - if err != nil { - return nil, err - } - return ret, nil -} - -func decodeKeyTextUnmarshaler(dec *mapDecoder, raw string, ctx *context) (interface{}, error) { - key, err := Unquote(raw) - if err != nil { - return nil, err - } - ret := reflect.New(dec.mapType.Key.Pack()).Interface() - err = ret.(encoding.TextUnmarshaler).UnmarshalText([]byte(key)) - if err != nil { - return nil, err - } - return ret, nil -} - -type mapDecoder struct { - mapType *rt.GoMapType - keyDec decKey - elemDec decFunc -} - -func (d *mapDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - *(*unsafe.Pointer)(vp) = nil - return nil - } - - obj, ok := node.AsObj() - if !ok { - return error_mismatch(node, ctx, d.mapType.Pack()) - } - - // allocate map - m := *(*unsafe.Pointer)(vp) - if m == nil { - m = rt.Makemap(&d.mapType.GoType, obj.Len()) - } - - next := obj.Children() - var gerr error - for i := 0; i < obj.Len(); i++ { - keyn := NewNode(next) - raw := keyn.AsRaw(ctx) - key, err := d.keyDec(d, raw, ctx) - if err != nil { - if gerr == nil { - gerr = error_mismatch(keyn, ctx, d.mapType.Pack()) - } - valn := NewNode(PtrOffset(next, 1)) - next = valn.Next() - continue - } - - valn := NewNode(PtrOffset(next, 1)) - keyp := rt.UnpackEface(key).Value - valp := rt.Mapassign(d.mapType, m, keyp) - err = d.elemDec.FromDom(valp, valn, ctx) - if gerr == nil && err != nil { - gerr = err - } - - next = valn.Next() - } - - *(*unsafe.Pointer)(vp) = m - return gerr -} diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/native.go b/vendor/github.com/bytedance/sonic/internal/decoder/optdec/native.go deleted file mode 100644 index 5dadec0b7..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/native.go +++ /dev/null @@ -1,269 +0,0 @@ -package optdec - -import ( - "fmt" - "reflect" - "unsafe" - - "sync" - - "github.com/bytedance/sonic/internal/native" - "github.com/bytedance/sonic/internal/native/types" - "github.com/bytedance/sonic/internal/rt" - "github.com/bytedance/sonic/utf8" -) - - -type ErrorCode int - -const ( - SONIC_OK = 0; - SONIC_CONTROL_CHAR = 1; - SONIC_INVALID_ESCAPED = 2; - SONIC_INVALID_NUM = 3; - SONIC_FLOAT_INF = 4; - SONIC_EOF = 5; - SONIC_INVALID_CHAR = 6; - SONIC_EXPECT_KEY = 7; - SONIC_EXPECT_COLON = 8; - SONIC_EXPECT_OBJ_COMMA_OR_END = 9; - SONIC_EXPECT_ARR_COMMA_OR_END = 10; - SONIC_VISIT_FAILED = 11; - SONIC_INVALID_ESCAPED_UTF = 12; - SONIC_INVALID_LITERAL = 13; - SONIC_STACK_OVERFLOW = 14; -) - -var ParsingErrors = []string{ - SONIC_OK : "ok", - SONIC_CONTROL_CHAR : "control chars in string", - SONIC_INVALID_ESCAPED : "invalid escaped chars in string", - SONIC_INVALID_NUM : "invalid number", - SONIC_FLOAT_INF : "float infinity", - SONIC_EOF : "eof", - SONIC_INVALID_CHAR : "invalid chars", - SONIC_EXPECT_KEY : "expect a json key", - SONIC_EXPECT_COLON : "expect a `:`", - SONIC_EXPECT_OBJ_COMMA_OR_END : "expect a `,` or `}`", - SONIC_EXPECT_ARR_COMMA_OR_END : "expect a `,` or `]`", - SONIC_VISIT_FAILED : "failed in json visitor", - SONIC_INVALID_ESCAPED_UTF : "invalid escaped unicodes", - SONIC_INVALID_LITERAL : "invalid literal(true/false/null)", - SONIC_STACK_OVERFLOW : "json is exceeded max depth 4096, cause stack overflow", -} - -func (code ErrorCode) Error() string { - return ParsingErrors[code] -} - -type node struct { - typ uint64 - val uint64 -} - -// should consistent with native/parser.c -type _nospaceBlock struct { - _ [8]byte - _ [8]byte -} - -// should consistent with native/parser.c -type nodeBuf struct { - ncur uintptr - parent int64 - depth uint64 - nstart uintptr - nend uintptr - stat jsonStat -} - -func (self *nodeBuf) init(nodes []node) { - self.ncur = uintptr(unsafe.Pointer(&nodes[0])) - self.nstart = self.ncur - self.nend = self.ncur + uintptr(cap(nodes)) * unsafe.Sizeof(node{}) - self.parent = -1 -} - -// should consistent with native/parser.c -type Parser struct { - Json string - padded []byte - nodes []node - dbuf []byte - backup []node - - options uint64 - // JSON cursor - start uintptr - cur uintptr - end uintptr - _nbk _nospaceBlock - - // node buffer cursor - nbuf nodeBuf - Utf8Inv bool - isEface bool -} - -// only when parse non-empty object/array are needed. -type jsonStat struct { - object uint32 - array uint32 - str uint32 - number uint32 - array_elems uint32 - object_keys uint32 - max_depth uint32 -} - - -var ( - defaultJsonPaddedCap uintptr = 1 << 20 // 1 Mb - defaultNodesCap uintptr = (1 << 20) / unsafe.Sizeof(node{}) // 1 Mb -) - -var parsePool sync.Pool = sync.Pool { - New: func () interface{} { - return &Parser{ - options: 0, - padded: make([]byte, 0, defaultJsonPaddedCap), - nodes: make([]node, defaultNodesCap, defaultNodesCap), - dbuf: make([]byte, types.MaxDigitNums, types.MaxDigitNums), - } - }, -} - -var padding string = "x\"x\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - -func newParser(data string, pos int, opt uint64) *Parser { - p := parsePool.Get().(*Parser) - - /* validate json if needed */ - if (opt & (1 << _F_validate_string)) != 0 && !utf8.ValidateString(data){ - dbuf := utf8.CorrectWith(nil, rt.Str2Mem(data[pos:]), "\ufffd") - dbuf = append(dbuf, padding...) - p.Json = rt.Mem2Str(dbuf[:len(dbuf) - len(padding)]) - p.Utf8Inv = true - p.start = uintptr((*rt.GoString)(unsafe.Pointer(&p.Json)).Ptr) - } else { - p.Json = data - // TODO: prevent too large JSON - p.padded = append(p.padded, data[pos:]...) - p.padded = append(p.padded, padding...) - p.start = uintptr((*rt.GoSlice)(unsafe.Pointer(&p.padded)).Ptr) - } - - p.cur = p.start - p.end = p.cur + uintptr(len(p.Json)) - p.options = opt - p.nbuf.init(p.nodes) - return p -} - - -func (p *Parser) Pos() int { - return int(p.cur - p.start) -} - -func (p *Parser) JsonBytes() []byte { - if p.Utf8Inv { - return (rt.Str2Mem(p.Json)) - } else { - return p.padded - } -} - -var nodeType = rt.UnpackType(reflect.TypeOf(node{})) - -//go:inline -func calMaxNodeCap(jsonSize int) int { - return jsonSize / 2 + 2 -} - -func (p *Parser) parse() ErrorCode { - // when decode into struct, we should decode number as possible - old := p.options - if !p.isEface { - p.options &^= 1 << _F_use_number - } - - // fast path with limited node buffer - err := ErrorCode(native.ParseWithPadding(unsafe.Pointer(p))) - if err != SONIC_VISIT_FAILED { - p.options = old - return err - } - - // check OoB here - offset := p.nbuf.ncur - p.nbuf.nstart - curLen := offset / unsafe.Sizeof(node{}) - if curLen != uintptr(len(p.nodes)) { - panic(fmt.Sprintf("current len: %d, real len: %d cap: %d", curLen, len(p.nodes), cap(p.nodes))) - } - - // node buf is not enough, continue parse - // the maxCap is always meet all valid JSON - maxCap := calMaxNodeCap(len(p.Json)) - slice := rt.GoSlice{ - Ptr: rt.Mallocgc(uintptr(maxCap) * nodeType.Size, nodeType, false), - Len: maxCap, - Cap: maxCap, - } - rt.Memmove(unsafe.Pointer(slice.Ptr), unsafe.Pointer(&p.nodes[0]), offset) - p.backup = p.nodes - p.nodes = *(*[]node)(unsafe.Pointer(&slice)) - - // update node cursor - p.nbuf.nstart = uintptr(unsafe.Pointer(&p.nodes[0])) - p.nbuf.nend = p.nbuf.nstart + uintptr(cap(p.nodes)) * unsafe.Sizeof(node{}) - p.nbuf.ncur = p.nbuf.nstart + offset - - // continue parse json - err = ErrorCode(native.ParseWithPadding(unsafe.Pointer(p))) - p.options = old - return err -} - -func (p *Parser) reset() { - p.options = 0 - p.padded = p.padded[:0] - // nodes is too large here, we will not reset it and use small backup nodes buffer - if p.backup != nil { - p.nodes = p.backup - p.backup = nil - } - p.start = 0 - p.cur = 0 - p.end = 0 - p.Json = "" - p.nbuf = nodeBuf{} - p._nbk = _nospaceBlock{} - p.Utf8Inv = false - p.isEface = false -} - -func (p *Parser) free() { - p.reset() - parsePool.Put(p) -} - -//go:noinline -func (p *Parser) fixError(code ErrorCode) error { - if code == SONIC_OK { - return nil - } - - if p.Pos() == 0 { - code = SONIC_EOF; - } - - pos := p.Pos() - 1 - return error_syntax(pos, p.Json, ParsingErrors[code]) -} - -func Parse(data string, opt uint64) error { - p := newParser(data, 0, opt) - err := p.parse() - p.free() - return err -} diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/node.go b/vendor/github.com/bytedance/sonic/internal/decoder/optdec/node.go deleted file mode 100644 index b23901e38..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/node.go +++ /dev/null @@ -1,1278 +0,0 @@ -package optdec - -import ( - "encoding/json" - "math" - "unsafe" - - "github.com/bytedance/sonic/internal/envs" - "github.com/bytedance/sonic/internal/rt" -) - -type Context struct { - Parser *Parser - efacePool *efacePool - Stack bounedStack - Utf8Inv bool -} - -func (ctx *Context) Options() uint64 { - return ctx.Parser.options -} - -/************************* Stack and Pool Helper *******************/ - -type parentStat struct { - con unsafe.Pointer - remain uint64 -} -type bounedStack struct { - stack []parentStat - index int -} - -func newStack(size int) bounedStack { - return bounedStack{ - stack: make([]parentStat, size + 2), - index: 0, - } -} - -//go:nosplit -func (s *bounedStack) Pop() (unsafe.Pointer, int, bool){ - s.index-- - con := s.stack[s.index].con - remain := s.stack[s.index].remain &^ (uint64(1) << 63) - isObj := (s.stack[s.index].remain & (uint64(1) << 63)) != 0 - s.stack[s.index].con = nil - s.stack[s.index].remain = 0 - return con, int(remain), isObj -} - -//go:nosplit -func (s *bounedStack) Push(p unsafe.Pointer, remain int, isObj bool) { - s.stack[s.index].con = p - s.stack[s.index].remain = uint64(remain) - if isObj { - s.stack[s.index].remain |= (uint64(1) << 63) - } - s.index++ -} - -type efacePool struct{ - t64 rt.T64Pool - tslice rt.TslicePool - tstring rt.TstringPool - efaceSlice rt.SlicePool -} - -func newEfacePool(stat *jsonStat, useNumber bool) *efacePool { - strs := int(stat.str) - nums := 0 - if useNumber { - strs += int(stat.number) - } else { - nums = int(stat.number) - } - - return &efacePool{ - t64: rt.NewT64Pool(nums), - tslice: rt.NewTslicePool(int(stat.array)), - tstring: rt.NewTstringPool(strs), - efaceSlice: rt.NewPool(rt.AnyType, int(stat.array_elems)), - } -} - -func (self *efacePool) GetMap(hint int) unsafe.Pointer { - m := make(map[string]interface{}, hint) - return *(*unsafe.Pointer)(unsafe.Pointer(&m)) -} - -func (self *efacePool) GetSlice(hint int) unsafe.Pointer { - return unsafe.Pointer(self.efaceSlice.GetSlice(hint)) -} - -func (self *efacePool) ConvTSlice(val rt.GoSlice, typ *rt.GoType, dst unsafe.Pointer) { - self.tslice.Conv(val, typ, (*interface{})(dst)) -} - -func (self *efacePool) ConvF64(val float64, dst unsafe.Pointer) { - self.t64.Conv(castU64(val), rt.Float64Type, (*interface{})(dst)) -} - -func (self *efacePool) ConvTstring(val string, dst unsafe.Pointer) { - self.tstring.Conv(val, (*interface{})(dst)) -} - -func (self *efacePool) ConvTnum(val json.Number, dst unsafe.Pointer) { - self.tstring.ConvNum(val, (*interface{})(dst)) -} - -/********************************************************/ - -func canUseFastMap( opts uint64, root *rt.GoType) bool { - return envs.UseFastMap && (opts & (1 << _F_copy_string)) == 0 && (opts & (1 << _F_use_int64)) == 0 && (root == rt.AnyType || root == rt.MapEfaceType || root == rt.SliceEfaceType) -} - -func NewContext(json string, pos int, opts uint64, root *rt.GoType) (Context, error) { - ctx := Context{ - Parser: newParser(json, pos, opts), - } - if root == rt.AnyType || root == rt.MapEfaceType || root == rt.SliceEfaceType { - ctx.Parser.isEface = true - } - - ecode := ctx.Parser.parse() - - if ecode != 0 { - return ctx, ctx.Parser.fixError(ecode) - } - - useNumber := (opts & (1 << _F_use_number )) != 0 - if canUseFastMap(opts, root) { - ctx.efacePool = newEfacePool(&ctx.Parser.nbuf.stat, useNumber) - ctx.Stack = newStack(int(ctx.Parser.nbuf.stat.max_depth)) - } - - return ctx, nil -} - -func (ctx *Context) Delete() { - ctx.Parser.free() - ctx.Parser = nil -} - -type Node struct { - cptr uintptr -} - -func NewNode(cptr uintptr) Node { - return Node{cptr: cptr} -} - -type Dom struct { - cdom uintptr -} - -func (ctx *Context) Root() Node { - root := (uintptr)(((*rt.GoSlice)(unsafe.Pointer(&ctx.Parser.nodes))).Ptr) - return Node{cptr: root} -} - -type Array struct { - cptr uintptr -} - -type Object struct { - cptr uintptr -} - -func (obj Object) Len() int { - cobj := ptrCast(obj.cptr) - return int(uint64(cobj.val) & ConLenMask) -} - -func (arr Array) Len() int { - carr := ptrCast(arr.cptr) - return int(uint64(carr.val) & ConLenMask) -} - -// / Helper functions to eliminate CGO calls -func (val Node) Type() uint8 { - ctype := ptrCast(val.cptr) - return uint8(ctype.typ & TypeMask) -} - -func (val Node) Next() uintptr { - if val.Type() != KObject && val.Type() != KArray { - return PtrOffset(val.cptr, 1) - } - cobj := ptrCast(val.cptr) - offset := int64(uint64(cobj.val) >> ConLenBits) - return PtrOffset(val.cptr, offset) -} - -func (val *Node) next() { - *val = NewNode(val.Next()) -} - -type NodeIter struct { - next uintptr -} - -func NewNodeIter(node Node) NodeIter { - return NodeIter{next: node.cptr} -} - -func (iter *NodeIter) Next() Node { - ret := NewNode(iter.next) - iter.next = PtrOffset(iter.next, 1) - return ret -} - - -func (iter *NodeIter) Peek() Node { - return NewNode(iter.next) -} - -func (val Node) U64() uint64 { - cnum := ptrCast(val.cptr) - return *(*uint64)((unsafe.Pointer)(&(cnum.val))) -} - -func (val Node) I64() int64 { - cnum := ptrCast(val.cptr) - return *(*int64)((unsafe.Pointer)(&(cnum.val))) -} - -func (val Node) IsNull() bool { - return val.Type() == KNull -} - -func (val Node) IsNumber() bool { - return val.Type() & KNumber != 0 -} - -func (val Node) F64() float64 { - cnum := ptrCast(val.cptr) - return *(*float64)((unsafe.Pointer)(&(cnum.val))) -} - -func (val Node) Bool() bool { - return val.Type() == KTrue -} - -func (self Node) AsU64(ctx *Context) (uint64, bool) { - if self.Type() == KUint { - return self.U64(), true - } else if self.Type() == KRawNumber { - num, err := ParseU64(self.Raw(ctx)) - if err != nil { - return 0, false - } - return num, true - } else { - return 0, false - } -} - -func (val *Node) AsObj() (Object, bool) { - var ret Object - if val.Type() != KObject { - return ret, false - } - return Object{ - cptr: val.cptr, - }, true -} - -func (val Node) Obj() Object { - return Object{cptr: val.cptr} -} - -func (val Node) Arr() Array { - return Array{cptr: val.cptr} -} - -func (val *Node) AsArr() (Array, bool) { - var ret Array - if val.Type() != KArray { - return ret, false - } - return Array{ - cptr: val.cptr, - }, true -} - -func (self Node) AsI64(ctx *Context) (int64, bool) { - typ := self.Type() - if typ == KUint && self.U64() <= math.MaxInt64 { - return int64(self.U64()), true - } else if typ == KSint { - return self.I64(), true - } else if typ == KRawNumber { - val, err := self.Number(ctx).Int64() - if err != nil { - return 0, false - } - return val, true - } else { - return 0, false - } -} - -/********* Parse Node String into Value ***************/ - -func (val Node) ParseI64(ctx *Context) (int64, bool) { - s, ok := val.AsStrRef(ctx) - if !ok { - return 0, false - } - - if s == "null" { - return 0, true - } - - i, err := ParseI64(s) - if err != nil { - return 0, false - } - return i, true -} - -func (val Node) ParseBool(ctx *Context) (bool, bool) { - s, ok := val.AsStrRef(ctx) - if !ok { - return false, false - } - - if s == "null" { - return false, true - } - - b, err := ParseBool(s) - if err != nil { - return false, false - } - return b, true -} - -func (val Node) ParseU64(ctx *Context) (uint64, bool) { - s, ok := val.AsStrRef(ctx) - if !ok { - return 0, false - } - - if s == "null" { - return 0, true - } - - i, err := ParseU64(s) - if err != nil { - return 0, false - } - return i, true -} - -func (val Node) ParseF64(ctx *Context) (float64, bool) { - s, ok := val.AsStrRef(ctx) - if !ok { - return 0, false - } - - if s == "null" { - return 0, true - } - - i, err := ParseF64(s) - if err != nil { - return 0, false - } - return i, true -} - -func (val Node) ParseString(ctx *Context) (string, bool) { - // should not use AsStrRef - s, ok := val.AsStr(ctx) - if !ok { - return "", false - } - - if s == "null" { - return "", true - } - - s, err := Unquote(s) - if err != nil { - return "", false - } - return s, true -} - - -func (val Node) ParseNumber(ctx *Context) (json.Number, bool) { - // should not use AsStrRef - s, ok := val.AsStr(ctx) - if !ok { - return json.Number(""), false - } - - if s == "null" { - return json.Number(""), true - } - - end, ok := SkipNumberFast(s, 0) - // has error or trailing chars - if !ok || end != len(s) { - return json.Number(""), false - } - return json.Number(s), true -} - - - -func (val Node) AsF64(ctx *Context) (float64, bool) { - switch val.Type() { - case KUint: return float64(val.U64()), true - case KSint: return float64(val.I64()), true - case KReal: return float64(val.F64()), true - case KRawNumber: f, err := val.Number(ctx).Float64(); return f, err == nil - default: return 0, false - } -} - -func (val Node) AsBool() (bool, bool) { - switch val.Type() { - case KTrue: return true, true - case KFalse: return false, true - default: return false, false - } -} - -func (val Node) AsStr(ctx *Context) (string, bool) { - switch val.Type() { - case KStringCommon: - s := val.StringRef(ctx) - if (ctx.Options() & (1 << _F_copy_string) == 0) { - return s, true - } - return string(rt.Str2Mem(s)), true - case KStringEscaped: - return val.StringCopyEsc(ctx), true - default: return "", false - } -} - -func (val Node) AsStrRef(ctx *Context) (string, bool) { - switch val.Type() { - case KStringEscaped: - node := ptrCast(val.cptr) - offset := val.Position() - len := int(node.val) - return rt.Mem2Str(ctx.Parser.JsonBytes()[offset : offset + len]), true - case KStringCommon: - return val.StringRef(ctx), true - default: - return "", false - } -} - -func (val Node) AsBytesRef(ctx *Context) ([]byte, bool) { - switch val.Type() { - case KStringEscaped: - node := ptrCast(val.cptr) - offset := val.Position() - len := int(node.val) - return ctx.Parser.JsonBytes()[offset : offset + len], true - case KStringCommon: - return rt.Str2Mem(val.StringRef(ctx)), true - default: - return nil, false - } -} - -func (val Node) AsStringText(ctx *Context) ([]byte, bool) { - if !val.IsStr() { - return nil, false - } - - // clone to new bytes - s, b := val.AsStrRef(ctx) - return []byte(s), b -} - -func (val Node) IsStr() bool { - return (val.Type() == KStringCommon) || (val.Type() == KStringEscaped) -} - -func (val Node) IsRawNumber() bool { - return val.Type() == KRawNumber -} - -func (val Node) Number(ctx *Context) json.Number { - return json.Number(val.Raw(ctx)) -} - -func (val Node) Raw(ctx *Context) string { - node := ptrCast(val.cptr) - len := int(node.val) - offset := val.Position() - return ctx.Parser.Json[offset:int(offset+len)] -} - -func (val Node) Position() int { - node := ptrCast(val.cptr) - return int(node.typ >> PosBits) -} - -func (val Node) AsNumber(ctx *Context) (json.Number, bool) { - // parse JSON string as number - if val.IsStr() { - s, _ := val.AsStr(ctx) - if !ValidNumberFast(s) { - return "", false - } else { - return json.Number(s), true - } - } - - return val.NonstrAsNumber(ctx) -} - -func (val Node) NonstrAsNumber(ctx *Context) (json.Number, bool) { - // deal with raw number - if val.IsRawNumber() { - return val.Number(ctx), true - } - - // deal with parse number - if !val.IsNumber() { - return json.Number(""), false - } - - start := val.Position() - end, ok := SkipNumberFast(ctx.Parser.Json, start) - if !ok { - return "", false - } - return json.Number(ctx.Parser.Json[start:end]), true -} - -func (val Node) AsRaw(ctx *Context) string { - // fast path for unescaped strings - switch val.Type() { - case KNull: - return "null" - case KTrue: - return "true" - case KFalse: - return "false" - case KStringCommon: - node := ptrCast(val.cptr) - len := int(node.val) - offset := val.Position() - // add start abd end quote - ref := rt.Str2Mem(ctx.Parser.Json)[offset-1 : offset+len+1] - return rt.Mem2Str(ref) - case KRawNumber: fallthrough - case KRaw: return val.Raw(ctx) - case KStringEscaped: - raw, _ := SkipOneFast(ctx.Parser.Json, val.Position() - 1) - return raw - default: - raw, err := SkipOneFast(ctx.Parser.Json, val.Position()) - if err != nil { - break - } - return raw - } - panic("should always be valid json here") -} - -// reference from the input JSON as possible -func (val Node) StringRef(ctx *Context) string { - return val.Raw(ctx) -} - -//go:nocheckptr -func ptrCast(p uintptr) *node { - return (*node)(unsafe.Pointer(p)) -} - -func (val Node) StringCopyEsc(ctx *Context) string { - // check whether there are in padded - node := ptrCast(val.cptr) - len := int(node.val) - offset := val.Position() - return string(ctx.Parser.JsonBytes()[offset : offset + len]) -} - -func (val Node) Object() Object { - return Object{cptr: val.cptr} -} - -func (val Node) Array() Array { - return Array{cptr: val.cptr} -} - -func (val *Array) Children() uintptr { - return PtrOffset(val.cptr, 1) -} - -func (val *Object) Children() uintptr { - return PtrOffset(val.cptr, 1) -} - -func (val *Node) Equal(ctx *Context, lhs string) bool { - // check whether escaped - cstr := ptrCast(val.cptr) - offset := int(val.Position()) - len := int(cstr.val) - return lhs == ctx.Parser.Json[offset:offset+len] -} - -func (node *Node) AsMapEface(ctx *Context, vp unsafe.Pointer) error { - if node.IsNull() { - return nil - } - - obj, ok := node.AsObj() - if !ok { - return newUnmatched(node.Position(), rt.MapEfaceType) - } - - var err, gerr error - size := obj.Len() - - var m map[string]interface{} - if *(*unsafe.Pointer)(vp) == nil { - if ctx.efacePool != nil { - p := ctx.efacePool.GetMap(size) - m = *(*map[string]interface{})(unsafe.Pointer(&p)) - } else { - m = make(map[string]interface{}, size) - } - } else { - m = *(*map[string]interface{})(vp) - } - - next := obj.Children() - for i := 0; i < size; i++ { - knode := NewNode(next) - key, _ := knode.AsStr(ctx) - val := NewNode(PtrOffset(next, 1)) - m[key], err = val.AsEface(ctx) - next = val.cptr - if gerr == nil && err != nil { - gerr = err - } - } - - *(*map[string]interface{})(vp) = m - return gerr -} - -func (node *Node) AsMapString(ctx *Context, vp unsafe.Pointer) error { - obj, ok := node.AsObj() - if !ok { - return newUnmatched(node.Position(), rt.MapStringType) - } - - size := obj.Len() - - var m map[string]string - if *(*unsafe.Pointer)(vp) == nil { - m = make(map[string]string, size) - } else { - m = *(*map[string]string)(vp) - } - - var gerr error - next := obj.Children() - for i := 0; i < size; i++ { - knode := NewNode(next) - key, _ := knode.AsStr(ctx) - val := NewNode(PtrOffset(next, 1)) - m[key], ok = val.AsStr(ctx) - if !ok { - if gerr == nil { - gerr = newUnmatched(val.Position(), rt.StringType) - } - next = val.Next() - } else { - next = PtrOffset(val.cptr, 1) - } - } - - *(*map[string]string)(vp) = m - return gerr -} - -func (node *Node) AsSliceEface(ctx *Context, vp unsafe.Pointer) error { - arr, ok := node.AsArr() - if !ok { - return newUnmatched(node.Position(), rt.SliceEfaceType) - } - - size := arr.Len() - var s []interface{} - if size != 0 && ctx.efacePool != nil { - slice := rt.GoSlice { - Ptr: ctx.efacePool.GetSlice(size), - Len: size, - Cap: size, - } - *(*rt.GoSlice)(unsafe.Pointer(&s)) = slice - } else { - s = *(*[]interface{})((unsafe.Pointer)(rt.MakeSlice(vp, rt.AnyType, size))) - } - - *node = NewNode(arr.Children()) - - var err, gerr error - for i := 0; i < size; i++ { - s[i], err = node.AsEface(ctx) - if gerr == nil && err != nil { - gerr = err - } - } - - *(*[]interface{})(vp) = s - return nil -} - -func (node *Node) AsSliceI32(ctx *Context, vp unsafe.Pointer) error { - arr, ok := node.AsArr() - if !ok { - return newUnmatched(node.Position(), rt.SliceI32Type) - } - - size := arr.Len() - s := *(*[]int32)((unsafe.Pointer)(rt.MakeSlice(vp, rt.Int32Type, size))) - next := arr.Children() - - var gerr error - for i := 0; i < size; i++ { - val := NewNode(next) - ret, ok := val.AsI64(ctx) - if !ok || ret > math.MaxInt32 || ret < math.MinInt32 { - if gerr == nil { - gerr = newUnmatched(val.Position(), rt.Int32Type) - } - next = val.Next() - } else { - s[i] = int32(ret) - next = PtrOffset(val.cptr, 1) - } - } - - *(*[]int32)(vp) = s - return gerr -} - -func (node *Node) AsSliceI64(ctx *Context, vp unsafe.Pointer) error { - arr, ok := node.AsArr() - if !ok { - return newUnmatched(node.Position(), rt.SliceI64Type) - } - - size := arr.Len() - s := *(*[]int64)((unsafe.Pointer)(rt.MakeSlice(vp, rt.Int64Type, size))) - next := arr.Children() - - var gerr error - for i := 0; i < size; i++ { - val := NewNode(next) - - ret, ok := val.AsI64(ctx) - if !ok { - if gerr == nil { - gerr = newUnmatched(val.Position(), rt.Int64Type) - } - next = val.Next() - } else { - s[i] = ret - next = PtrOffset(val.cptr, 1) - } - } - - *(*[]int64)(vp) = s - return gerr -} - -func (node *Node) AsSliceU32(ctx *Context, vp unsafe.Pointer) error { - arr, ok := node.AsArr() - if !ok { - return newUnmatched(node.Position(), rt.SliceU32Type) - } - - size := arr.Len() - next := arr.Children() - s := *(*[]uint32)((unsafe.Pointer)(rt.MakeSlice(vp, rt.Uint32Type, size))) - - var gerr error - for i := 0; i < size; i++ { - val := NewNode(next) - ret, ok := val.AsU64(ctx) - if !ok || ret > math.MaxUint32 { - if gerr == nil { - gerr = newUnmatched(val.Position(), rt.Uint32Type) - } - next = val.Next() - } else { - s[i] = uint32(ret) - next = PtrOffset(val.cptr, 1) - } - } - - *(*[]uint32)(vp) = s - return gerr -} - -func (node *Node) AsSliceU64(ctx *Context, vp unsafe.Pointer) error { - arr, ok := node.AsArr() - if !ok { - return newUnmatched(node.Position(), rt.SliceU64Type) - } - - size := arr.Len() - next := arr.Children() - - s := *(*[]uint64)((unsafe.Pointer)(rt.MakeSlice(vp, rt.Uint64Type, size))) - var gerr error - for i := 0; i < size; i++ { - val := NewNode(next) - ret, ok := val.AsU64(ctx) - if !ok { - if gerr == nil { - gerr = newUnmatched(val.Position(), rt.Uint64Type) - } - next = val.Next() - } else { - s[i] = ret - next = PtrOffset(val.cptr, 1) - } - } - - *(*[]uint64)(vp) = s - return gerr -} - -func (node *Node) AsSliceString(ctx *Context, vp unsafe.Pointer) error { - arr, ok := node.AsArr() - if !ok { - return newUnmatched(node.Position(), rt.SliceStringType) - } - - size := arr.Len() - next := arr.Children() - s := *(*[]string)((unsafe.Pointer)(rt.MakeSlice(vp, rt.StringType, size))) - - var gerr error - for i := 0; i < size; i++ { - val := NewNode(next) - ret, ok := val.AsStr(ctx) - if !ok { - if gerr == nil { - gerr = newUnmatched(val.Position(), rt.StringType) - } - next = val.Next() - } else { - s[i] = ret - next = PtrOffset(val.cptr, 1) - } - } - - *(*[]string)(vp) = s - return gerr -} - -func (node *Node) AsSliceBytes(ctx *Context) ([]byte, error) { - b, ok := node.AsBytesRef(ctx) - if !ok { - return nil, newUnmatched(node.Position(), rt.BytesType) - } - - b64, err := rt.DecodeBase64(b) - if err != nil { - return nil, newUnmatched(node.Position(), rt.BytesType) - } - return b64, nil -} - -// AsEface will always ok, because we have parse in native. -func (node *Node) AsEface(ctx *Context) (interface{}, error) { - if ctx.efacePool != nil { - iter := NewNodeIter(*node) - v := AsEfaceFast(&iter, ctx) - *node = iter.Peek() - return v, nil - } else { - return node.AsEfaceFallback(ctx) - } -} - -func parseSingleNode(node Node, ctx *Context) interface{} { - var v interface{} - switch node.Type() { - case KObject: v = map[string]interface{}{} - case KArray: v = []interface{}{} - case KStringCommon: v = node.StringRef(ctx) - case KStringEscaped: v = node.StringCopyEsc(ctx) - case KTrue: v = true - case KFalse: v = false - case KNull: v = nil - case KUint: v = float64(node.U64()) - case KSint: v = float64(node.I64()) - case KReal: v = float64(node.F64()) - case KRawNumber: v = node.Number(ctx) - default: panic("unreachable for as eface") - } - return v -} - -func castU64(val float64) uint64 { - return *((*uint64)(unsafe.Pointer((&val)))) -} - -func AsEfaceFast(iter *NodeIter, ctx *Context) interface{} { - var mp, sp, parent unsafe.Pointer // current container pointer - var node Node - var size int - var isObj bool - var slice rt.GoSlice - var val unsafe.Pointer - var vt **rt.GoType - var vp *unsafe.Pointer - var rootM unsafe.Pointer - var rootS rt.GoSlice - var root interface{} - var key string - - node = iter.Next() - - switch node.Type() { - case KObject: - size = node.Object().Len() - if size != 0 { - ctx.Stack.Push(nil, 0, true) - mp = ctx.efacePool.GetMap(size) - rootM = mp - isObj = true - goto _object_key - } else { - return rt.GoEface { - Type: rt.MapEfaceType, - Value: ctx.efacePool.GetMap(0), - }.Pack() - } - case KArray: - size = node.Array().Len() - if size != 0 { - ctx.Stack.Push(nil, 0, false) - sp = ctx.efacePool.GetSlice(size) - slice = rt.GoSlice { - Ptr: sp, - Len: size, - Cap: size, - } - rootS = slice - isObj = false - val = sp - goto _arr_val; - } else { - ctx.efacePool.ConvTSlice(rt.EmptySlice, rt.SliceEfaceType, unsafe.Pointer(&root)) - } - case KStringCommon: ctx.efacePool.ConvTstring(node.StringRef(ctx), unsafe.Pointer(&root)) - case KStringEscaped: ctx.efacePool.ConvTstring(node.StringCopyEsc(ctx), unsafe.Pointer(&root)) - case KTrue: root = true - case KFalse: root = false - case KNull: root = nil - case KUint: ctx.efacePool.ConvF64(float64(node.U64()), unsafe.Pointer(&root)) - case KSint: ctx.efacePool.ConvF64(float64(node.I64()), unsafe.Pointer(&root)) - case KReal: ctx.efacePool.ConvF64(node.F64(), unsafe.Pointer(&root)) - case KRawNumber: ctx.efacePool.ConvTnum(node.Number(ctx), unsafe.Pointer(&root)) - default: panic("unreachable for as eface") - } - return root - -_object_key: - node = iter.Next() - if node.Type() == KStringCommon { - key = node.StringRef(ctx) - } else { - key = node.StringCopyEsc(ctx) - } - - // interface{} slot in map bucket - val = rt.Mapassign_faststr(rt.MapEfaceMapType, mp, key) - vt = &(*rt.GoEface)(val).Type - vp = &(*rt.GoEface)(val).Value - - // parse value node - node = iter.Next() - switch node.Type() { - case KObject: - newSize := node.Object().Len() - newMp := ctx.efacePool.GetMap(newSize) - *vt = rt.MapEfaceType - *vp = newMp - remain := size - 1 - isObj = true - if newSize != 0 { - if remain > 0 { - ctx.Stack.Push(mp, remain, true) - } - mp = newMp - size = newSize - goto _object_key; - } - case KArray: - newSize := node.Array().Len() - if newSize == 0 { - ctx.efacePool.ConvTSlice(rt.EmptySlice, rt.SliceEfaceType, val) - break; - } - - newSp := ctx.efacePool.GetSlice(newSize) - // pack to []interface{} - ctx.efacePool.ConvTSlice(rt.GoSlice{ - Ptr: newSp, - Len: newSize, - Cap: newSize, - }, rt.SliceEfaceType, val) - remain := size - 1 - if remain > 0 { - ctx.Stack.Push(mp, remain, true) - } - val = newSp - isObj = false - size = newSize - goto _arr_val; - case KStringCommon: - ctx.efacePool.ConvTstring(node.StringRef(ctx), val) - case KStringEscaped: - ctx.efacePool.ConvTstring(node.StringCopyEsc(ctx), val) - case KTrue: - rt.ConvTBool(true, (*interface{})(val)) - case KFalse: - rt.ConvTBool(false, (*interface{})(val)) - case KNull: /* skip */ - case KUint: - ctx.efacePool.ConvF64(float64(node.U64()), val) - case KSint: - ctx.efacePool.ConvF64(float64(node.I64()), val) - case KReal: - ctx.efacePool.ConvF64(node.F64(), val) - case KRawNumber: - ctx.efacePool.ConvTnum(node.Number(ctx), val) - default: - panic("unreachable for as eface") - } - - // check size - size -= 1 - if size != 0 { - goto _object_key; - } - - parent, size, isObj = ctx.Stack.Pop() - - // parent is empty - if parent == nil { - if isObj { - return rt.GoEface { - Type: rt.MapEfaceType, - Value: rootM, - }.Pack() - } else { - ctx.efacePool.ConvTSlice(rootS, rt.SliceEfaceType, (unsafe.Pointer)(&root)) - return root - } - } - - // continue to parse parent - if isObj { - mp = parent - goto _object_key; - } else { - val = rt.PtrAdd(parent, rt.AnyType.Size) - goto _arr_val; - } - -_arr_val: - // interface{} slot in slice - vt = &(*rt.GoEface)(val).Type - vp = &(*rt.GoEface)(val).Value - - // parse value node - node = iter.Next() - switch node.Type() { - case KObject: - newSize := node.Object().Len() - newMp := ctx.efacePool.GetMap(newSize) - *vt = rt.MapEfaceType - *vp = newMp - remain := size - 1 - if newSize != 0 { - // push next array elem into stack - if remain > 0 { - ctx.Stack.Push(val, remain, false) - } - mp = newMp - size = newSize - isObj = true - goto _object_key; - } - case KArray: - newSize := node.Array().Len() - if newSize == 0 { - ctx.efacePool.ConvTSlice(rt.EmptySlice, rt.SliceEfaceType, val) - break; - } - - newSp := ctx.efacePool.GetSlice(newSize) - // pack to []interface{} - ctx.efacePool.ConvTSlice(rt.GoSlice { - Ptr: newSp, - Len: newSize, - Cap: newSize, - }, rt.SliceEfaceType, val) - - remain := size - 1 - if remain > 0 { - ctx.Stack.Push(val, remain, false) - } - - val = newSp - isObj = false - size = newSize - goto _arr_val; - case KStringCommon: - ctx.efacePool.ConvTstring(node.StringRef(ctx), val) - case KStringEscaped: - ctx.efacePool.ConvTstring(node.StringCopyEsc(ctx), val) - case KTrue: - rt.ConvTBool(true, (*interface{})(val)) - case KFalse: - rt.ConvTBool(false, (*interface{})(val)) - case KNull: /* skip */ - case KUint: - ctx.efacePool.ConvF64(float64(node.U64()), val) - case KSint: - ctx.efacePool.ConvF64(float64(node.I64()), val) - case KReal: - ctx.efacePool.ConvF64(node.F64(), val) - case KRawNumber: - ctx.efacePool.ConvTnum(node.Number(ctx), val) - default: panic("unreachable for as eface") - } - - // check size - size -= 1 - if size != 0 { - val = rt.PtrAdd(val, rt.AnyType.Size) - goto _arr_val; - } - - - parent, size, isObj = ctx.Stack.Pop() - - // parent is empty - if parent == nil { - if isObj { - return rt.GoEface { - Type: rt.MapEfaceType, - Value: rootM, - }.Pack() - } else { - ctx.efacePool.ConvTSlice(rootS, rt.SliceEfaceType, unsafe.Pointer(&root)) - return root - } - } - - // continue to parse parent - if isObj { - mp = parent - goto _object_key; - } else { - val = rt.PtrAdd(parent, rt.AnyType.Size) - goto _arr_val; - } -} - -func (node *Node) AsEfaceFallback(ctx *Context) (interface{}, error) { - switch node.Type() { - case KObject: - obj := node.Object() - size := obj.Len() - m := make(map[string]interface{}, size) - *node = NewNode(obj.Children()) - var gerr, err error - for i := 0; i < size; i++ { - key, _ := node.AsStr(ctx) - *node = NewNode(PtrOffset(node.cptr, 1)) - m[key], err = node.AsEfaceFallback(ctx) - if gerr == nil && err != nil { - gerr = err - } - } - return m, gerr - case KArray: - arr := node.Array() - size := arr.Len() - a := make([]interface{}, size) - *node = NewNode(arr.Children()) - var gerr, err error - for i := 0; i < size; i++ { - a[i], err = node.AsEfaceFallback(ctx) - if gerr == nil && err != nil { - gerr = err - } - } - return a, gerr - case KStringCommon: - str, _ := node.AsStr(ctx) - *node = NewNode(PtrOffset(node.cptr, 1)) - return str, nil - case KStringEscaped: - str := node.StringCopyEsc(ctx) - *node = NewNode(PtrOffset(node.cptr, 1)) - return str, nil - case KTrue: - *node = NewNode(PtrOffset(node.cptr, 1)) - return true, nil - case KFalse: - *node = NewNode(PtrOffset(node.cptr, 1)) - return false, nil - case KNull: - *node = NewNode(PtrOffset(node.cptr, 1)) - return nil, nil - default: - // use float64 - if ctx.Parser.options & (1 << _F_use_number) != 0 { - num, ok := node.AsNumber(ctx) - if !ok { - // skip the unmacthed type - *node = NewNode(node.Next()) - return nil, newUnmatched(node.Position(), rt.JsonNumberType) - } else { - *node = NewNode(PtrOffset(node.cptr, 1)) - return num, nil - } - } else if ctx.Parser.options & (1 << _F_use_int64) != 0 { - // first try int64 - i, ok := node.AsI64(ctx) - if ok { - *node = NewNode(PtrOffset(node.cptr, 1)) - return i, nil - } - - // is not integer, then use float64 - f, ok := node.AsF64(ctx) - if ok { - *node = NewNode(PtrOffset(node.cptr, 1)) - return f, nil - } - - // skip the unmacthed type - *node = NewNode(node.Next()) - return nil, newUnmatched(node.Position(), rt.Int64Type) - } else { - num, ok := node.AsF64(ctx) - if !ok { - // skip the unmacthed type - *node = NewNode(node.Next()) - return nil, newUnmatched(node.Position(), rt.Float64Type) - } else { - *node = NewNode(PtrOffset(node.cptr, 1)) - return num, nil - } - } - } -} - -//go:nosplit -func PtrOffset(ptr uintptr, off int64) uintptr { - return uintptr(int64(ptr) + off * int64(unsafe.Sizeof(node{}))) -} diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/slice.go b/vendor/github.com/bytedance/sonic/internal/decoder/optdec/slice.go deleted file mode 100644 index a94e422b3..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/slice.go +++ /dev/null @@ -1,224 +0,0 @@ -package optdec - -import ( - "reflect" - "unsafe" - - "github.com/bytedance/sonic/internal/rt" -) - -type sliceDecoder struct { - elemType *rt.GoType - elemDec decFunc - typ reflect.Type -} - -var ( - emptyPtr = &struct{}{} -) - -func (d *sliceDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - *(*rt.GoSlice)(vp) = rt.GoSlice{} - return nil - } - - arr, ok := node.AsArr() - if !ok { - return error_mismatch(node, ctx, d.typ) - } - - slice := rt.MakeSlice(vp, d.elemType, arr.Len()) - elems := slice.Ptr - next := arr.Children() - - var gerr error - for i := 0; i < arr.Len(); i++ { - val := NewNode(next) - elem := unsafe.Pointer(uintptr(elems) + uintptr(i)*d.elemType.Size) - err := d.elemDec.FromDom(elem, val, ctx) - if gerr == nil && err != nil { - gerr = err - } - next = val.Next() - } - - *(*rt.GoSlice)(vp) = *slice - return gerr -} - -type arrayDecoder struct { - len int - elemType *rt.GoType - elemDec decFunc - typ reflect.Type -} - -//go:nocheckptr -func (d *arrayDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - return nil - } - - arr, ok := node.AsArr() - if !ok { - return error_mismatch(node, ctx, d.typ) - } - - next := arr.Children() - i := 0 - - var gerr error - for ; i < d.len && i < arr.Len(); i++ { - elem := unsafe.Pointer(uintptr(vp) + uintptr(i)*d.elemType.Size) - val := NewNode(next) - err := d.elemDec.FromDom(elem, val, ctx) - if gerr == nil && err != nil { - gerr = err - } - next = val.Next() - } - - /* zero rest of array */ - ptr := unsafe.Pointer(uintptr(vp) + uintptr(i)*d.elemType.Size) - n := uintptr(d.len-i) * d.elemType.Size - rt.ClearMemory(d.elemType, ptr, n) - return gerr -} - -type sliceEfaceDecoder struct { -} - -func (d *sliceEfaceDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - *(*rt.GoSlice)(vp) = rt.GoSlice{} - return nil - } - - return node.AsSliceEface(ctx, vp) -} - -type sliceI32Decoder struct { -} - -func (d *sliceI32Decoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - *(*rt.GoSlice)(vp) = rt.GoSlice{} - return nil - } - - return node.AsSliceI32(ctx, vp) -} - -type sliceI64Decoder struct { -} - -func (d *sliceI64Decoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - *(*rt.GoSlice)(vp) = rt.GoSlice{} - return nil - } - - return node.AsSliceI64(ctx, vp) -} - -type sliceU32Decoder struct { -} - -func (d *sliceU32Decoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - *(*rt.GoSlice)(vp) = rt.GoSlice{} - return nil - } - - return node.AsSliceU32(ctx, vp) -} - -type sliceU64Decoder struct { -} - -func (d *sliceU64Decoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - *(*rt.GoSlice)(vp) = rt.GoSlice{} - return nil - } - - return node.AsSliceU64(ctx, vp) -} - -type sliceStringDecoder struct { -} - -func (d *sliceStringDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - *(*rt.GoSlice)(vp) = rt.GoSlice{} - return nil - } - - return node.AsSliceString(ctx, vp) -} - -type sliceBytesDecoder struct { -} - -func (d *sliceBytesDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - *(*rt.GoSlice)(vp) = rt.GoSlice{} - return nil - } - - s, err := node.AsSliceBytes(ctx) - if err != nil { - return err - } - - *(*[]byte)(vp) = s - return nil -} - -type sliceBytesUnmarshalerDecoder struct { - elemType *rt.GoType - elemDec decFunc - typ reflect.Type -} - -func (d *sliceBytesUnmarshalerDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - *(*rt.GoSlice)(vp) = rt.GoSlice{} - return nil - } - - /* parse JSON string into `[]byte` */ - if node.IsStr() { - slice, err := node.AsSliceBytes(ctx) - if err != nil { - return err - } - *(*[]byte)(vp) = slice - return nil - } - - /* parse JSON array into `[]byte` */ - arr, ok := node.AsArr() - if !ok { - return error_mismatch(node, ctx, d.typ) - } - - slice := rt.MakeSlice(vp, d.elemType, arr.Len()) - elems := slice.Ptr - - var gerr error - next := arr.Children() - for i := 0; i < arr.Len(); i++ { - child := NewNode(next) - elem := unsafe.Pointer(uintptr(elems) + uintptr(i)*d.elemType.Size) - err := d.elemDec.FromDom(elem, child, ctx) - if gerr == nil && err != nil { - gerr = err - } - next = child.Next() - } - - *(*rt.GoSlice)(vp) = *slice - return gerr -} diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/stringopts.go b/vendor/github.com/bytedance/sonic/internal/decoder/optdec/stringopts.go deleted file mode 100644 index 5af8c97e2..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/stringopts.go +++ /dev/null @@ -1,360 +0,0 @@ -package optdec - -import ( - "encoding/json" - "math" - "unsafe" - - "github.com/bytedance/sonic/internal/rt" -) - -type ptrStrDecoder struct { - typ *rt.GoType - deref decFunc -} - -// Pointer Value is allocated in the Caller -func (d *ptrStrDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - *(*unsafe.Pointer)(vp) = nil - return nil - } - - s, ok := node.AsStrRef(ctx) - if !ok { - return error_mismatch(node, ctx, stringType) - } - - if s == "null" { - *(*unsafe.Pointer)(vp) = nil - return nil - } - - if *(*unsafe.Pointer)(vp) == nil { - *(*unsafe.Pointer)(vp) = rt.Mallocgc(d.typ.Size, d.typ, true) - } - - return d.deref.FromDom(*(*unsafe.Pointer)(vp), node, ctx) -} - -type boolStringDecoder struct { -} - -func (d *boolStringDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - return nil - } - - s, ok := node.AsStrRef(ctx) - if !ok { - return error_mismatch(node, ctx, stringType) - } - - if s == "null" { - return nil - } - - b, err := ParseBool(s) - if err != nil { - return error_mismatch(node, ctx, boolType) - } - - *(*bool)(vp) = b - return nil -} - -func parseI64(node Node, ctx *context) (int64, error, bool) { - if node.IsNull() { - return 0, nil, true - } - - s, ok := node.AsStrRef(ctx) - if !ok { - return 0, error_mismatch(node, ctx, stringType), false - } - - if s == "null" { - return 0, nil, true - } - - ret, err := ParseI64(s) - return ret, err, false -} - -type i8StringDecoder struct{} - -func (d *i8StringDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - ret, err, null := parseI64(node, ctx) - if null { - return nil - } - - if err != nil { - return err - } - - if ret > math.MaxInt8 || ret < math.MinInt8 { - return error_mismatch(node, ctx, int8Type) - } - - *(*int8)(vp) = int8(ret) - return nil -} - -type i16StringDecoder struct{} - -func (d *i16StringDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - ret, err, null := parseI64(node, ctx) - if null { - return nil - } - - if err != nil { - return err - } - - if ret > math.MaxInt16 || ret < math.MinInt16 { - return error_mismatch(node, ctx, int16Type) - } - - *(*int16)(vp) = int16(ret) - return nil -} - -type i32StringDecoder struct{} - -func (d *i32StringDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - ret, err, null := parseI64(node, ctx) - if null { - return nil - } - - if err != nil { - return err - } - - if ret > math.MaxInt32 || ret < math.MinInt32 { - return error_mismatch(node, ctx, int32Type) - } - - *(*int32)(vp) = int32(ret) - return nil -} - -type i64StringDecoder struct{} - -func (d *i64StringDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - ret, err, null := parseI64(node, ctx) - if null { - return nil - } - - if err != nil { - return err - } - - *(*int64)(vp) = int64(ret) - return nil -} - -func parseU64(node Node, ctx *context) (uint64, error, bool) { - if node.IsNull() { - return 0, nil, true - } - - s, ok := node.AsStrRef(ctx) - if !ok { - return 0, error_mismatch(node, ctx, stringType), false - } - - if s == "null" { - return 0, nil, true - } - - ret, err := ParseU64(s) - return ret, err, false -} - -type u8StringDecoder struct{} - -func (d *u8StringDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - ret, err, null := parseU64(node, ctx) - if null { - return nil - } - - if err != nil { - return err - } - - if ret > math.MaxUint8 { - return error_mismatch(node, ctx, uint8Type) - } - - *(*uint8)(vp) = uint8(ret) - return nil -} - -type u16StringDecoder struct{} - -func (d *u16StringDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - ret, err, null := parseU64(node, ctx) - if null { - return nil - } - - if err != nil { - return err - } - - if ret > math.MaxUint16 { - return error_mismatch(node, ctx, uint16Type) - } - - *(*uint16)(vp) = uint16(ret) - return nil -} - -type u32StringDecoder struct{} - -func (d *u32StringDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - ret, err, null := parseU64(node, ctx) - if null { - return nil - } - - if err != nil { - return err - } - - if ret > math.MaxUint32 { - return error_mismatch(node, ctx, uint32Type) - } - - *(*uint32)(vp) = uint32(ret) - return nil -} - - -type u64StringDecoder struct{} - -func (d *u64StringDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - ret, err, null := parseU64(node, ctx) - if null { - return nil - } - - if err != nil { - return err - } - - *(*uint64)(vp) = uint64(ret) - return nil -} - -type f32StringDecoder struct{} - -func (d *f32StringDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - return nil - } - - s, ok := node.AsStrRef(ctx) - if !ok { - return error_mismatch(node, ctx, stringType) - } - - if s == "null" { - return nil - } - - ret, err := ParseF64(s) - if err != nil || ret > math.MaxFloat32 || ret < -math.MaxFloat32 { - return error_mismatch(node, ctx, float32Type) - } - - *(*float32)(vp) = float32(ret) - return nil -} - -type f64StringDecoder struct{} - -func (d *f64StringDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - return nil - } - - s, ok := node.AsStrRef(ctx) - if !ok { - return error_mismatch(node, ctx, stringType) - } - - if s == "null" { - return nil - } - - ret, err := ParseF64(s) - if err != nil { - return error_mismatch(node, ctx, float64Type) - } - - *(*float64)(vp) = float64(ret) - return nil -} - -/* parse string field with string options */ -type strStringDecoder struct{} - -func (d *strStringDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - return nil - } - - s, ok := node.AsStrRef(ctx) - if !ok { - return error_mismatch(node, ctx, stringType) - } - - if s == "null" { - return nil - } - - s, err := Unquote(s) - if err != nil { - return error_mismatch(node, ctx, stringType) - } - - *(*string)(vp) = s - return nil -} - -type numberStringDecoder struct{} - -func (d *numberStringDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - return nil - } - - s, ok := node.AsStrRef(ctx) - if !ok { - return error_mismatch(node, ctx, stringType) - } - - if s == "null" { - return nil - } - - num, ok := node.ParseNumber(ctx) - if !ok { - return error_mismatch(node, ctx, jsonNumberType) - } - - end, ok := SkipNumberFast(s, 0) - // has error or trailing chars - if !ok || end != len(s) { - return error_mismatch(node, ctx, jsonNumberType) - } - - *(*json.Number)(vp) = json.Number(num) - return nil -} diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/structs.go b/vendor/github.com/bytedance/sonic/internal/decoder/optdec/structs.go deleted file mode 100644 index bce2758f1..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/structs.go +++ /dev/null @@ -1,61 +0,0 @@ -package optdec - -import ( - "reflect" - "unsafe" - - caching "github.com/bytedance/sonic/internal/optcaching" - "github.com/bytedance/sonic/internal/resolver" -) - -type fieldEntry struct { - resolver.FieldMeta - fieldDec decFunc -} - -type structDecoder struct { - fieldMap caching.FieldLookup - fields []fieldEntry - structName string - typ reflect.Type -} - -func (d *structDecoder) FromDom(vp unsafe.Pointer, node Node, ctx *context) error { - if node.IsNull() { - return nil - } - - var gerr error - obj, ok := node.AsObj() - if !ok { - return error_mismatch(node, ctx, d.typ) - } - - next := obj.Children() - for i := 0; i < obj.Len(); i++ { - key, _ := NewNode(next).AsStrRef(ctx) - val := NewNode(PtrOffset(next, 1)) - next = val.Next() - - // find field idx - idx := d.fieldMap.Get(key) - if idx == -1 { - if Options(ctx.Options())&OptionDisableUnknown != 0 { - return error_field(key) - } - continue - } - - offset := d.fields[idx].Path[0].Size - elem := unsafe.Pointer(uintptr(vp) + offset) - err := d.fields[idx].fieldDec.FromDom(elem, val, ctx) - - // deal with mismatch type errors - if gerr == nil && err != nil { - // TODO: better error info - gerr = err - } - } - return gerr -} - diff --git a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/types.go b/vendor/github.com/bytedance/sonic/internal/decoder/optdec/types.go deleted file mode 100644 index fe1433eec..000000000 --- a/vendor/github.com/bytedance/sonic/internal/decoder/optdec/types.go +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package optdec - -import ( - "encoding" - "encoding/base64" - "encoding/json" - "reflect" - "unsafe" - - "github.com/bytedance/sonic/internal/rt" -) - -var ( - boolType = reflect.TypeOf(bool(false)) - byteType = reflect.TypeOf(byte(0)) - intType = reflect.TypeOf(int(0)) - int8Type = reflect.TypeOf(int8(0)) - int16Type = reflect.TypeOf(int16(0)) - int32Type = reflect.TypeOf(int32(0)) - int64Type = reflect.TypeOf(int64(0)) - uintType = reflect.TypeOf(uint(0)) - uint8Type = reflect.TypeOf(uint8(0)) - uint16Type = reflect.TypeOf(uint16(0)) - uint32Type = reflect.TypeOf(uint32(0)) - uint64Type = reflect.TypeOf(uint64(0)) - float32Type = reflect.TypeOf(float32(0)) - float64Type = reflect.TypeOf(float64(0)) - stringType = reflect.TypeOf("") - bytesType = reflect.TypeOf([]byte(nil)) - jsonNumberType = reflect.TypeOf(json.Number("")) - base64CorruptInputError = reflect.TypeOf(base64.CorruptInputError(0)) - anyType = rt.UnpackType(reflect.TypeOf((*interface{})(nil)).Elem()) -) - -var ( - errorType = reflect.TypeOf((*error)(nil)).Elem() - jsonUnmarshalerType = reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() - encodingTextUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem() -) - -func rtype(t reflect.Type) (*rt.GoItab, *rt.GoType) { - p := (*rt.GoIface)(unsafe.Pointer(&t)) - return p.Itab, (*rt.GoType)(p.Value) -} diff --git a/vendor/github.com/bytedance/sonic/internal/encoder/alg/mapiter.go b/vendor/github.com/bytedance/sonic/internal/encoder/alg/mapiter.go deleted file mode 100644 index 5d9956a90..000000000 --- a/vendor/github.com/bytedance/sonic/internal/encoder/alg/mapiter.go +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package alg - -import ( - "encoding" - "reflect" - "strconv" - "sync" - "unsafe" - - "github.com/bytedance/sonic/internal/encoder/vars" - "github.com/bytedance/sonic/internal/rt" -) - -type _MapPair struct { - k string // when the map key is integer, k is pointed to m - v unsafe.Pointer - m [32]byte -} - -type MapIterator struct { - It rt.GoMapIterator // must be the first field - kv rt.GoSlice // slice of _MapPair - ki int -} - -var ( - iteratorPool = sync.Pool{} - iteratorPair = rt.UnpackType(reflect.TypeOf(_MapPair{})) -) - -func init() { - if unsafe.Offsetof(MapIterator{}.It) != 0 { - panic("_MapIterator.it is not the first field") - } -} - - -func newIterator() *MapIterator { - if v := iteratorPool.Get(); v == nil { - return new(MapIterator) - } else { - return resetIterator(v.(*MapIterator)) - } -} - -func resetIterator(p *MapIterator) *MapIterator { - p.ki = 0 - p.It = rt.GoMapIterator{} - p.kv.Len = 0 - return p -} - -func (self *MapIterator) at(i int) *_MapPair { - return (*_MapPair)(unsafe.Pointer(uintptr(self.kv.Ptr) + uintptr(i) * unsafe.Sizeof(_MapPair{}))) -} - -func (self *MapIterator) add() (p *_MapPair) { - p = self.at(self.kv.Len) - self.kv.Len++ - return -} - -func (self *MapIterator) data() (p []_MapPair) { - *(*rt.GoSlice)(unsafe.Pointer(&p)) = self.kv - return -} - -func (self *MapIterator) append(t *rt.GoType, k unsafe.Pointer, v unsafe.Pointer) (err error) { - p := self.add() - p.v = v - - /* check for strings */ - if tk := t.Kind(); tk != reflect.String { - return self.appendGeneric(p, t, tk, k) - } - - /* fast path for strings */ - p.k = *(*string)(k) - return nil -} - -func (self *MapIterator) appendGeneric(p *_MapPair, t *rt.GoType, v reflect.Kind, k unsafe.Pointer) error { - switch v { - case reflect.Int : p.k = rt.Mem2Str(strconv.AppendInt(p.m[:0], int64(*(*int)(k)), 10)) ; return nil - case reflect.Int8 : p.k = rt.Mem2Str(strconv.AppendInt(p.m[:0], int64(*(*int8)(k)), 10)) ; return nil - case reflect.Int16 : p.k = rt.Mem2Str(strconv.AppendInt(p.m[:0], int64(*(*int16)(k)), 10)) ; return nil - case reflect.Int32 : p.k = rt.Mem2Str(strconv.AppendInt(p.m[:0], int64(*(*int32)(k)), 10)) ; return nil - case reflect.Int64 : p.k = rt.Mem2Str(strconv.AppendInt(p.m[:0], int64(*(*int64)(k)), 10)) ; return nil - case reflect.Uint : p.k = rt.Mem2Str(strconv.AppendUint(p.m[:0], uint64(*(*uint)(k)), 10)) ; return nil - case reflect.Uint8 : p.k = rt.Mem2Str(strconv.AppendUint(p.m[:0], uint64(*(*uint8)(k)), 10)) ; return nil - case reflect.Uint16 : p.k = rt.Mem2Str(strconv.AppendUint(p.m[:0], uint64(*(*uint16)(k)), 10)) ; return nil - case reflect.Uint32 : p.k = rt.Mem2Str(strconv.AppendUint(p.m[:0], uint64(*(*uint32)(k)), 10)) ; return nil - case reflect.Uint64 : p.k = rt.Mem2Str(strconv.AppendUint(p.m[:0], uint64(*(*uint64)(k)), 10)) ; return nil - case reflect.Uintptr : p.k = rt.Mem2Str(strconv.AppendUint(p.m[:0], uint64(*(*uintptr)(k)), 10)) ; return nil - case reflect.Interface : return self.appendInterface(p, t, k) - case reflect.Struct, reflect.Ptr : return self.appendConcrete(p, t, k) - default : panic("unexpected map key type") - } -} - -func (self *MapIterator) appendConcrete(p *_MapPair, t *rt.GoType, k unsafe.Pointer) (err error) { - // compiler has already checked that the type implements the encoding.MarshalText interface - if !t.Indirect() { - k = *(*unsafe.Pointer)(k) - } - eface := rt.GoEface{Value: k, Type: t}.Pack() - out, err := eface.(encoding.TextMarshaler).MarshalText() - if err != nil { - return err - } - p.k = rt.Mem2Str(out) - return -} - -func (self *MapIterator) appendInterface(p *_MapPair, t *rt.GoType, k unsafe.Pointer) (err error) { - if len(rt.IfaceType(t).Methods) == 0 { - panic("unexpected map key type") - } else if p.k, err = asText(k); err == nil { - return nil - } else { - return - } -} - -func IteratorStop(p *MapIterator) { - iteratorPool.Put(p) -} - -func IteratorNext(p *MapIterator) { - i := p.ki - t := &p.It - - /* check for unordered iteration */ - if i < 0 { - rt.Mapiternext(t) - return - } - - /* check for end of iteration */ - if p.ki >= p.kv.Len { - t.K = nil - t.V = nil - return - } - - /* update the key-value pair, and increase the pointer */ - t.K = unsafe.Pointer(&p.at(p.ki).k) - t.V = p.at(p.ki).v - p.ki++ -} - -func IteratorStart(t *rt.GoMapType, m *rt.GoMap, fv uint64) (*MapIterator, error) { - it := newIterator() - rt.Mapiterinit(t, m, &it.It) - - /* check for key-sorting, empty map don't need sorting */ - if m.Count == 0 || (fv & (1< it.kv.Cap { - it.kv = rt.GrowSlice(iteratorPair, it.kv, m.Count) - } - - /* dump all the key-value pairs */ - for ; it.It.K != nil; rt.Mapiternext(&it.It) { - if err := it.append(t.Key, it.It.K, it.It.V); err != nil { - IteratorStop(it) - return nil, err - } - } - - /* sort the keys, map with only 1 item don't need sorting */ - if it.ki = 1; m.Count > 1 { - radixQsort(it.data(), 0, maxDepth(it.kv.Len)) - } - - /* load the first pair into iterator */ - it.It.V = it.at(0).v - it.It.K = unsafe.Pointer(&it.at(0).k) - return it, nil -} - -func asText(v unsafe.Pointer) (string, error) { - text := rt.AssertI2I(rt.UnpackType(vars.EncodingTextMarshalerType), *(*rt.GoIface)(v)) - r, e := (*(*encoding.TextMarshaler)(unsafe.Pointer(&text))).MarshalText() - return rt.Mem2Str(r), e -} diff --git a/vendor/github.com/bytedance/sonic/internal/encoder/alg/opts.go b/vendor/github.com/bytedance/sonic/internal/encoder/alg/opts.go deleted file mode 100644 index c19e2de4e..000000000 --- a/vendor/github.com/bytedance/sonic/internal/encoder/alg/opts.go +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright 2024 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package alg - -const ( - BitSortMapKeys = iota - BitEscapeHTML - BitCompactMarshaler - BitNoQuoteTextMarshaler - BitNoNullSliceOrMap - BitValidateString - BitNoValidateJSONMarshaler - BitNoEncoderNewline - BitEncodeNullForInfOrNan - - BitPointerValue = 63 -) diff --git a/vendor/github.com/bytedance/sonic/internal/encoder/alg/primitives.go b/vendor/github.com/bytedance/sonic/internal/encoder/alg/primitives.go deleted file mode 100644 index 63fa01890..000000000 --- a/vendor/github.com/bytedance/sonic/internal/encoder/alg/primitives.go +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Copyright 2024 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package alg - -import ( - "encoding" - "encoding/json" - - "github.com/bytedance/sonic/internal/encoder/vars" - "github.com/bytedance/sonic/internal/rt" -) - -func Compact(p *[]byte, v []byte) error { - buf := vars.NewBuffer() - err := json.Compact(buf, v) - - /* check for errors */ - if err != nil { - return err - } - - /* add to result */ - v = buf.Bytes() - *p = append(*p, v...) - - /* return the buffer into pool */ - vars.FreeBuffer(buf) - return nil -} - -func EncodeNil(rb *[]byte) error { - *rb = append(*rb, 'n', 'u', 'l', 'l') - return nil -} - -// func Make_EncodeTypedPointer(computor func(*rt.GoType, ...interface{}) (interface{}, error)) func(*[]byte, *rt.GoType, *unsafe.Pointer, *vars.Stack, uint64) error { -// return func(buf *[]byte, vt *rt.GoType, vp *unsafe.Pointer, sb *vars.Stack, fv uint64) error { -// if vt == nil { -// return EncodeNil(buf) -// } else if fn, err := vars.FindOrCompile(vt, (fv&(1< 11 { - // To avoid the worst case of quickSort (time: O(n^2)), use introsort here. - // Reference: https://en.wikipedia.org/wiki/Introsort and - // https://github.com/golang/go/issues/467 - if maxDepth == 0 { - heapSort(kvs, 0, len(kvs)) - return - } - maxDepth-- - - p := pivot(kvs, d) - lt, i, gt := 0, 0, len(kvs) - for i < gt { - c := byteAt(kvs[i].k, d) - if c < p { - swap(kvs, lt, i) - i++ - lt++ - } else if c > p { - gt-- - swap(kvs, i, gt) - } else { - i++ - } - } - - // kvs[0:lt] < v = kvs[lt:gt] < kvs[gt:len(kvs)] - // Native implementation: - // radixQsort(kvs[:lt], d, maxDepth) - // if p > -1 { - // radixQsort(kvs[lt:gt], d+1, maxDepth) - // } - // radixQsort(kvs[gt:], d, maxDepth) - // Optimize as follows: make recursive calls only for the smaller parts. - // Reference: https://www.geeksforgeeks.org/quicksort-tail-call-optimization-reducing-worst-case-space-log-n/ - if p == -1 { - if lt > len(kvs) - gt { - radixQsort(kvs[gt:], d, maxDepth) - kvs = kvs[:lt] - } else { - radixQsort(kvs[:lt], d, maxDepth) - kvs = kvs[gt:] - } - } else { - ml := maxThree(lt, gt-lt, len(kvs)-gt) - if ml == lt { - radixQsort(kvs[lt:gt], d+1, maxDepth) - radixQsort(kvs[gt:], d, maxDepth) - kvs = kvs[:lt] - } else if ml == gt-lt { - radixQsort(kvs[:lt], d, maxDepth) - radixQsort(kvs[gt:], d, maxDepth) - kvs = kvs[lt:gt] - d += 1 - } else { - radixQsort(kvs[:lt], d, maxDepth) - radixQsort(kvs[lt:gt], d+1, maxDepth) - kvs = kvs[gt:] - } - } - } - insertRadixSort(kvs, d) -} - -func insertRadixSort(kvs []_MapPair, d int) { - for i := 1; i < len(kvs); i++ { - for j := i; j > 0 && lessFrom(kvs[j].k, kvs[j-1].k, d); j-- { - swap(kvs, j, j-1) - } - } -} - -func pivot(kvs []_MapPair, d int) int { - m := len(kvs) >> 1 - if len(kvs) > 40 { - // Tukey's ``Ninther,'' median of three mediankvs of three. - t := len(kvs) / 8 - return medianThree( - medianThree(byteAt(kvs[0].k, d), byteAt(kvs[t].k, d), byteAt(kvs[2*t].k, d)), - medianThree(byteAt(kvs[m].k, d), byteAt(kvs[m-t].k, d), byteAt(kvs[m+t].k, d)), - medianThree(byteAt(kvs[len(kvs)-1].k, d), - byteAt(kvs[len(kvs)-1-t].k, d), - byteAt(kvs[len(kvs)-1-2*t].k, d))) - } - return medianThree(byteAt(kvs[0].k, d), byteAt(kvs[m].k, d), byteAt(kvs[len(kvs)-1].k, d)) -} - -func medianThree(i, j, k int) int { - if i > j { - i, j = j, i - } // i < j - if k < i { - return i - } - if k > j { - return j - } - return k -} - -func maxThree(i, j, k int) int { - max := i - if max < j { - max = j - } - if max < k { - max = k - } - return max -} - -// maxDepth returns a threshold at which quicksort should switch -// to heapsort. It returnkvs 2*ceil(lg(n+1)). -func maxDepth(n int) int { - var depth int - for i := n; i > 0; i >>= 1 { - depth++ - } - return depth * 2 -} - -// siftDown implements the heap property on kvs[lo:hi]. -// first is an offset into the array where the root of the heap lies. -func siftDown(kvs []_MapPair, lo, hi, first int) { - root := lo - for { - child := 2*root + 1 - if child >= hi { - break - } - if child+1 < hi && kvs[first+child].k < kvs[first+child+1].k { - child++ - } - if kvs[first+root].k >= kvs[first+child].k { - return - } - swap(kvs, first+root, first+child) - root = child - } -} - -func heapSort(kvs []_MapPair, a, b int) { - first := a - lo := 0 - hi := b - a - - // Build heap with the greatest element at top. - for i := (hi - 1) / 2; i >= 0; i-- { - siftDown(kvs, i, hi, first) - } - - // Pop elements, the largest first, into end of kvs. - for i := hi - 1; i >= 0; i-- { - swap(kvs, first, first+i) - siftDown(kvs, lo, i, first) - } -} - -// Note that _MapPair.k is NOT pointed to _MapPair.m when map key is integer after swap -func swap(kvs []_MapPair, a, b int) { - kvs[a].k, kvs[b].k = kvs[b].k, kvs[a].k - kvs[a].v, kvs[b].v = kvs[b].v, kvs[a].v -} - -// Compare two strings from the pos d. -func lessFrom(a, b string, d int) bool { - l := len(a) - if l > len(b) { - l = len(b) - } - for i := d; i < l; i++ { - if a[i] == b[i] { - continue - } - return a[i] < b[i] - } - return len(a) < len(b) -} - -func byteAt(b string, p int) int { - if p < len(b) { - return int(b[p]) - } - return -1 -} diff --git a/vendor/github.com/bytedance/sonic/internal/encoder/alg/spec.go b/vendor/github.com/bytedance/sonic/internal/encoder/alg/spec.go deleted file mode 100644 index bff943626..000000000 --- a/vendor/github.com/bytedance/sonic/internal/encoder/alg/spec.go +++ /dev/null @@ -1,198 +0,0 @@ -//go:build (amd64 && go1.16 && !go1.24) || (arm64 && go1.20 && !go1.24) -// +build amd64,go1.16,!go1.24 arm64,go1.20,!go1.24 - -/** - * Copyright 2024 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package alg - -import ( - "runtime" - "unsafe" - - "github.com/bytedance/sonic/internal/native" - "github.com/bytedance/sonic/internal/native/types" - "github.com/bytedance/sonic/internal/rt" -) - -// Valid validates json and returns first non-blank character position, -// if it is only one valid json value. -// Otherwise returns invalid character position using start. -// -// Note: it does not check for the invalid UTF-8 characters. -func Valid(data []byte) (ok bool, start int) { - n := len(data) - if n == 0 { - return false, -1 - } - s := rt.Mem2Str(data) - p := 0 - m := types.NewStateMachine() - ret := native.ValidateOne(&s, &p, m, 0) - types.FreeStateMachine(m) - - if ret < 0 { - return false, p-1 - } - - /* check for trailing spaces */ - for ;p < n; p++ { - if (types.SPACE_MASK & (1 << data[p])) == 0 { - return false, p - } - } - - return true, ret -} - -var typeByte = rt.UnpackEface(byte(0)).Type - -//go:nocheckptr -func Quote(buf []byte, val string, double bool) []byte { - if len(val) == 0 { - if double { - return append(buf, `"\"\""`...) - } - return append(buf, `""`...) - } - - if double { - buf = append(buf, `"\"`...) - } else { - buf = append(buf, `"`...) - } - sp := rt.IndexChar(val, 0) - nb := len(val) - b := (*rt.GoSlice)(unsafe.Pointer(&buf)) - - // input buffer - for nb > 0 { - // output buffer - dp := unsafe.Pointer(uintptr(b.Ptr) + uintptr(b.Len)) - dn := b.Cap - b.Len - // call native.Quote, dn is byte count it outputs - opts := uint64(0) - if double { - opts = types.F_DOUBLE_UNQUOTE - } - ret := native.Quote(sp, nb, dp, &dn, opts) - // update *buf length - b.Len += dn - - // no need more output - if ret >= 0 { - break - } - - // double buf size - *b = rt.GrowSlice(typeByte, *b, b.Cap*2) - // ret is the complement of consumed input - ret = ^ret - // update input buffer - nb -= ret - sp = unsafe.Pointer(uintptr(sp) + uintptr(ret)) - } - - runtime.KeepAlive(buf) - runtime.KeepAlive(sp) - if double { - buf = append(buf, `\""`...) - } else { - buf = append(buf, `"`...) - } - - return buf -} - -func HtmlEscape(dst []byte, src []byte) []byte { - var sidx int - - dst = append(dst, src[:0]...) // avoid check nil dst - sbuf := (*rt.GoSlice)(unsafe.Pointer(&src)) - dbuf := (*rt.GoSlice)(unsafe.Pointer(&dst)) - - /* grow dst if it is shorter */ - if cap(dst)-len(dst) < len(src)+types.BufPaddingSize { - cap := len(src)*3/2 + types.BufPaddingSize - *dbuf = rt.GrowSlice(typeByte, *dbuf, cap) - } - - for sidx < sbuf.Len { - sp := rt.Add(sbuf.Ptr, uintptr(sidx)) - dp := rt.Add(dbuf.Ptr, uintptr(dbuf.Len)) - - sn := sbuf.Len - sidx - dn := dbuf.Cap - dbuf.Len - nb := native.HTMLEscape(sp, sn, dp, &dn) - - /* check for errors */ - if dbuf.Len += dn; nb >= 0 { - break - } - - /* not enough space, grow the slice and try again */ - sidx += ^nb - *dbuf = rt.GrowSlice(typeByte, *dbuf, dbuf.Cap*2) - } - return dst -} - -func F64toa(buf []byte, v float64) ([]byte) { - if v == 0 { - return append(buf, '0') - } - buf = rt.GuardSlice2(buf, 64) - ret := native.F64toa((*byte)(rt.IndexByte(buf, len(buf))), v) - if ret > 0 { - return buf[:len(buf)+ret] - } else { - return buf - } -} - -func F32toa(buf []byte, v float32) ([]byte) { - if v == 0 { - return append(buf, '0') - } - buf = rt.GuardSlice2(buf, 64) - ret := native.F32toa((*byte)(rt.IndexByte(buf, len(buf))), v) - if ret > 0 { - return buf[:len(buf)+ret] - } else { - return buf - } -} - -func I64toa(buf []byte, v int64) ([]byte) { - buf = rt.GuardSlice2(buf, 32) - ret := native.I64toa((*byte)(rt.IndexByte(buf, len(buf))), v) - if ret > 0 { - return buf[:len(buf)+ret] - } else { - return buf - } -} - -func U64toa(buf []byte, v uint64) ([]byte) { - buf = rt.GuardSlice2(buf, 32) - ret := native.U64toa((*byte)(rt.IndexByte(buf, len(buf))), v) - if ret > 0 { - return buf[:len(buf)+ret] - } else { - return buf - } -} - diff --git a/vendor/github.com/bytedance/sonic/internal/encoder/alg/spec_compat.go b/vendor/github.com/bytedance/sonic/internal/encoder/alg/spec_compat.go deleted file mode 100644 index c15cbf7d8..000000000 --- a/vendor/github.com/bytedance/sonic/internal/encoder/alg/spec_compat.go +++ /dev/null @@ -1,148 +0,0 @@ -// +build !amd64,!arm64 go1.24 !go1.16 arm64,!go1.20 - -/** - * Copyright 2024 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package alg - -import ( - _ "unsafe" - "unicode/utf8" - "strconv" - "bytes" - "encoding/json" - - "github.com/bytedance/sonic/internal/rt" -) - -// Valid validates json and returns first non-blank character position, -// if it is only one valid json value. -// Otherwise returns invalid character position using start. -// -// Note: it does not check for the invalid UTF-8 characters. -func Valid(data []byte) (ok bool, start int) { - ok = json.Valid(data) - return ok, 0 -} - -var typeByte = rt.UnpackEface(byte(0)).Type - -func Quote(e []byte, s string, double bool) []byte { - if len(s) == 0 { - if double { - return append(e, `"\"\""`...) - } - return append(e, `""`...) - } - - b := e - ss := len(e) - e = append(e, '"') - start := 0 - - for i := 0; i < len(s); { - if b := s[i]; b < utf8.RuneSelf { - if rt.SafeSet[b] { - i++ - continue - } - if start < i { - e = append(e, s[start:i]...) - } - e = append(e, '\\') - switch b { - case '\\', '"': - e = append(e, b) - case '\n': - e = append(e, 'n') - case '\r': - e = append(e, 'r') - case '\t': - e = append(e, 't') - default: - // This encodes bytes < 0x20 except for \t, \n and \r. - // If escapeHTML is set, it also escapes <, >, and & - // because they can lead to security holes when - // user-controlled strings are rendered into JSON - // and served to some browsers. - e = append(e, `u00`...) - e = append(e, rt.Hex[b>>4]) - e = append(e, rt.Hex[b&0xF]) - } - i++ - start = i - continue - } - c, size := utf8.DecodeRuneInString(s[i:]) - // if correct && c == utf8.RuneError && size == 1 { - // if start < i { - // e = append(e, s[start:i]...) - // } - // e = append(e, `\ufffd`...) - // i += size - // start = i - // continue - // } - if c == '\u2028' || c == '\u2029' { - if start < i { - e = append(e, s[start:i]...) - } - e = append(e, `\u202`...) - e = append(e, rt.Hex[c&0xF]) - i += size - start = i - continue - } - i += size - } - - if start < len(s) { - e = append(e, s[start:]...) - } - e = append(e, '"') - - if double { - return strconv.AppendQuote(b, string(e[ss:])) - } else { - return e - } -} - -func HtmlEscape(dst []byte, src []byte) []byte { - buf := bytes.NewBuffer(dst) - json.HTMLEscape(buf, src) - return buf.Bytes() -} - -func F64toa(buf []byte, v float64) ([]byte) { - bs := bytes.NewBuffer(buf) - _ = json.NewEncoder(bs).Encode(v) - return bs.Bytes() -} - -func F32toa(buf []byte, v float32) ([]byte) { - bs := bytes.NewBuffer(buf) - _ = json.NewEncoder(bs).Encode(v) - return bs.Bytes() -} - -func I64toa(buf []byte, v int64) ([]byte) { - return strconv.AppendInt(buf, int64(v), 10) -} - -func U64toa(buf []byte, v uint64) ([]byte) { - return strconv.AppendUint(buf, v, 10) -} diff --git a/vendor/github.com/bytedance/sonic/internal/encoder/compiler.go b/vendor/github.com/bytedance/sonic/internal/encoder/compiler.go deleted file mode 100644 index 902fbc98b..000000000 --- a/vendor/github.com/bytedance/sonic/internal/encoder/compiler.go +++ /dev/null @@ -1,676 +0,0 @@ -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package encoder - -import ( - "reflect" - "unsafe" - - "github.com/bytedance/sonic/internal/encoder/ir" - "github.com/bytedance/sonic/internal/encoder/vars" - "github.com/bytedance/sonic/internal/encoder/vm" - "github.com/bytedance/sonic/internal/resolver" - "github.com/bytedance/sonic/internal/rt" - "github.com/bytedance/sonic/option" -) - -func ForceUseVM() { - vm.SetCompiler(makeEncoderVM) - pretouchType = pretouchTypeVM - encodeTypedPointer = vm.EncodeTypedPointer - vars.UseVM = true -} - -var encodeTypedPointer func(buf *[]byte, vt *rt.GoType, vp *unsafe.Pointer, sb *vars.Stack, fv uint64) error - -func makeEncoderVM(vt *rt.GoType, ex ...interface{}) (interface{}, error) { - pp, err := NewCompiler().Compile(vt.Pack(), ex[0].(bool)) - if err != nil { - return nil, err - } - return &pp, nil -} - -var pretouchType func(_vt reflect.Type, opts option.CompileOptions, v uint8) (map[reflect.Type]uint8, error) - -func pretouchTypeVM(_vt reflect.Type, opts option.CompileOptions, v uint8) (map[reflect.Type]uint8, error) { - /* compile function */ - compiler := NewCompiler().apply(opts) - - /* find or compile */ - vt := rt.UnpackType(_vt) - if val := vars.GetProgram(vt); val != nil { - return nil, nil - } else if _, err := vars.ComputeProgram(vt, makeEncoderVM, v == 1); err == nil { - return compiler.rec, nil - } else { - return nil, err - } -} - -func pretouchRec(vtm map[reflect.Type]uint8, opts option.CompileOptions) error { - if opts.RecursiveDepth < 0 || len(vtm) == 0 { - return nil - } - next := make(map[reflect.Type]uint8) - for vt, v := range vtm { - sub, err := pretouchType(vt, opts, v) - if err != nil { - return err - } - for svt, v := range sub { - next[svt] = v - } - } - opts.RecursiveDepth -= 1 - return pretouchRec(next, opts) -} - -type Compiler struct { - opts option.CompileOptions - pv bool - tab map[reflect.Type]bool - rec map[reflect.Type]uint8 -} - -func NewCompiler() *Compiler { - return &Compiler{ - opts: option.DefaultCompileOptions(), - tab: map[reflect.Type]bool{}, - rec: map[reflect.Type]uint8{}, - } -} - -func (self *Compiler) apply(opts option.CompileOptions) *Compiler { - self.opts = opts - if self.opts.RecursiveDepth > 0 { - self.rec = map[reflect.Type]uint8{} - } - return self -} - -func (self *Compiler) rescue(ep *error) { - if val := recover(); val != nil { - if err, ok := val.(error); ok { - *ep = err - } else { - panic(val) - } - } -} - -func (self *Compiler) Compile(vt reflect.Type, pv bool) (ret ir.Program, err error) { - defer self.rescue(&err) - self.compileOne(&ret, 0, vt, pv) - return -} - -func (self *Compiler) compileOne(p *ir.Program, sp int, vt reflect.Type, pv bool) { - if self.tab[vt] { - p.Vp(ir.OP_recurse, vt, pv) - } else { - self.compileRec(p, sp, vt, pv) - } -} - -func (self *Compiler) tryCompileMarshaler(p *ir.Program, vt reflect.Type, pv bool) bool { - pt := reflect.PtrTo(vt) - - /* check for addressable `json.Marshaler` with pointer receiver */ - if pv && pt.Implements(vars.JsonMarshalerType) { - addMarshalerOp(p, ir.OP_marshal_p, pt, vars.JsonMarshalerType) - return true - } - - /* check for `json.Marshaler` */ - if vt.Implements(vars.JsonMarshalerType) { - self.compileMarshaler(p, ir.OP_marshal, vt, vars.JsonMarshalerType) - return true - } - - /* check for addressable `encoding.TextMarshaler` with pointer receiver */ - if pv && pt.Implements(vars.EncodingTextMarshalerType) { - addMarshalerOp(p, ir.OP_marshal_text_p, pt, vars.EncodingTextMarshalerType) - return true - } - - /* check for `encoding.TextMarshaler` */ - if vt.Implements(vars.EncodingTextMarshalerType) { - self.compileMarshaler(p, ir.OP_marshal_text, vt, vars.EncodingTextMarshalerType) - return true - } - - return false -} - -func (self *Compiler) compileRec(p *ir.Program, sp int, vt reflect.Type, pv bool) { - pr := self.pv - - if self.tryCompileMarshaler(p, vt, pv) { - return - } - - /* enter the recursion, and compile the type */ - self.pv = pv - self.tab[vt] = true - self.compileOps(p, sp, vt) - - /* exit the recursion */ - self.pv = pr - delete(self.tab, vt) -} - -func (self *Compiler) compileOps(p *ir.Program, sp int, vt reflect.Type) { - switch vt.Kind() { - case reflect.Bool: - p.Add(ir.OP_bool) - case reflect.Int: - p.Add(ir.OP_int()) - case reflect.Int8: - p.Add(ir.OP_i8) - case reflect.Int16: - p.Add(ir.OP_i16) - case reflect.Int32: - p.Add(ir.OP_i32) - case reflect.Int64: - p.Add(ir.OP_i64) - case reflect.Uint: - p.Add(ir.OP_uint()) - case reflect.Uint8: - p.Add(ir.OP_u8) - case reflect.Uint16: - p.Add(ir.OP_u16) - case reflect.Uint32: - p.Add(ir.OP_u32) - case reflect.Uint64: - p.Add(ir.OP_u64) - case reflect.Uintptr: - p.Add(ir.OP_uintptr()) - case reflect.Float32: - p.Add(ir.OP_f32) - case reflect.Float64: - p.Add(ir.OP_f64) - case reflect.String: - self.compileString(p, vt) - case reflect.Array: - self.compileArray(p, sp, vt.Elem(), vt.Len()) - case reflect.Interface: - self.compileInterface(p, vt) - case reflect.Map: - self.compileMap(p, sp, vt) - case reflect.Ptr: - self.compilePtr(p, sp, vt.Elem()) - case reflect.Slice: - self.compileSlice(p, sp, vt.Elem()) - case reflect.Struct: - self.compileStruct(p, sp, vt) - default: - panic(vars.Error_type(vt)) - } -} - -func (self *Compiler) compileNil(p *ir.Program, sp int, vt reflect.Type, nil_op ir.Op, fn func(*ir.Program, int, reflect.Type)) { - x := p.PC() - p.Add(ir.OP_is_nil) - fn(p, sp, vt) - e := p.PC() - p.Add(ir.OP_goto) - p.Pin(x) - p.Add(nil_op) - p.Pin(e) -} - -func (self *Compiler) compilePtr(p *ir.Program, sp int, vt reflect.Type) { - self.compileNil(p, sp, vt, ir.OP_null, self.compilePtrBody) -} - -func (self *Compiler) compilePtrBody(p *ir.Program, sp int, vt reflect.Type) { - p.Tag(sp) - p.Add(ir.OP_save) - p.Add(ir.OP_deref) - self.compileOne(p, sp+1, vt, true) - p.Add(ir.OP_drop) -} - -func (self *Compiler) compileMap(p *ir.Program, sp int, vt reflect.Type) { - self.compileNil(p, sp, vt, ir.OP_empty_obj, self.compileMapBody) -} - -func (self *Compiler) compileMapBody(p *ir.Program, sp int, vt reflect.Type) { - p.Tag(sp + 1) - p.Int(ir.OP_byte, '{') - e := p.PC() - p.Add(ir.OP_is_zero_map) - p.Add(ir.OP_save) - p.Rtt(ir.OP_map_iter, vt) - p.Add(ir.OP_save) - i := p.PC() - p.Add(ir.OP_map_check_key) - u := p.PC() - p.Add(ir.OP_map_write_key) - self.compileMapBodyKey(p, vt.Key()) - p.Pin(u) - p.Int(ir.OP_byte, ':') - p.Add(ir.OP_map_value_next) - self.compileOne(p, sp+2, vt.Elem(), false) - j := p.PC() - p.Add(ir.OP_map_check_key) - p.Int(ir.OP_byte, ',') - v := p.PC() - p.Add(ir.OP_map_write_key) - self.compileMapBodyKey(p, vt.Key()) - p.Pin(v) - p.Int(ir.OP_byte, ':') - p.Add(ir.OP_map_value_next) - self.compileOne(p, sp+2, vt.Elem(), false) - p.Int(ir.OP_goto, j) - p.Pin(i) - p.Pin(j) - p.Add(ir.OP_map_stop) - p.Add(ir.OP_drop_2) - p.Pin(e) - p.Int(ir.OP_byte, '}') -} - -func (self *Compiler) compileMapBodyKey(p *ir.Program, vk reflect.Type) { - if !vk.Implements(vars.EncodingTextMarshalerType) { - self.compileMapBodyTextKey(p, vk) - } else { - self.compileMapBodyUtextKey(p, vk) - } -} - -func (self *Compiler) compileMapBodyTextKey(p *ir.Program, vk reflect.Type) { - switch vk.Kind() { - case reflect.Invalid: - panic("map key is nil") - case reflect.Bool: - p.Key(ir.OP_bool) - case reflect.Int: - p.Key(ir.OP_int()) - case reflect.Int8: - p.Key(ir.OP_i8) - case reflect.Int16: - p.Key(ir.OP_i16) - case reflect.Int32: - p.Key(ir.OP_i32) - case reflect.Int64: - p.Key(ir.OP_i64) - case reflect.Uint: - p.Key(ir.OP_uint()) - case reflect.Uint8: - p.Key(ir.OP_u8) - case reflect.Uint16: - p.Key(ir.OP_u16) - case reflect.Uint32: - p.Key(ir.OP_u32) - case reflect.Uint64: - p.Key(ir.OP_u64) - case reflect.Uintptr: - p.Key(ir.OP_uintptr()) - case reflect.Float32: - p.Key(ir.OP_f32) - case reflect.Float64: - p.Key(ir.OP_f64) - case reflect.String: - self.compileString(p, vk) - default: - panic(vars.Error_type(vk)) - } -} - -func (self *Compiler) compileMapBodyUtextKey(p *ir.Program, vk reflect.Type) { - if vk.Kind() != reflect.Ptr { - addMarshalerOp(p, ir.OP_marshal_text, vk, vars.EncodingTextMarshalerType) - } else { - self.compileMapBodyUtextPtr(p, vk) - } -} - -func (self *Compiler) compileMapBodyUtextPtr(p *ir.Program, vk reflect.Type) { - i := p.PC() - p.Add(ir.OP_is_nil) - addMarshalerOp(p, ir.OP_marshal_text, vk, vars.EncodingTextMarshalerType) - j := p.PC() - p.Add(ir.OP_goto) - p.Pin(i) - p.Str(ir.OP_text, "\"\"") - p.Pin(j) -} - -func (self *Compiler) compileSlice(p *ir.Program, sp int, vt reflect.Type) { - self.compileNil(p, sp, vt, ir.OP_empty_arr, self.compileSliceBody) -} - -func (self *Compiler) compileSliceBody(p *ir.Program, sp int, vt reflect.Type) { - if vars.IsSimpleByte(vt) { - p.Add(ir.OP_bin) - } else { - self.compileSliceArray(p, sp, vt) - } -} - -func (self *Compiler) compileSliceArray(p *ir.Program, sp int, vt reflect.Type) { - p.Tag(sp) - p.Int(ir.OP_byte, '[') - e := p.PC() - p.Add(ir.OP_is_nil) - p.Add(ir.OP_save) - p.Add(ir.OP_slice_len) - i := p.PC() - p.Rtt(ir.OP_slice_next, vt) - self.compileOne(p, sp+1, vt, true) - j := p.PC() - p.Rtt(ir.OP_slice_next, vt) - p.Int(ir.OP_byte, ',') - self.compileOne(p, sp+1, vt, true) - p.Int(ir.OP_goto, j) - p.Pin(i) - p.Pin(j) - p.Add(ir.OP_drop) - p.Pin(e) - p.Int(ir.OP_byte, ']') -} - -func (self *Compiler) compileArray(p *ir.Program, sp int, vt reflect.Type, nb int) { - p.Tag(sp) - p.Int(ir.OP_byte, '[') - p.Add(ir.OP_save) - - /* first item */ - if nb != 0 { - self.compileOne(p, sp+1, vt, self.pv) - p.Add(ir.OP_load) - } - - /* remaining items */ - for i := 1; i < nb; i++ { - p.Int(ir.OP_byte, ',') - p.Int(ir.OP_index, i*int(vt.Size())) - self.compileOne(p, sp+1, vt, self.pv) - p.Add(ir.OP_load) - } - - /* end of array */ - p.Add(ir.OP_drop) - p.Int(ir.OP_byte, ']') -} - -func (self *Compiler) compileString(p *ir.Program, vt reflect.Type) { - if vt != vars.JsonNumberType { - p.Add(ir.OP_str) - } else { - p.Add(ir.OP_number) - } -} - -func (self *Compiler) compileStruct(p *ir.Program, sp int, vt reflect.Type) { - if sp >= self.opts.MaxInlineDepth || p.PC() >= vars.MAX_ILBUF || (sp > 0 && vt.NumField() >= vars.MAX_FIELDS) { - p.Vp(ir.OP_recurse, vt, self.pv) - if self.opts.RecursiveDepth > 0 { - if self.pv { - self.rec[vt] = 1 - } else { - self.rec[vt] = 0 - } - } - } else { - self.compileStructBody(p, sp, vt) - } -} - -func (self *Compiler) compileStructBody(p *ir.Program, sp int, vt reflect.Type) { - p.Tag(sp) - p.Int(ir.OP_byte, '{') - p.Add(ir.OP_save) - p.Add(ir.OP_cond_set) - - /* compile each field */ - for _, fv := range resolver.ResolveStruct(vt) { - var s []int - var o resolver.Offset - - /* "omitempty" for arrays */ - if fv.Type.Kind() == reflect.Array { - if fv.Type.Len() == 0 && (fv.Opts&resolver.F_omitempty) != 0 { - continue - } - } - - /* index to the field */ - for _, o = range fv.Path { - if p.Int(ir.OP_index, int(o.Size)); o.Kind == resolver.F_deref { - s = append(s, p.PC()) - p.Add(ir.OP_is_nil) - p.Add(ir.OP_deref) - } - } - - /* check for "omitempty" option */ - if fv.Type.Kind() != reflect.Struct && fv.Type.Kind() != reflect.Array && (fv.Opts&resolver.F_omitempty) != 0 { - s = append(s, p.PC()) - self.compileStructFieldZero(p, fv.Type) - } - - /* add the comma if not the first element */ - i := p.PC() - p.Add(ir.OP_cond_testc) - p.Int(ir.OP_byte, ',') - p.Pin(i) - - /* compile the key and value */ - ft := fv.Type - p.Str(ir.OP_text, Quote(fv.Name)+":") - - /* check for "stringnize" option */ - if (fv.Opts & resolver.F_stringize) == 0 { - self.compileOne(p, sp+1, ft, self.pv) - } else { - self.compileStructFieldStr(p, sp+1, ft) - } - - /* patch the skipping jumps and reload the struct pointer */ - p.Rel(s) - p.Add(ir.OP_load) - } - - /* end of object */ - p.Add(ir.OP_drop) - p.Int(ir.OP_byte, '}') -} - -func (self *Compiler) compileStructFieldStr(p *ir.Program, sp int, vt reflect.Type) { - // NOTICE: according to encoding/json, Marshaler type has higher priority than string option - // see issue: - if self.tryCompileMarshaler(p, vt, self.pv) { - return - } - - pc := -1 - ft := vt - sv := false - - /* dereference the pointer if needed */ - if ft.Kind() == reflect.Ptr { - ft = ft.Elem() - } - - /* check if it can be stringized */ - switch ft.Kind() { - case reflect.Bool: - sv = true - case reflect.Int: - sv = true - case reflect.Int8: - sv = true - case reflect.Int16: - sv = true - case reflect.Int32: - sv = true - case reflect.Int64: - sv = true - case reflect.Uint: - sv = true - case reflect.Uint8: - sv = true - case reflect.Uint16: - sv = true - case reflect.Uint32: - sv = true - case reflect.Uint64: - sv = true - case reflect.Uintptr: - sv = true - case reflect.Float32: - sv = true - case reflect.Float64: - sv = true - case reflect.String: - sv = true - } - - /* if it's not, ignore the "string" and follow the regular path */ - if !sv { - self.compileOne(p, sp, vt, self.pv) - return - } - - /* dereference the pointer */ - if vt.Kind() == reflect.Ptr { - pc = p.PC() - vt = vt.Elem() - p.Add(ir.OP_is_nil) - p.Add(ir.OP_deref) - } - - /* special case of a double-quoted string */ - if ft != vars.JsonNumberType && ft.Kind() == reflect.String { - p.Add(ir.OP_quote) - } else { - self.compileStructFieldQuoted(p, sp, vt) - } - - /* the "null" case of the pointer */ - if pc != -1 { - e := p.PC() - p.Add(ir.OP_goto) - p.Pin(pc) - p.Add(ir.OP_null) - p.Pin(e) - } -} - -func (self *Compiler) compileStructFieldZero(p *ir.Program, vt reflect.Type) { - switch vt.Kind() { - case reflect.Bool: - p.Add(ir.OP_is_zero_1) - case reflect.Int: - p.Add(ir.OP_is_zero_ints()) - case reflect.Int8: - p.Add(ir.OP_is_zero_1) - case reflect.Int16: - p.Add(ir.OP_is_zero_2) - case reflect.Int32: - p.Add(ir.OP_is_zero_4) - case reflect.Int64: - p.Add(ir.OP_is_zero_8) - case reflect.Uint: - p.Add(ir.OP_is_zero_ints()) - case reflect.Uint8: - p.Add(ir.OP_is_zero_1) - case reflect.Uint16: - p.Add(ir.OP_is_zero_2) - case reflect.Uint32: - p.Add(ir.OP_is_zero_4) - case reflect.Uint64: - p.Add(ir.OP_is_zero_8) - case reflect.Uintptr: - p.Add(ir.OP_is_nil) - case reflect.Float32: - p.Add(ir.OP_is_zero_4) - case reflect.Float64: - p.Add(ir.OP_is_zero_8) - case reflect.String: - p.Add(ir.OP_is_nil_p1) - case reflect.Interface: - p.Add(ir.OP_is_nil) - case reflect.Map: - p.Add(ir.OP_is_zero_map) - case reflect.Ptr: - p.Add(ir.OP_is_nil) - case reflect.Slice: - p.Add(ir.OP_is_nil_p1) - default: - panic(vars.Error_type(vt)) - } -} - -func (self *Compiler) compileStructFieldQuoted(p *ir.Program, sp int, vt reflect.Type) { - p.Int(ir.OP_byte, '"') - self.compileOne(p, sp, vt, self.pv) - p.Int(ir.OP_byte, '"') -} - -func (self *Compiler) compileInterface(p *ir.Program, vt reflect.Type) { - x := p.PC() - p.Add(ir.OP_is_nil_p1) - - /* iface and efaces are different */ - if vt.NumMethod() == 0 { - p.Add(ir.OP_eface) - } else { - p.Add(ir.OP_iface) - } - - /* the "null" value */ - e := p.PC() - p.Add(ir.OP_goto) - p.Pin(x) - p.Add(ir.OP_null) - p.Pin(e) -} - -func (self *Compiler) compileMarshaler(p *ir.Program, op ir.Op, vt reflect.Type, mt reflect.Type) { - pc := p.PC() - vk := vt.Kind() - - /* direct receiver */ - if vk != reflect.Ptr { - addMarshalerOp(p, op, vt, mt) - return - } - /* value receiver with a pointer type, check for nil before calling the marshaler */ - p.Add(ir.OP_is_nil) - - addMarshalerOp(p, op, vt, mt) - - i := p.PC() - p.Add(ir.OP_goto) - p.Pin(pc) - p.Add(ir.OP_null) - p.Pin(i) -} - -func addMarshalerOp(p *ir.Program, op ir.Op, vt reflect.Type, mt reflect.Type) { - if vars.UseVM { - itab := rt.GetItab(rt.IfaceType(rt.UnpackType(mt)), rt.UnpackType(vt), true) - p.Vtab(op, vt, itab) - } else { - // OPT: get itab here - p.Rtt(op, vt) - } -} diff --git a/vendor/github.com/bytedance/sonic/internal/encoder/encode_norace.go b/vendor/github.com/bytedance/sonic/internal/encoder/encode_norace.go deleted file mode 100644 index c53206433..000000000 --- a/vendor/github.com/bytedance/sonic/internal/encoder/encode_norace.go +++ /dev/null @@ -1,24 +0,0 @@ -//go:build !race -// +build !race - -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package encoder - -func encodeIntoCheckRace(buf *[]byte, val interface{}, opts Options) error { - return encodeInto(buf, val, opts) -} diff --git a/vendor/github.com/bytedance/sonic/internal/encoder/encode_race.go b/vendor/github.com/bytedance/sonic/internal/encoder/encode_race.go deleted file mode 100644 index c373c55f9..000000000 --- a/vendor/github.com/bytedance/sonic/internal/encoder/encode_race.go +++ /dev/null @@ -1,54 +0,0 @@ -//go:build race -// +build race - -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package encoder - -import ( - `encoding/json` - - `github.com/bytedance/sonic/internal/rt` -) - - -func helpDetectDataRace(val interface{}) { - var out []byte - defer func() { - if v := recover(); v != nil { - // NOTICE: help user to locate where panic occurs - println("panic when encoding on: ", truncate(out)) - panic(v) - } - }() - out, _ = json.Marshal(val) -} - -func encodeIntoCheckRace(buf *[]byte, val interface{}, opts Options) error { - err := encodeInto(buf, val, opts) - /* put last to make the panic from sonic will always be caught at first */ - helpDetectDataRace(val) - return err -} - -func truncate(json []byte) string { - if len(json) <= 256 { - return rt.Mem2Str(json) - } else { - return rt.Mem2Str(json[len(json)-256:]) - } -} diff --git a/vendor/github.com/bytedance/sonic/internal/encoder/encoder.go b/vendor/github.com/bytedance/sonic/internal/encoder/encoder.go deleted file mode 100644 index 4cba1a168..000000000 --- a/vendor/github.com/bytedance/sonic/internal/encoder/encoder.go +++ /dev/null @@ -1,318 +0,0 @@ -/* - * Copyright 2021 ByteDance Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package encoder - -import ( - "bytes" - "encoding/json" - "reflect" - "runtime" - "unsafe" - - "github.com/bytedance/sonic/utf8" - "github.com/bytedance/sonic/internal/encoder/alg" - "github.com/bytedance/sonic/internal/encoder/vars" - "github.com/bytedance/sonic/internal/rt" - "github.com/bytedance/sonic/option" -) - -// Options is a set of encoding options. -type Options uint64 - -const ( - // SortMapKeys indicates that the keys of a map needs to be sorted - // before serializing into JSON. - // WARNING: This hurts performance A LOT, USE WITH CARE. - SortMapKeys Options = 1 << alg.BitSortMapKeys - - // EscapeHTML indicates encoder to escape all HTML characters - // after serializing into JSON (see https://pkg.go.dev/encoding/json#HTMLEscape). - // WARNING: This hurts performance A LOT, USE WITH CARE. - EscapeHTML Options = 1 << alg.BitEscapeHTML - - // CompactMarshaler indicates that the output JSON from json.Marshaler - // is always compact and needs no validation - CompactMarshaler Options = 1 << alg.BitCompactMarshaler - - // NoQuoteTextMarshaler indicates that the output text from encoding.TextMarshaler - // is always escaped string and needs no quoting - NoQuoteTextMarshaler Options = 1 << alg.BitNoQuoteTextMarshaler - - // NoNullSliceOrMap indicates all empty Array or Object are encoded as '[]' or '{}', - // instead of 'null'. - // NOTE: The priority of this option is lower than json tag `omitempty`. - NoNullSliceOrMap Options = 1 << alg.BitNoNullSliceOrMap - - // ValidateString indicates that encoder should validate the input string - // before encoding it into JSON. - ValidateString Options = 1 << alg.BitValidateString - - // NoValidateJSONMarshaler indicates that the encoder should not validate the output string - // after encoding the JSONMarshaler to JSON. - NoValidateJSONMarshaler Options = 1 << alg.BitNoValidateJSONMarshaler - - // NoEncoderNewline indicates that the encoder should not add a newline after every message - NoEncoderNewline Options = 1 << alg.BitNoEncoderNewline - - // CompatibleWithStd is used to be compatible with std encoder. - CompatibleWithStd Options = SortMapKeys | EscapeHTML | CompactMarshaler - - // Encode Infinity or Nan float into `null`, instead of returning an error. - EncodeNullForInfOrNan Options = 1 << alg.BitEncodeNullForInfOrNan -) - -// Encoder represents a specific set of encoder configurations. -type Encoder struct { - Opts Options - prefix string - indent string -} - -// Encode returns the JSON encoding of v. -func (self *Encoder) Encode(v interface{}) ([]byte, error) { - if self.indent != "" || self.prefix != "" { - return EncodeIndented(v, self.prefix, self.indent, self.Opts) - } - return Encode(v, self.Opts) -} - -// SortKeys enables the SortMapKeys option. -func (self *Encoder) SortKeys() *Encoder { - self.Opts |= SortMapKeys - return self -} - -// SetEscapeHTML specifies if option EscapeHTML opens -func (self *Encoder) SetEscapeHTML(f bool) { - if f { - self.Opts |= EscapeHTML - } else { - self.Opts &= ^EscapeHTML - } -} - -// SetValidateString specifies if option ValidateString opens -func (self *Encoder) SetValidateString(f bool) { - if f { - self.Opts |= ValidateString - } else { - self.Opts &= ^ValidateString - } -} - -// SetNoValidateJSONMarshaler specifies if option NoValidateJSONMarshaler opens -func (self *Encoder) SetNoValidateJSONMarshaler(f bool) { - if f { - self.Opts |= NoValidateJSONMarshaler - } else { - self.Opts &= ^NoValidateJSONMarshaler - } -} - -// SetNoEncoderNewline specifies if option NoEncoderNewline opens -func (self *Encoder) SetNoEncoderNewline(f bool) { - if f { - self.Opts |= NoEncoderNewline - } else { - self.Opts &= ^NoEncoderNewline - } -} - - -// SetCompactMarshaler specifies if option CompactMarshaler opens -func (self *Encoder) SetCompactMarshaler(f bool) { - if f { - self.Opts |= CompactMarshaler - } else { - self.Opts &= ^CompactMarshaler - } -} - -// SetNoQuoteTextMarshaler specifies if option NoQuoteTextMarshaler opens -func (self *Encoder) SetNoQuoteTextMarshaler(f bool) { - if f { - self.Opts |= NoQuoteTextMarshaler - } else { - self.Opts &= ^NoQuoteTextMarshaler - } -} - -// SetIndent instructs the encoder to format each subsequent encoded -// value as if indented by the package-level function EncodeIndent(). -// Calling SetIndent("", "") disables indentation. -func (enc *Encoder) SetIndent(prefix, indent string) { - enc.prefix = prefix - enc.indent = indent -} - -// Quote returns the JSON-quoted version of s. -func Quote(s string) string { - buf := make([]byte, 0, len(s)+2) - buf = alg.Quote(buf, s, false) - return rt.Mem2Str(buf) -} - -// Encode returns the JSON encoding of val, encoded with opts. -func Encode(val interface{}, opts Options) ([]byte, error) { - var ret []byte - - buf := vars.NewBytes() - err := encodeIntoCheckRace(buf, val, opts) - - /* check for errors */ - if err != nil { - vars.FreeBytes(buf) - return nil, err - } - - /* htmlescape or correct UTF-8 if opts enable */ - old := buf - *buf = encodeFinish(*old, opts) - pbuf := ((*rt.GoSlice)(unsafe.Pointer(buf))).Ptr - pold := ((*rt.GoSlice)(unsafe.Pointer(old))).Ptr - - /* return when allocated a new buffer */ - if pbuf != pold { - vars.FreeBytes(old) - return *buf, nil - } - - /* make a copy of the result */ - if rt.CanSizeResue(cap(*buf)) { - ret = make([]byte, len(*buf)) - copy(ret, *buf) - vars.FreeBytes(buf) - } else { - ret = *buf - } - - /* return the buffer into pool */ - return ret, nil -} - -// EncodeInto is like Encode but uses a user-supplied buffer instead of allocating -// a new one. -func EncodeInto(buf *[]byte, val interface{}, opts Options) error { - err := encodeIntoCheckRace(buf, val, opts) - if err != nil { - return err - } - *buf = encodeFinish(*buf, opts) - return err -} - -func encodeInto(buf *[]byte, val interface{}, opts Options) error { - stk := vars.NewStack() - efv := rt.UnpackEface(val) - err := encodeTypedPointer(buf, efv.Type, &efv.Value, stk, uint64(opts)) - - /* return the stack into pool */ - if err != nil { - vars.ResetStack(stk) - } - vars.FreeStack(stk) - - /* avoid GC ahead */ - runtime.KeepAlive(buf) - runtime.KeepAlive(efv) - return err -} - -func encodeFinish(buf []byte, opts Options) []byte { - if opts & EscapeHTML != 0 { - buf = HTMLEscape(nil, buf) - } - if (opts & ValidateString != 0) && !utf8.Validate(buf) { - buf = utf8.CorrectWith(nil, buf, `\ufffd`) - } - return buf -} - - -// HTMLEscape appends to dst the JSON-encoded src with <, >, &, U+2028 and U+2029 -// characters inside string literals changed to \u003c, \u003e, \u0026, \u2028, \u2029 -// so that the JSON will be safe to embed inside HTML