From 7260d1f1e279365b100828e2e05a8060288b9e56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Thomas?= Date: Fri, 10 Nov 2023 15:15:59 +0100 Subject: [PATCH] dump --- .github/dependabot.yml | 14 + .gitignore | 1 - Dockerfile | 8 + Procfile | 1 + README.md | 27 + docker-compose.yml | 11 + go.mod | 31 + go.sum | 81 + index.js | 15 - main.go | 68 + package-lock.json | 1036 - package.json | 22 - scalingo.json | 13 + screenshot.xwd | Bin 29863019 -> 0 bytes templates/index.tmpl | 163 + vendor/github.com/bytedance/sonic/.gitignore | 52 + vendor/github.com/bytedance/sonic/.gitmodules | 3 + .../bytedance/sonic/.licenserc.yaml | 24 + .../bytedance/sonic/CODE_OF_CONDUCT.md | 128 + .../bytedance/sonic/CONTRIBUTING.md | 63 + vendor/github.com/bytedance/sonic/CREDITS | 0 .../bytedance/sonic/INTRODUCTION.md | 48 + vendor/github.com/bytedance/sonic/LICENSE | 201 + vendor/github.com/bytedance/sonic/Makefile | 112 + vendor/github.com/bytedance/sonic/README.md | 359 + vendor/github.com/bytedance/sonic/api.go | 185 + .../bytedance/sonic/ast/api_amd64.go | 126 + .../bytedance/sonic/ast/api_compat.go | 102 + vendor/github.com/bytedance/sonic/ast/asm.s | 0 .../github.com/bytedance/sonic/ast/decode.go | 430 + .../github.com/bytedance/sonic/ast/encode.go | 259 + .../github.com/bytedance/sonic/ast/error.go | 98 + .../bytedance/sonic/ast/iterator.go | 164 + vendor/github.com/bytedance/sonic/ast/node.go | 1802 ++ .../github.com/bytedance/sonic/ast/parser.go | 618 + .../github.com/bytedance/sonic/ast/search.go | 30 + vendor/github.com/bytedance/sonic/ast/sort.go | 206 + .../bytedance/sonic/ast/stubs_go115.go | 55 + .../bytedance/sonic/ast/stubs_go120.go | 55 + .../github.com/bytedance/sonic/bench-arm.sh | 14 + .../bytedance/sonic/bench-large.png | Bin 0 -> 87463 bytes .../bytedance/sonic/bench-small.png | Bin 0 -> 87635 bytes vendor/github.com/bytedance/sonic/bench.py | 134 + vendor/github.com/bytedance/sonic/bench.sh | 27 + .../bytedance/sonic/check_branch_name.sh | 10 + vendor/github.com/bytedance/sonic/compat.go | 131 + .../github.com/bytedance/sonic/decoder/asm.s | 0 .../sonic/decoder/assembler_amd64_go116.go | 1943 ++ .../sonic/decoder/assembler_amd64_go117.go | 1922 ++ .../bytedance/sonic/decoder/compiler.go | 1136 ++ .../bytedance/sonic/decoder/debug.go | 70 + .../bytedance/sonic/decoder/decoder.go | 245 + .../bytedance/sonic/decoder/errors.go | 181 + .../sonic/decoder/generic_amd64_go116.go | 776 + .../sonic/decoder/generic_amd64_go117.go | 772 + .../sonic/decoder/generic_amd64_go117_test.s | 37 + .../sonic/decoder/generic_amd64_test.s | 37 + .../bytedance/sonic/decoder/pools.go | 143 + .../bytedance/sonic/decoder/primitives.go | 46 + .../bytedance/sonic/decoder/stream.go | 217 + .../bytedance/sonic/decoder/stubs_go115.go | 111 + .../bytedance/sonic/decoder/stubs_go120.go | 111 + .../bytedance/sonic/decoder/types.go | 58 + .../bytedance/sonic/decoder/utils.go | 39 + .../github.com/bytedance/sonic/encoder/asm.s | 0 .../sonic/encoder/assembler_amd64_go116.go | 1198 ++ .../sonic/encoder/assembler_amd64_go117.go | 1201 ++ .../bytedance/sonic/encoder/compiler.go | 885 + .../bytedance/sonic/encoder/debug_go116.go | 66 + .../bytedance/sonic/encoder/debug_go117.go | 205 + .../bytedance/sonic/encoder/encoder.go | 311 + .../bytedance/sonic/encoder/errors.go | 65 + .../bytedance/sonic/encoder/mapiter.go | 199 + .../bytedance/sonic/encoder/pools.go | 194 + .../bytedance/sonic/encoder/primitives.go | 168 + .../bytedance/sonic/encoder/sort.go | 206 + .../bytedance/sonic/encoder/stream.go | 84 + .../bytedance/sonic/encoder/stubs_go116.go | 65 + .../bytedance/sonic/encoder/stubs_go117.go | 66 + .../bytedance/sonic/encoder/stubs_go120.go | 66 + .../bytedance/sonic/encoder/types.go | 47 + .../bytedance/sonic/encoder/utils.go | 52 + vendor/github.com/bytedance/sonic/go.work | 8 + .../bytedance/sonic/internal/caching/asm.s | 0 .../sonic/internal/caching/fcache.go | 115 + .../sonic/internal/caching/hashing.go | 40 + .../sonic/internal/caching/pcache.go | 173 + .../bytedance/sonic/internal/cpu/features.go | 40 + .../sonic/internal/jit/arch_amd64.go | 67 + .../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 | 54 + .../bytedance/sonic/internal/loader/asm.s | 0 .../sonic/internal/loader/funcdata.go | 124 + .../sonic/internal/loader/funcdata_go115.go | 169 + .../sonic/internal/loader/funcdata_go116.go | 175 + .../sonic/internal/loader/funcdata_go118.go | 201 + .../sonic/internal/loader/funcdata_go120.go | 201 + .../bytedance/sonic/internal/loader/loader.go | 74 + .../sonic/internal/loader/loader_windows.go | 111 + .../sonic/internal/native/avx/native_amd64.go | 135 + .../sonic/internal/native/avx/native_amd64.s | 15286 ++++++++++++++ .../native/avx/native_export_amd64.go | 49 + .../internal/native/avx/native_subr_amd64.go | 109 + .../internal/native/avx2/native_amd64.go | 135 + .../sonic/internal/native/avx2/native_amd64.s | 16629 ++++++++++++++++ .../native/avx2/native_export_amd64.go | 49 + .../internal/native/avx2/native_subr_amd64.go | 109 + .../sonic/internal/native/dispatch_amd64.go | 202 + .../sonic/internal/native/dispatch_amd64.s | 137 + .../internal/native/fastfloat_amd64_test.tmpl | 138 + .../internal/native/fastint_amd64_test.tmpl | 151 + .../sonic/internal/native/native_amd64.tmpl | 133 + .../internal/native/native_amd64_test.tmpl | 593 + .../internal/native/native_export_amd64.tmpl | 47 + .../sonic/internal/native/sse/native_amd64.go | 135 + .../sonic/internal/native/sse/native_amd64.s | 15078 ++++++++++++++ .../native/sse/native_export_amd64.go | 49 + .../internal/native/sse/native_subr_amd64.go | 109 + .../sonic/internal/native/types/types.go | 134 + .../bytedance/sonic/internal/resolver/asm.s | 0 .../sonic/internal/resolver/resolver.go | 214 + .../sonic/internal/resolver/stubs.go | 46 + .../bytedance/sonic/internal/rt/asm_amd64.s | 60 + .../bytedance/sonic/internal/rt/asm_arm64.s | 10 + .../bytedance/sonic/internal/rt/fastmem.go | 113 + .../bytedance/sonic/internal/rt/fastvalue.go | 200 + .../bytedance/sonic/internal/rt/gcwb.go | 124 + .../bytedance/sonic/internal/rt/int48.go | 36 + .../bytedance/sonic/internal/rt/stackmap.go | 180 + .../bytedance/sonic/introduction-1.png | Bin 0 -> 57447 bytes .../bytedance/sonic/introduction-2.png | Bin 0 -> 68075 bytes .../bytedance/sonic/loader/funcdata.go | 144 + .../bytedance/sonic/loader/funcdata_go115.go | 541 + .../bytedance/sonic/loader/funcdata_go118.go | 541 + .../bytedance/sonic/loader/funcdata_go120.go | 545 + .../bytedance/sonic/loader/loader.go | 37 + .../bytedance/sonic/loader/loader_go115.go | 33 + .../bytedance/sonic/loader/loader_go118.go | 104 + .../bytedance/sonic/loader/mmap_unix.go | 45 + .../bytedance/sonic/loader/mmap_windows.go | 84 + .../bytedance/sonic/loader/pcdata.go | 100 + .../bytedance/sonic/loader/stubs.go | 35 + .../bytedance/sonic/option/option.go | 78 + .../bytedance/sonic/other-langs.png | Bin 0 -> 96490 bytes vendor/github.com/bytedance/sonic/sonic.go | 161 + .../bytedance/sonic/unquote/unquote.go | 56 + .../github.com/bytedance/sonic/utf8/utf8.go | 71 + .../github.com/chenzhuoyu/base64x/.gitignore | 43 + .../github.com/chenzhuoyu/base64x/.gitmodules | 3 + vendor/github.com/chenzhuoyu/base64x/LICENSE | 201 + vendor/github.com/chenzhuoyu/base64x/Makefile | 28 + .../github.com/chenzhuoyu/base64x/README.md | 4 + .../github.com/chenzhuoyu/base64x/base64x.go | 157 + vendor/github.com/chenzhuoyu/base64x/cpuid.go | 17 + .../github.com/chenzhuoyu/base64x/faststr.go | 23 + .../chenzhuoyu/base64x/native_amd64.go | 16 + .../chenzhuoyu/base64x/native_amd64.s | 4416 ++++ .../chenzhuoyu/base64x/native_subr_amd64.go | 29 + vendor/github.com/gin-contrib/sse/.travis.yml | 26 + vendor/github.com/gin-contrib/sse/LICENSE | 21 + vendor/github.com/gin-contrib/sse/README.md | 58 + .../github.com/gin-contrib/sse/sse-decoder.go | 116 + .../github.com/gin-contrib/sse/sse-encoder.go | 110 + vendor/github.com/gin-contrib/sse/writer.go | 24 + vendor/github.com/gin-gonic/gin/.gitignore | 7 + vendor/github.com/gin-gonic/gin/.golangci.yml | 39 + .../github.com/gin-gonic/gin/.goreleaser.yaml | 57 + vendor/github.com/gin-gonic/gin/AUTHORS.md | 406 + vendor/github.com/gin-gonic/gin/BENCHMARKS.md | 666 + vendor/github.com/gin-gonic/gin/CHANGELOG.md | 564 + .../gin-gonic/gin/CODE_OF_CONDUCT.md | 46 + .../github.com/gin-gonic/gin/CONTRIBUTING.md | 13 + vendor/github.com/gin-gonic/gin/LICENSE | 21 + vendor/github.com/gin-gonic/gin/Makefile | 77 + vendor/github.com/gin-gonic/gin/README.md | 179 + vendor/github.com/gin-gonic/gin/any.go | 10 + vendor/github.com/gin-gonic/gin/auth.go | 91 + .../github.com/gin-gonic/gin/binding/any.go | 10 + .../gin-gonic/gin/binding/binding.go | 122 + .../gin/binding/binding_nomsgpack.go | 116 + .../gin/binding/default_validator.go | 97 + .../github.com/gin-gonic/gin/binding/form.go | 62 + .../gin-gonic/gin/binding/form_mapping.go | 403 + .../gin-gonic/gin/binding/header.go | 38 + .../github.com/gin-gonic/gin/binding/json.go | 56 + .../gin-gonic/gin/binding/msgpack.go | 38 + .../gin/binding/multipart_form_mapping.go | 74 + .../gin-gonic/gin/binding/protobuf.go | 41 + .../github.com/gin-gonic/gin/binding/query.go | 21 + .../github.com/gin-gonic/gin/binding/toml.go | 35 + .../github.com/gin-gonic/gin/binding/uri.go | 18 + .../github.com/gin-gonic/gin/binding/xml.go | 33 + .../github.com/gin-gonic/gin/binding/yaml.go | 35 + vendor/github.com/gin-gonic/gin/codecov.yml | 5 + vendor/github.com/gin-gonic/gin/context.go | 1220 ++ .../gin-gonic/gin/context_appengine.go | 12 + vendor/github.com/gin-gonic/gin/debug.go | 101 + vendor/github.com/gin-gonic/gin/deprecated.go | 21 + vendor/github.com/gin-gonic/gin/doc.go | 6 + vendor/github.com/gin-gonic/gin/errors.go | 175 + vendor/github.com/gin-gonic/gin/fs.go | 45 + vendor/github.com/gin-gonic/gin/gin.go | 711 + .../gin/internal/bytesconv/bytesconv.go | 24 + .../gin-gonic/gin/internal/json/go_json.go | 23 + .../gin-gonic/gin/internal/json/json.go | 25 + .../gin-gonic/gin/internal/json/jsoniter.go | 24 + .../gin-gonic/gin/internal/json/sonic.go | 27 + vendor/github.com/gin-gonic/gin/logger.go | 270 + vendor/github.com/gin-gonic/gin/mode.go | 100 + vendor/github.com/gin-gonic/gin/path.go | 150 + vendor/github.com/gin-gonic/gin/recovery.go | 174 + vendor/github.com/gin-gonic/gin/render/any.go | 10 + .../github.com/gin-gonic/gin/render/data.go | 25 + .../github.com/gin-gonic/gin/render/html.go | 92 + .../github.com/gin-gonic/gin/render/json.go | 190 + .../gin-gonic/gin/render/msgpack.go | 44 + .../gin-gonic/gin/render/protobuf.go | 36 + .../github.com/gin-gonic/gin/render/reader.go | 48 + .../gin-gonic/gin/render/redirect.go | 29 + .../github.com/gin-gonic/gin/render/render.go | 41 + .../github.com/gin-gonic/gin/render/text.go | 41 + .../github.com/gin-gonic/gin/render/toml.go | 36 + vendor/github.com/gin-gonic/gin/render/xml.go | 28 + .../github.com/gin-gonic/gin/render/yaml.go | 36 + .../gin-gonic/gin/response_writer.go | 131 + .../github.com/gin-gonic/gin/routergroup.go | 259 + .../github.com/gin-gonic/gin/test_helpers.go | 24 + vendor/github.com/gin-gonic/gin/tree.go | 878 + vendor/github.com/gin-gonic/gin/utils.go | 164 + vendor/github.com/gin-gonic/gin/version.go | 8 + .../go-playground/locales/.gitignore | 24 + .../go-playground/locales/.travis.yml | 26 + .../github.com/go-playground/locales/LICENSE | 21 + .../go-playground/locales/README.md | 170 + .../locales/currency/currency.go | 311 + .../github.com/go-playground/locales/logo.png | Bin 0 -> 37360 bytes .../github.com/go-playground/locales/rules.go | 293 + .../universal-translator/.gitignore | 25 + .../universal-translator/.travis.yml | 27 + .../universal-translator/LICENSE | 21 + .../universal-translator/Makefile | 18 + .../universal-translator/README.md | 87 + .../universal-translator/errors.go | 148 + .../universal-translator/import_export.go | 274 + .../universal-translator/logo.png | Bin 0 -> 16598 bytes .../universal-translator/translator.go | 420 + .../universal_translator.go | 113 + .../go-playground/validator/v10/.gitignore | 31 + .../go-playground/validator/v10/LICENSE | 22 + .../validator/v10/MAINTAINERS.md | 16 + .../go-playground/validator/v10/Makefile | 18 + .../go-playground/validator/v10/README.md | 338 + .../go-playground/validator/v10/baked_in.go | 2526 +++ .../go-playground/validator/v10/cache.go | 327 + .../validator/v10/country_codes.go | 1132 ++ .../validator/v10/currency_codes.go | 79 + .../go-playground/validator/v10/doc.go | 1401 ++ .../go-playground/validator/v10/errors.go | 275 + .../validator/v10/field_level.go | 120 + .../go-playground/validator/v10/logo.png | Bin 0 -> 13443 bytes .../validator/v10/postcode_regexes.go | 173 + .../go-playground/validator/v10/regexes.go | 131 + .../validator/v10/struct_level.go | 175 + .../validator/v10/translations.go | 11 + .../go-playground/validator/v10/util.go | 288 + .../go-playground/validator/v10/validator.go | 486 + .../validator/v10/validator_instance.go | 699 + vendor/github.com/goccy/go-json/.codecov.yml | 32 + vendor/github.com/goccy/go-json/.gitignore | 2 + vendor/github.com/goccy/go-json/.golangci.yml | 83 + vendor/github.com/goccy/go-json/CHANGELOG.md | 393 + vendor/github.com/goccy/go-json/LICENSE | 21 + vendor/github.com/goccy/go-json/Makefile | 39 + vendor/github.com/goccy/go-json/README.md | 529 + vendor/github.com/goccy/go-json/color.go | 68 + vendor/github.com/goccy/go-json/decode.go | 263 + .../goccy/go-json/docker-compose.yml | 13 + vendor/github.com/goccy/go-json/encode.go | 326 + vendor/github.com/goccy/go-json/error.go | 41 + .../internal/decoder/anonymous_field.go | 41 + .../goccy/go-json/internal/decoder/array.go | 174 + .../goccy/go-json/internal/decoder/assign.go | 438 + .../goccy/go-json/internal/decoder/bool.go | 83 + .../goccy/go-json/internal/decoder/bytes.go | 118 + .../goccy/go-json/internal/decoder/compile.go | 487 + .../internal/decoder/compile_norace.go | 29 + .../go-json/internal/decoder/compile_race.go | 37 + .../goccy/go-json/internal/decoder/context.go | 254 + .../goccy/go-json/internal/decoder/float.go | 170 + .../goccy/go-json/internal/decoder/func.go | 146 + .../goccy/go-json/internal/decoder/int.go | 246 + .../go-json/internal/decoder/interface.go | 528 + .../goccy/go-json/internal/decoder/invalid.go | 55 + .../goccy/go-json/internal/decoder/map.go | 280 + .../goccy/go-json/internal/decoder/number.go | 123 + .../goccy/go-json/internal/decoder/option.go | 17 + .../goccy/go-json/internal/decoder/path.go | 670 + .../goccy/go-json/internal/decoder/ptr.go | 96 + .../goccy/go-json/internal/decoder/slice.go | 380 + .../goccy/go-json/internal/decoder/stream.go | 556 + .../goccy/go-json/internal/decoder/string.go | 452 + .../goccy/go-json/internal/decoder/struct.go | 823 + .../goccy/go-json/internal/decoder/type.go | 30 + .../goccy/go-json/internal/decoder/uint.go | 194 + .../internal/decoder/unmarshal_json.go | 104 + .../internal/decoder/unmarshal_text.go | 285 + .../internal/decoder/wrapped_string.go | 73 + .../goccy/go-json/internal/encoder/code.go | 1017 + .../goccy/go-json/internal/encoder/compact.go | 286 + .../go-json/internal/encoder/compiler.go | 928 + .../internal/encoder/compiler_norace.go | 32 + .../go-json/internal/encoder/compiler_race.go | 45 + .../goccy/go-json/internal/encoder/context.go | 105 + .../go-json/internal/encoder/decode_rune.go | 126 + .../goccy/go-json/internal/encoder/encoder.go | 596 + .../goccy/go-json/internal/encoder/indent.go | 211 + .../goccy/go-json/internal/encoder/int.go | 152 + .../goccy/go-json/internal/encoder/map112.go | 9 + .../goccy/go-json/internal/encoder/map113.go | 9 + .../goccy/go-json/internal/encoder/opcode.go | 669 + .../goccy/go-json/internal/encoder/option.go | 47 + .../goccy/go-json/internal/encoder/optype.go | 932 + .../goccy/go-json/internal/encoder/query.go | 135 + .../goccy/go-json/internal/encoder/string.go | 459 + .../go-json/internal/encoder/string_table.go | 415 + .../go-json/internal/encoder/vm/debug_vm.go | 35 + .../goccy/go-json/internal/encoder/vm/hack.go | 9 + .../goccy/go-json/internal/encoder/vm/util.go | 207 + .../goccy/go-json/internal/encoder/vm/vm.go | 4859 +++++ .../internal/encoder/vm_color/debug_vm.go | 35 + .../go-json/internal/encoder/vm_color/hack.go | 9 + .../go-json/internal/encoder/vm_color/util.go | 274 + .../go-json/internal/encoder/vm_color/vm.go | 4859 +++++ .../encoder/vm_color_indent/debug_vm.go | 35 + .../internal/encoder/vm_color_indent/util.go | 296 + .../internal/encoder/vm_color_indent/vm.go | 4859 +++++ .../internal/encoder/vm_indent/debug_vm.go | 35 + .../internal/encoder/vm_indent/hack.go | 9 + .../internal/encoder/vm_indent/util.go | 229 + .../go-json/internal/encoder/vm_indent/vm.go | 4859 +++++ .../goccy/go-json/internal/errors/error.go | 183 + .../goccy/go-json/internal/runtime/rtype.go | 263 + .../go-json/internal/runtime/struct_field.go | 91 + .../goccy/go-json/internal/runtime/type.go | 100 + vendor/github.com/goccy/go-json/json.go | 371 + vendor/github.com/goccy/go-json/option.go | 72 + vendor/github.com/goccy/go-json/path.go | 84 + vendor/github.com/goccy/go-json/query.go | 47 + .../github.com/json-iterator/go/.codecov.yml | 3 + vendor/github.com/json-iterator/go/.gitignore | 4 + .../github.com/json-iterator/go/.travis.yml | 14 + vendor/github.com/json-iterator/go/Gopkg.lock | 21 + vendor/github.com/json-iterator/go/Gopkg.toml | 26 + vendor/github.com/json-iterator/go/LICENSE | 21 + vendor/github.com/json-iterator/go/README.md | 85 + vendor/github.com/json-iterator/go/adapter.go | 150 + vendor/github.com/json-iterator/go/any.go | 325 + .../github.com/json-iterator/go/any_array.go | 278 + .../github.com/json-iterator/go/any_bool.go | 137 + .../github.com/json-iterator/go/any_float.go | 83 + .../github.com/json-iterator/go/any_int32.go | 74 + .../github.com/json-iterator/go/any_int64.go | 74 + .../json-iterator/go/any_invalid.go | 82 + vendor/github.com/json-iterator/go/any_nil.go | 69 + .../github.com/json-iterator/go/any_number.go | 123 + .../github.com/json-iterator/go/any_object.go | 374 + vendor/github.com/json-iterator/go/any_str.go | 166 + .../github.com/json-iterator/go/any_uint32.go | 74 + .../github.com/json-iterator/go/any_uint64.go | 74 + vendor/github.com/json-iterator/go/build.sh | 12 + vendor/github.com/json-iterator/go/config.go | 375 + .../go/fuzzy_mode_convert_table.md | 7 + vendor/github.com/json-iterator/go/iter.go | 349 + .../github.com/json-iterator/go/iter_array.go | 64 + .../github.com/json-iterator/go/iter_float.go | 342 + .../github.com/json-iterator/go/iter_int.go | 346 + .../json-iterator/go/iter_object.go | 267 + .../github.com/json-iterator/go/iter_skip.go | 130 + .../json-iterator/go/iter_skip_sloppy.go | 163 + .../json-iterator/go/iter_skip_strict.go | 99 + .../github.com/json-iterator/go/iter_str.go | 215 + .../github.com/json-iterator/go/jsoniter.go | 18 + vendor/github.com/json-iterator/go/pool.go | 42 + vendor/github.com/json-iterator/go/reflect.go | 337 + .../json-iterator/go/reflect_array.go | 104 + .../json-iterator/go/reflect_dynamic.go | 70 + .../json-iterator/go/reflect_extension.go | 483 + .../json-iterator/go/reflect_json_number.go | 112 + .../go/reflect_json_raw_message.go | 76 + .../json-iterator/go/reflect_map.go | 346 + .../json-iterator/go/reflect_marshaler.go | 225 + .../json-iterator/go/reflect_native.go | 453 + .../json-iterator/go/reflect_optional.go | 129 + .../json-iterator/go/reflect_slice.go | 99 + .../go/reflect_struct_decoder.go | 1097 + .../go/reflect_struct_encoder.go | 211 + vendor/github.com/json-iterator/go/stream.go | 210 + .../json-iterator/go/stream_float.go | 111 + .../github.com/json-iterator/go/stream_int.go | 190 + .../github.com/json-iterator/go/stream_str.go | 372 + vendor/github.com/json-iterator/go/test.sh | 12 + .../github.com/klauspost/cpuid/v2/.gitignore | 24 + .../klauspost/cpuid/v2/.goreleaser.yml | 74 + .../klauspost/cpuid/v2/CONTRIBUTING.txt | 35 + vendor/github.com/klauspost/cpuid/v2/LICENSE | 22 + .../github.com/klauspost/cpuid/v2/README.md | 137 + vendor/github.com/klauspost/cpuid/v2/cpuid.go | 1070 + .../github.com/klauspost/cpuid/v2/cpuid_386.s | 47 + .../klauspost/cpuid/v2/cpuid_amd64.s | 72 + .../klauspost/cpuid/v2/cpuid_arm64.s | 26 + .../klauspost/cpuid/v2/detect_arm64.go | 246 + .../klauspost/cpuid/v2/detect_ref.go | 14 + .../klauspost/cpuid/v2/detect_x86.go | 35 + .../klauspost/cpuid/v2/featureid_string.go | 185 + .../klauspost/cpuid/v2/os_darwin_arm64.go | 19 + .../klauspost/cpuid/v2/os_linux_arm64.go | 130 + .../klauspost/cpuid/v2/os_other_arm64.go | 17 + .../klauspost/cpuid/v2/os_safe_linux_arm64.go | 7 + .../cpuid/v2/os_unsafe_linux_arm64.go | 10 + .../klauspost/cpuid/v2/test-architectures.sh | 15 + vendor/github.com/leodido/go-urn/.gitignore | 11 + vendor/github.com/leodido/go-urn/.travis.yml | 16 + vendor/github.com/leodido/go-urn/LICENSE | 21 + vendor/github.com/leodido/go-urn/README.md | 55 + vendor/github.com/leodido/go-urn/machine.go | 1691 ++ .../github.com/leodido/go-urn/machine.go.rl | 159 + vendor/github.com/leodido/go-urn/makefile | 39 + vendor/github.com/leodido/go-urn/urn.go | 86 + vendor/github.com/mattn/go-isatty/LICENSE | 9 + vendor/github.com/mattn/go-isatty/README.md | 50 + vendor/github.com/mattn/go-isatty/doc.go | 2 + vendor/github.com/mattn/go-isatty/go.test.sh | 12 + .../github.com/mattn/go-isatty/isatty_bsd.go | 19 + .../mattn/go-isatty/isatty_others.go | 16 + .../mattn/go-isatty/isatty_plan9.go | 23 + .../mattn/go-isatty/isatty_solaris.go | 21 + .../mattn/go-isatty/isatty_tcgets.go | 19 + .../mattn/go-isatty/isatty_windows.go | 125 + .../github.com/modern-go/concurrent/LICENSE | 201 + .../github.com/modern-go/concurrent/README.md | 2 + .../modern-go/concurrent/executor.go | 7 + .../modern-go/concurrent/go_above_19.go | 13 + .../modern-go/concurrent/go_below_19.go | 30 + .../concurrent/unbounded_executor.go | 99 + .../github.com/modern-go/reflect2/.gitignore | 2 + .../github.com/modern-go/reflect2/.travis.yml | 15 + .../github.com/modern-go/reflect2/Gopkg.lock | 9 + .../github.com/modern-go/reflect2/Gopkg.toml | 31 + vendor/github.com/modern-go/reflect2/LICENSE | 201 + .../github.com/modern-go/reflect2/README.md | 71 + .../modern-go/reflect2/go_above_118.go | 23 + .../modern-go/reflect2/go_above_19.go | 17 + .../modern-go/reflect2/go_below_118.go | 21 + .../github.com/modern-go/reflect2/reflect2.go | 300 + .../modern-go/reflect2/reflect2_amd64.s | 0 .../modern-go/reflect2/reflect2_kind.go | 30 + .../modern-go/reflect2/relfect2_386.s | 0 .../modern-go/reflect2/relfect2_amd64p32.s | 0 .../modern-go/reflect2/relfect2_arm.s | 0 .../modern-go/reflect2/relfect2_arm64.s | 0 .../modern-go/reflect2/relfect2_mips64x.s | 0 .../modern-go/reflect2/relfect2_mipsx.s | 0 .../modern-go/reflect2/relfect2_ppc64x.s | 0 .../modern-go/reflect2/relfect2_s390x.s | 0 .../modern-go/reflect2/safe_field.go | 58 + .../github.com/modern-go/reflect2/safe_map.go | 101 + .../modern-go/reflect2/safe_slice.go | 92 + .../modern-go/reflect2/safe_struct.go | 29 + .../modern-go/reflect2/safe_type.go | 78 + .../github.com/modern-go/reflect2/type_map.go | 70 + .../modern-go/reflect2/unsafe_array.go | 65 + .../modern-go/reflect2/unsafe_eface.go | 59 + .../modern-go/reflect2/unsafe_field.go | 74 + .../modern-go/reflect2/unsafe_iface.go | 64 + .../modern-go/reflect2/unsafe_link.go | 76 + .../modern-go/reflect2/unsafe_map.go | 130 + .../modern-go/reflect2/unsafe_ptr.go | 46 + .../modern-go/reflect2/unsafe_slice.go | 177 + .../modern-go/reflect2/unsafe_struct.go | 59 + .../modern-go/reflect2/unsafe_type.go | 85 + .../pelletier/go-toml/v2/.dockerignore | 2 + .../pelletier/go-toml/v2/.gitattributes | 4 + .../pelletier/go-toml/v2/.gitignore | 6 + .../pelletier/go-toml/v2/.golangci.toml | 84 + .../pelletier/go-toml/v2/.goreleaser.yaml | 123 + .../pelletier/go-toml/v2/CONTRIBUTING.md | 196 + .../pelletier/go-toml/v2/Dockerfile | 5 + .../github.com/pelletier/go-toml/v2/LICENSE | 21 + .../github.com/pelletier/go-toml/v2/README.md | 563 + .../pelletier/go-toml/v2/SECURITY.md | 19 + vendor/github.com/pelletier/go-toml/v2/ci.sh | 279 + .../github.com/pelletier/go-toml/v2/decode.go | 550 + vendor/github.com/pelletier/go-toml/v2/doc.go | 2 + .../github.com/pelletier/go-toml/v2/errors.go | 252 + .../go-toml/v2/internal/characters/ascii.go | 42 + .../go-toml/v2/internal/characters/utf8.go | 199 + .../go-toml/v2/internal/danger/danger.go | 65 + .../go-toml/v2/internal/danger/typeid.go | 23 + .../go-toml/v2/internal/tracker/key.go | 48 + .../go-toml/v2/internal/tracker/seen.go | 356 + .../go-toml/v2/internal/tracker/tracker.go | 1 + .../pelletier/go-toml/v2/localtime.go | 122 + .../pelletier/go-toml/v2/marshaler.go | 1042 + .../github.com/pelletier/go-toml/v2/strict.go | 107 + .../github.com/pelletier/go-toml/v2/toml.abnf | 243 + .../github.com/pelletier/go-toml/v2/types.go | 14 + .../pelletier/go-toml/v2/unmarshaler.go | 1227 ++ .../pelletier/go-toml/v2/unstable/ast.go | 136 + .../pelletier/go-toml/v2/unstable/builder.go | 71 + .../pelletier/go-toml/v2/unstable/doc.go | 3 + .../pelletier/go-toml/v2/unstable/kind.go | 71 + .../pelletier/go-toml/v2/unstable/parser.go | 1147 ++ .../pelletier/go-toml/v2/unstable/scanner.go | 271 + .../twitchyliquid64/golang-asm/LICENSE | 27 + .../golang-asm/asm/arch/arch.go | 716 + .../golang-asm/asm/arch/arm.go | 257 + .../golang-asm/asm/arch/arm64.go | 350 + .../golang-asm/asm/arch/mips.go | 72 + .../golang-asm/asm/arch/ppc64.go | 102 + .../golang-asm/asm/arch/riscv64.go | 28 + .../golang-asm/asm/arch/s390x.go | 81 + .../twitchyliquid64/golang-asm/bio/buf.go | 148 + .../golang-asm/bio/buf_mmap.go | 62 + .../golang-asm/bio/buf_nommap.go | 11 + .../twitchyliquid64/golang-asm/bio/must.go | 43 + .../twitchyliquid64/golang-asm/dwarf/dwarf.go | 1650 ++ .../golang-asm/dwarf/dwarf_defs.go | 493 + .../golang-asm/goobj/builtin.go | 45 + .../golang-asm/goobj/builtinlist.go | 245 + .../golang-asm/goobj/funcinfo.go | 233 + .../golang-asm/goobj/objfile.go | 871 + .../golang-asm/obj/abi_string.go | 16 + .../golang-asm/obj/addrtype_string.go | 16 + .../golang-asm/obj/arm/a.out.go | 410 + .../golang-asm/obj/arm/anames.go | 144 + .../golang-asm/obj/arm/anames5.go | 77 + .../golang-asm/obj/arm/asm5.go | 3096 +++ .../golang-asm/obj/arm/list5.go | 124 + .../golang-asm/obj/arm/obj5.go | 784 + .../golang-asm/obj/arm64/a.out.go | 1033 + .../golang-asm/obj/arm64/anames.go | 512 + .../golang-asm/obj/arm64/anames7.go | 100 + .../golang-asm/obj/arm64/asm7.go | 7140 +++++++ .../golang-asm/obj/arm64/doc.go | 249 + .../golang-asm/obj/arm64/list7.go | 288 + .../golang-asm/obj/arm64/obj7.go | 998 + .../golang-asm/obj/arm64/sysRegEnc.go | 895 + .../twitchyliquid64/golang-asm/obj/data.go | 200 + .../twitchyliquid64/golang-asm/obj/dwarf.go | 690 + .../twitchyliquid64/golang-asm/obj/go.go | 16 + .../twitchyliquid64/golang-asm/obj/inl.go | 131 + .../twitchyliquid64/golang-asm/obj/ld.go | 85 + .../twitchyliquid64/golang-asm/obj/line.go | 30 + .../twitchyliquid64/golang-asm/obj/link.go | 771 + .../golang-asm/obj/mips/a.out.go | 481 + .../golang-asm/obj/mips/anames.go | 135 + .../golang-asm/obj/mips/anames0.go | 45 + .../golang-asm/obj/mips/asm0.go | 2108 ++ .../golang-asm/obj/mips/list0.go | 83 + .../golang-asm/obj/mips/obj0.go | 1457 ++ .../twitchyliquid64/golang-asm/obj/objfile.go | 755 + .../twitchyliquid64/golang-asm/obj/pass.go | 176 + .../twitchyliquid64/golang-asm/obj/pcln.go | 413 + .../twitchyliquid64/golang-asm/obj/plist.go | 314 + .../golang-asm/obj/ppc64/a.out.go | 1032 + .../golang-asm/obj/ppc64/anames.go | 615 + .../golang-asm/obj/ppc64/anames9.go | 51 + .../golang-asm/obj/ppc64/asm9.go | 5367 +++++ .../golang-asm/obj/ppc64/doc.go | 244 + .../golang-asm/obj/ppc64/list9.go | 104 + .../golang-asm/obj/ppc64/obj9.go | 1278 ++ .../golang-asm/obj/riscv/anames.go | 258 + .../golang-asm/obj/riscv/cpu.go | 644 + .../golang-asm/obj/riscv/inst.go | 459 + .../golang-asm/obj/riscv/list.go | 33 + .../golang-asm/obj/riscv/obj.go | 1999 ++ .../golang-asm/obj/s390x/a.out.go | 1003 + .../golang-asm/obj/s390x/anames.go | 720 + .../golang-asm/obj/s390x/anamesz.go | 39 + .../golang-asm/obj/s390x/asmz.go | 5043 +++++ .../golang-asm/obj/s390x/condition_code.go | 126 + .../golang-asm/obj/s390x/listz.go | 73 + .../golang-asm/obj/s390x/objz.go | 735 + .../golang-asm/obj/s390x/rotate.go | 47 + .../golang-asm/obj/s390x/vector.go | 1069 + .../twitchyliquid64/golang-asm/obj/sym.go | 421 + .../golang-asm/obj/textflag.go | 54 + .../twitchyliquid64/golang-asm/obj/util.go | 598 + .../golang-asm/obj/wasm/a.out.go | 331 + .../golang-asm/obj/wasm/anames.go | 208 + .../golang-asm/obj/wasm/wasmobj.go | 1185 ++ .../golang-asm/obj/x86/a.out.go | 423 + .../golang-asm/obj/x86/aenum.go | 1609 ++ .../golang-asm/obj/x86/anames.go | 1607 ++ .../golang-asm/obj/x86/asm6.go | 5446 +++++ .../golang-asm/obj/x86/avx_optabs.go | 4628 +++++ .../golang-asm/obj/x86/evex.go | 382 + .../golang-asm/obj/x86/list6.go | 264 + .../golang-asm/obj/x86/obj6.go | 1261 ++ .../golang-asm/obj/x86/ytab.go | 44 + .../golang-asm/objabi/autotype.go | 38 + .../twitchyliquid64/golang-asm/objabi/flag.go | 162 + .../golang-asm/objabi/funcdata.go | 54 + .../golang-asm/objabi/funcid.go | 100 + .../twitchyliquid64/golang-asm/objabi/head.go | 109 + .../twitchyliquid64/golang-asm/objabi/line.go | 114 + .../twitchyliquid64/golang-asm/objabi/path.go | 41 + .../golang-asm/objabi/reloctype.go | 269 + .../golang-asm/objabi/reloctype_string.go | 17 + .../golang-asm/objabi/stack.go | 33 + .../golang-asm/objabi/symkind.go | 79 + .../golang-asm/objabi/symkind_string.go | 41 + .../golang-asm/objabi/typekind.go | 40 + .../twitchyliquid64/golang-asm/objabi/util.go | 203 + .../twitchyliquid64/golang-asm/src/pos.go | 470 + .../twitchyliquid64/golang-asm/src/xpos.go | 176 + .../twitchyliquid64/golang-asm/sys/arch.go | 187 + .../golang-asm/sys/supported.go | 116 + .../golang-asm/unsafeheader/unsafeheader.go | 37 + .../ugorji/go/codec/0_importpath.go | 7 + vendor/github.com/ugorji/go/codec/LICENSE | 22 + vendor/github.com/ugorji/go/codec/README.md | 284 + vendor/github.com/ugorji/go/codec/binc.go | 1319 ++ vendor/github.com/ugorji/go/codec/build.sh | 370 + vendor/github.com/ugorji/go/codec/cbor.go | 957 + vendor/github.com/ugorji/go/codec/codecgen.go | 17 + vendor/github.com/ugorji/go/codec/decimal.go | 499 + vendor/github.com/ugorji/go/codec/decode.go | 2376 +++ vendor/github.com/ugorji/go/codec/doc.go | 227 + vendor/github.com/ugorji/go/codec/encode.go | 1524 ++ .../ugorji/go/codec/fast-path.generated.go | 6157 ++++++ .../ugorji/go/codec/fast-path.go.tmpl | 555 + .../ugorji/go/codec/fast-path.not.go | 41 + .../ugorji/go/codec/gen-dec-array.go.tmpl | 90 + .../ugorji/go/codec/gen-dec-map.go.tmpl | 58 + .../ugorji/go/codec/gen-enc-chan.go.tmpl | 27 + .../ugorji/go/codec/gen-helper.generated.go | 294 + .../ugorji/go/codec/gen-helper.go.tmpl | 273 + .../ugorji/go/codec/gen.generated.go | 192 + vendor/github.com/ugorji/go/codec/gen.go | 2876 +++ .../go/codec/goversion_arrayof_gte_go15.go | 15 + .../go/codec/goversion_arrayof_lt_go15.go | 20 + .../go/codec/goversion_fmt_time_gte_go15.go | 13 + .../go/codec/goversion_fmt_time_lt_go15.go | 16 + .../goversion_growslice_unsafe_gte_go120.go | 28 + .../goversion_growslice_unsafe_lt_go120.go | 16 + .../go/codec/goversion_makemap_lt_go110.go | 13 + .../goversion_makemap_not_unsafe_gte_go110.go | 14 + .../goversion_makemap_unsafe_gte_go110.go | 25 + .../go/codec/goversion_maprange_gte_go112.go | 41 + .../go/codec/goversion_maprange_lt_go112.go | 45 + ...version_unexportedembeddedptr_gte_go110.go | 9 + ...oversion_unexportedembeddedptr_lt_go110.go | 9 + .../go/codec/goversion_unsupported_lt_go14.go | 22 + .../go/codec/goversion_vendor_eq_go15.go | 11 + .../go/codec/goversion_vendor_eq_go16.go | 11 + .../go/codec/goversion_vendor_gte_go17.go | 9 + .../go/codec/goversion_vendor_lt_go15.go | 9 + vendor/github.com/ugorji/go/codec/helper.go | 3021 +++ vendor/github.com/ugorji/go/codec/helper.s | 0 .../ugorji/go/codec/helper_internal.go | 147 + .../ugorji/go/codec/helper_not_unsafe.go | 706 + .../go/codec/helper_not_unsafe_not_gc.go | 21 + .../ugorji/go/codec/helper_unsafe.go | 1350 ++ .../go/codec/helper_unsafe_compiler_gc.go | 169 + .../go/codec/helper_unsafe_compiler_not_gc.go | 80 + vendor/github.com/ugorji/go/codec/json.go | 1460 ++ .../ugorji/go/codec/mammoth-test.go.tmpl | 235 + .../ugorji/go/codec/mammoth2-test.go.tmpl | 101 + vendor/github.com/ugorji/go/codec/msgpack.go | 1237 ++ vendor/github.com/ugorji/go/codec/reader.go | 607 + .../ugorji/go/codec/register_ext.go | 38 + vendor/github.com/ugorji/go/codec/rpc.go | 234 + vendor/github.com/ugorji/go/codec/simple.go | 750 + .../ugorji/go/codec/sort-slice.generated.go | 148 + .../ugorji/go/codec/sort-slice.go.tmpl | 68 + .../ugorji/go/codec/test-cbor-goldens.json | 639 + vendor/github.com/ugorji/go/codec/test.py | 138 + vendor/github.com/ugorji/go/codec/writer.go | 324 + vendor/golang.org/x/arch/AUTHORS | 3 + vendor/golang.org/x/arch/CONTRIBUTORS | 3 + vendor/golang.org/x/arch/LICENSE | 27 + vendor/golang.org/x/arch/PATENTS | 22 + vendor/golang.org/x/arch/x86/x86asm/Makefile | 3 + vendor/golang.org/x/arch/x86/x86asm/decode.go | 1724 ++ vendor/golang.org/x/arch/x86/x86asm/gnu.go | 956 + vendor/golang.org/x/arch/x86/x86asm/inst.go | 649 + vendor/golang.org/x/arch/x86/x86asm/intel.go | 560 + vendor/golang.org/x/arch/x86/x86asm/plan9x.go | 382 + vendor/golang.org/x/arch/x86/x86asm/tables.go | 9925 +++++++++ vendor/golang.org/x/crypto/LICENSE | 27 + vendor/golang.org/x/crypto/PATENTS | 22 + vendor/golang.org/x/crypto/sha3/doc.go | 62 + vendor/golang.org/x/crypto/sha3/hashes.go | 97 + .../x/crypto/sha3/hashes_generic.go | 28 + vendor/golang.org/x/crypto/sha3/keccakf.go | 415 + .../golang.org/x/crypto/sha3/keccakf_amd64.go | 14 + .../golang.org/x/crypto/sha3/keccakf_amd64.s | 391 + vendor/golang.org/x/crypto/sha3/register.go | 19 + vendor/golang.org/x/crypto/sha3/sha3.go | 197 + vendor/golang.org/x/crypto/sha3/sha3_s390x.go | 289 + vendor/golang.org/x/crypto/sha3/sha3_s390x.s | 34 + vendor/golang.org/x/crypto/sha3/shake.go | 172 + .../golang.org/x/crypto/sha3/shake_generic.go | 20 + vendor/golang.org/x/crypto/sha3/xor.go | 24 + .../golang.org/x/crypto/sha3/xor_generic.go | 28 + .../golang.org/x/crypto/sha3/xor_unaligned.go | 68 + vendor/golang.org/x/net/LICENSE | 27 + vendor/golang.org/x/net/PATENTS | 22 + vendor/golang.org/x/net/http/httpguts/guts.go | 50 + .../golang.org/x/net/http/httpguts/httplex.go | 352 + vendor/golang.org/x/net/http2/.gitignore | 2 + vendor/golang.org/x/net/http2/ascii.go | 53 + vendor/golang.org/x/net/http2/ciphers.go | 641 + .../x/net/http2/client_conn_pool.go | 311 + vendor/golang.org/x/net/http2/databuffer.go | 146 + vendor/golang.org/x/net/http2/errors.go | 145 + vendor/golang.org/x/net/http2/flow.go | 120 + vendor/golang.org/x/net/http2/frame.go | 1658 ++ vendor/golang.org/x/net/http2/go111.go | 30 + vendor/golang.org/x/net/http2/go115.go | 27 + vendor/golang.org/x/net/http2/go118.go | 17 + vendor/golang.org/x/net/http2/gotrack.go | 170 + vendor/golang.org/x/net/http2/h2c/h2c.go | 240 + vendor/golang.org/x/net/http2/headermap.go | 105 + vendor/golang.org/x/net/http2/hpack/encode.go | 245 + vendor/golang.org/x/net/http2/hpack/hpack.go | 523 + .../golang.org/x/net/http2/hpack/huffman.go | 226 + .../x/net/http2/hpack/static_table.go | 188 + vendor/golang.org/x/net/http2/hpack/tables.go | 403 + vendor/golang.org/x/net/http2/http2.go | 385 + vendor/golang.org/x/net/http2/not_go111.go | 21 + vendor/golang.org/x/net/http2/not_go115.go | 31 + vendor/golang.org/x/net/http2/not_go118.go | 17 + vendor/golang.org/x/net/http2/pipe.go | 175 + vendor/golang.org/x/net/http2/server.go | 3296 +++ vendor/golang.org/x/net/http2/transport.go | 3203 +++ vendor/golang.org/x/net/http2/write.go | 370 + vendor/golang.org/x/net/http2/writesched.go | 251 + .../x/net/http2/writesched_priority.go | 451 + .../x/net/http2/writesched_random.go | 77 + .../x/net/http2/writesched_roundrobin.go | 119 + vendor/golang.org/x/net/idna/go118.go | 14 + vendor/golang.org/x/net/idna/idna10.0.0.go | 770 + vendor/golang.org/x/net/idna/idna9.0.0.go | 718 + vendor/golang.org/x/net/idna/pre_go118.go | 12 + vendor/golang.org/x/net/idna/punycode.go | 217 + vendor/golang.org/x/net/idna/tables10.0.0.go | 4560 +++++ vendor/golang.org/x/net/idna/tables11.0.0.go | 4654 +++++ vendor/golang.org/x/net/idna/tables12.0.0.go | 4734 +++++ vendor/golang.org/x/net/idna/tables13.0.0.go | 4960 +++++ vendor/golang.org/x/net/idna/tables15.0.0.go | 5145 +++++ vendor/golang.org/x/net/idna/tables9.0.0.go | 4487 +++++ vendor/golang.org/x/net/idna/trie.go | 51 + vendor/golang.org/x/net/idna/trie12.0.0.go | 31 + vendor/golang.org/x/net/idna/trie13.0.0.go | 31 + vendor/golang.org/x/net/idna/trieval.go | 119 + vendor/golang.org/x/sys/LICENSE | 27 + vendor/golang.org/x/sys/PATENTS | 22 + vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s | 18 + vendor/golang.org/x/sys/cpu/byteorder.go | 66 + vendor/golang.org/x/sys/cpu/cpu.go | 290 + vendor/golang.org/x/sys/cpu/cpu_aix.go | 34 + vendor/golang.org/x/sys/cpu/cpu_arm.go | 73 + vendor/golang.org/x/sys/cpu/cpu_arm64.go | 172 + vendor/golang.org/x/sys/cpu/cpu_arm64.s | 32 + vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go | 12 + vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go | 22 + vendor/golang.org/x/sys/cpu/cpu_gc_x86.go | 17 + .../golang.org/x/sys/cpu/cpu_gccgo_arm64.go | 12 + .../golang.org/x/sys/cpu/cpu_gccgo_s390x.go | 23 + vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c | 39 + vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go | 33 + vendor/golang.org/x/sys/cpu/cpu_linux.go | 16 + vendor/golang.org/x/sys/cpu/cpu_linux_arm.go | 39 + .../golang.org/x/sys/cpu/cpu_linux_arm64.go | 111 + .../golang.org/x/sys/cpu/cpu_linux_mips64x.go | 24 + .../golang.org/x/sys/cpu/cpu_linux_noinit.go | 10 + .../golang.org/x/sys/cpu/cpu_linux_ppc64x.go | 32 + .../golang.org/x/sys/cpu/cpu_linux_s390x.go | 40 + vendor/golang.org/x/sys/cpu/cpu_loong64.go | 13 + vendor/golang.org/x/sys/cpu/cpu_mips64x.go | 16 + vendor/golang.org/x/sys/cpu/cpu_mipsx.go | 12 + .../golang.org/x/sys/cpu/cpu_netbsd_arm64.go | 173 + .../golang.org/x/sys/cpu/cpu_openbsd_arm64.go | 65 + .../golang.org/x/sys/cpu/cpu_openbsd_arm64.s | 11 + vendor/golang.org/x/sys/cpu/cpu_other_arm.go | 10 + .../golang.org/x/sys/cpu/cpu_other_arm64.go | 10 + .../golang.org/x/sys/cpu/cpu_other_mips64x.go | 13 + .../golang.org/x/sys/cpu/cpu_other_ppc64x.go | 15 + .../golang.org/x/sys/cpu/cpu_other_riscv64.go | 12 + vendor/golang.org/x/sys/cpu/cpu_ppc64x.go | 17 + vendor/golang.org/x/sys/cpu/cpu_riscv64.go | 12 + vendor/golang.org/x/sys/cpu/cpu_s390x.go | 172 + vendor/golang.org/x/sys/cpu/cpu_s390x.s | 58 + vendor/golang.org/x/sys/cpu/cpu_wasm.go | 18 + vendor/golang.org/x/sys/cpu/cpu_x86.go | 152 + vendor/golang.org/x/sys/cpu/cpu_x86.s | 28 + vendor/golang.org/x/sys/cpu/cpu_zos.go | 10 + vendor/golang.org/x/sys/cpu/cpu_zos_s390x.go | 25 + vendor/golang.org/x/sys/cpu/endian_big.go | 11 + vendor/golang.org/x/sys/cpu/endian_little.go | 11 + vendor/golang.org/x/sys/cpu/hwcap_linux.go | 71 + vendor/golang.org/x/sys/cpu/parse.go | 43 + .../x/sys/cpu/proc_cpuinfo_linux.go | 54 + vendor/golang.org/x/sys/cpu/runtime_auxv.go | 16 + .../x/sys/cpu/runtime_auxv_go121.go | 19 + .../golang.org/x/sys/cpu/syscall_aix_gccgo.go | 27 + .../x/sys/cpu/syscall_aix_ppc64_gc.go | 36 + vendor/golang.org/x/sys/unix/.gitignore | 2 + vendor/golang.org/x/sys/unix/README.md | 184 + .../golang.org/x/sys/unix/affinity_linux.go | 86 + vendor/golang.org/x/sys/unix/aliases.go | 15 + vendor/golang.org/x/sys/unix/asm_aix_ppc64.s | 18 + vendor/golang.org/x/sys/unix/asm_bsd_386.s | 29 + vendor/golang.org/x/sys/unix/asm_bsd_amd64.s | 29 + vendor/golang.org/x/sys/unix/asm_bsd_arm.s | 29 + vendor/golang.org/x/sys/unix/asm_bsd_arm64.s | 29 + vendor/golang.org/x/sys/unix/asm_bsd_ppc64.s | 31 + .../golang.org/x/sys/unix/asm_bsd_riscv64.s | 29 + vendor/golang.org/x/sys/unix/asm_linux_386.s | 66 + .../golang.org/x/sys/unix/asm_linux_amd64.s | 58 + vendor/golang.org/x/sys/unix/asm_linux_arm.s | 57 + .../golang.org/x/sys/unix/asm_linux_arm64.s | 53 + .../golang.org/x/sys/unix/asm_linux_loong64.s | 54 + .../golang.org/x/sys/unix/asm_linux_mips64x.s | 57 + .../golang.org/x/sys/unix/asm_linux_mipsx.s | 55 + .../golang.org/x/sys/unix/asm_linux_ppc64x.s | 45 + .../golang.org/x/sys/unix/asm_linux_riscv64.s | 49 + .../golang.org/x/sys/unix/asm_linux_s390x.s | 57 + .../x/sys/unix/asm_openbsd_mips64.s | 30 + .../golang.org/x/sys/unix/asm_solaris_amd64.s | 18 + vendor/golang.org/x/sys/unix/asm_zos_s390x.s | 426 + .../golang.org/x/sys/unix/bluetooth_linux.go | 36 + vendor/golang.org/x/sys/unix/cap_freebsd.go | 196 + vendor/golang.org/x/sys/unix/constants.go | 14 + vendor/golang.org/x/sys/unix/dev_aix_ppc.go | 27 + vendor/golang.org/x/sys/unix/dev_aix_ppc64.go | 29 + vendor/golang.org/x/sys/unix/dev_darwin.go | 24 + vendor/golang.org/x/sys/unix/dev_dragonfly.go | 30 + vendor/golang.org/x/sys/unix/dev_freebsd.go | 30 + vendor/golang.org/x/sys/unix/dev_linux.go | 42 + vendor/golang.org/x/sys/unix/dev_netbsd.go | 29 + vendor/golang.org/x/sys/unix/dev_openbsd.go | 29 + vendor/golang.org/x/sys/unix/dev_zos.go | 29 + vendor/golang.org/x/sys/unix/dirent.go | 103 + vendor/golang.org/x/sys/unix/endian_big.go | 10 + vendor/golang.org/x/sys/unix/endian_little.go | 10 + vendor/golang.org/x/sys/unix/env_unix.go | 32 + vendor/golang.org/x/sys/unix/epoll_zos.go | 221 + vendor/golang.org/x/sys/unix/fcntl.go | 37 + vendor/golang.org/x/sys/unix/fcntl_darwin.go | 24 + .../x/sys/unix/fcntl_linux_32bit.go | 14 + vendor/golang.org/x/sys/unix/fdset.go | 30 + vendor/golang.org/x/sys/unix/fstatfs_zos.go | 164 + vendor/golang.org/x/sys/unix/gccgo.go | 60 + vendor/golang.org/x/sys/unix/gccgo_c.c | 45 + .../x/sys/unix/gccgo_linux_amd64.go | 21 + vendor/golang.org/x/sys/unix/ifreq_linux.go | 142 + vendor/golang.org/x/sys/unix/ioctl_linux.go | 233 + vendor/golang.org/x/sys/unix/ioctl_signed.go | 70 + .../golang.org/x/sys/unix/ioctl_unsigned.go | 70 + vendor/golang.org/x/sys/unix/ioctl_zos.go | 72 + vendor/golang.org/x/sys/unix/mkall.sh | 249 + vendor/golang.org/x/sys/unix/mkerrors.sh | 784 + vendor/golang.org/x/sys/unix/mmap_nomremap.go | 14 + vendor/golang.org/x/sys/unix/mremap.go | 53 + vendor/golang.org/x/sys/unix/pagesize_unix.go | 16 + .../golang.org/x/sys/unix/pledge_openbsd.go | 163 + vendor/golang.org/x/sys/unix/ptrace_darwin.go | 12 + vendor/golang.org/x/sys/unix/ptrace_ios.go | 12 + vendor/golang.org/x/sys/unix/race.go | 31 + vendor/golang.org/x/sys/unix/race0.go | 26 + .../x/sys/unix/readdirent_getdents.go | 13 + .../x/sys/unix/readdirent_getdirentries.go | 20 + .../x/sys/unix/sockcmsg_dragonfly.go | 16 + .../golang.org/x/sys/unix/sockcmsg_linux.go | 85 + vendor/golang.org/x/sys/unix/sockcmsg_unix.go | 107 + .../x/sys/unix/sockcmsg_unix_other.go | 47 + vendor/golang.org/x/sys/unix/syscall.go | 87 + vendor/golang.org/x/sys/unix/syscall_aix.go | 582 + .../golang.org/x/sys/unix/syscall_aix_ppc.go | 53 + .../x/sys/unix/syscall_aix_ppc64.go | 84 + vendor/golang.org/x/sys/unix/syscall_bsd.go | 610 + .../golang.org/x/sys/unix/syscall_darwin.go | 646 + .../x/sys/unix/syscall_darwin_amd64.go | 51 + .../x/sys/unix/syscall_darwin_arm64.go | 51 + .../x/sys/unix/syscall_darwin_libSystem.go | 27 + .../x/sys/unix/syscall_dragonfly.go | 347 + .../x/sys/unix/syscall_dragonfly_amd64.go | 57 + .../golang.org/x/sys/unix/syscall_freebsd.go | 453 + .../x/sys/unix/syscall_freebsd_386.go | 65 + .../x/sys/unix/syscall_freebsd_amd64.go | 65 + .../x/sys/unix/syscall_freebsd_arm.go | 61 + .../x/sys/unix/syscall_freebsd_arm64.go | 61 + .../x/sys/unix/syscall_freebsd_riscv64.go | 61 + vendor/golang.org/x/sys/unix/syscall_hurd.go | 30 + .../golang.org/x/sys/unix/syscall_hurd_386.go | 29 + .../golang.org/x/sys/unix/syscall_illumos.go | 79 + vendor/golang.org/x/sys/unix/syscall_linux.go | 2484 +++ .../x/sys/unix/syscall_linux_386.go | 315 + .../x/sys/unix/syscall_linux_alarm.go | 14 + .../x/sys/unix/syscall_linux_amd64.go | 146 + .../x/sys/unix/syscall_linux_amd64_gc.go | 13 + .../x/sys/unix/syscall_linux_arm.go | 217 + .../x/sys/unix/syscall_linux_arm64.go | 185 + .../golang.org/x/sys/unix/syscall_linux_gc.go | 15 + .../x/sys/unix/syscall_linux_gc_386.go | 17 + .../x/sys/unix/syscall_linux_gc_arm.go | 14 + .../x/sys/unix/syscall_linux_gccgo_386.go | 31 + .../x/sys/unix/syscall_linux_gccgo_arm.go | 21 + .../x/sys/unix/syscall_linux_loong64.go | 217 + .../x/sys/unix/syscall_linux_mips64x.go | 190 + .../x/sys/unix/syscall_linux_mipsx.go | 176 + .../x/sys/unix/syscall_linux_ppc.go | 205 + .../x/sys/unix/syscall_linux_ppc64x.go | 117 + .../x/sys/unix/syscall_linux_riscv64.go | 190 + .../x/sys/unix/syscall_linux_s390x.go | 297 + .../x/sys/unix/syscall_linux_sparc64.go | 113 + .../golang.org/x/sys/unix/syscall_netbsd.go | 371 + .../x/sys/unix/syscall_netbsd_386.go | 38 + .../x/sys/unix/syscall_netbsd_amd64.go | 38 + .../x/sys/unix/syscall_netbsd_arm.go | 38 + .../x/sys/unix/syscall_netbsd_arm64.go | 38 + .../golang.org/x/sys/unix/syscall_openbsd.go | 329 + .../x/sys/unix/syscall_openbsd_386.go | 42 + .../x/sys/unix/syscall_openbsd_amd64.go | 42 + .../x/sys/unix/syscall_openbsd_arm.go | 42 + .../x/sys/unix/syscall_openbsd_arm64.go | 42 + .../x/sys/unix/syscall_openbsd_libc.go | 27 + .../x/sys/unix/syscall_openbsd_mips64.go | 39 + .../x/sys/unix/syscall_openbsd_ppc64.go | 42 + .../x/sys/unix/syscall_openbsd_riscv64.go | 42 + .../golang.org/x/sys/unix/syscall_solaris.go | 1103 + .../x/sys/unix/syscall_solaris_amd64.go | 28 + vendor/golang.org/x/sys/unix/syscall_unix.go | 607 + .../golang.org/x/sys/unix/syscall_unix_gc.go | 16 + .../x/sys/unix/syscall_unix_gc_ppc64x.go | 25 + .../x/sys/unix/syscall_zos_s390x.go | 1979 ++ vendor/golang.org/x/sys/unix/sysvshm_linux.go | 21 + vendor/golang.org/x/sys/unix/sysvshm_unix.go | 52 + .../x/sys/unix/sysvshm_unix_other.go | 14 + vendor/golang.org/x/sys/unix/timestruct.go | 77 + .../golang.org/x/sys/unix/unveil_openbsd.go | 42 + vendor/golang.org/x/sys/unix/xattr_bsd.go | 281 + .../golang.org/x/sys/unix/zerrors_aix_ppc.go | 1385 ++ .../x/sys/unix/zerrors_aix_ppc64.go | 1386 ++ .../x/sys/unix/zerrors_darwin_amd64.go | 1911 ++ .../x/sys/unix/zerrors_darwin_arm64.go | 1911 ++ .../x/sys/unix/zerrors_dragonfly_amd64.go | 1738 ++ .../x/sys/unix/zerrors_freebsd_386.go | 2043 ++ .../x/sys/unix/zerrors_freebsd_amd64.go | 2040 ++ .../x/sys/unix/zerrors_freebsd_arm.go | 2034 ++ .../x/sys/unix/zerrors_freebsd_arm64.go | 2034 ++ .../x/sys/unix/zerrors_freebsd_riscv64.go | 2148 ++ vendor/golang.org/x/sys/unix/zerrors_linux.go | 3539 ++++ .../x/sys/unix/zerrors_linux_386.go | 840 + .../x/sys/unix/zerrors_linux_amd64.go | 840 + .../x/sys/unix/zerrors_linux_arm.go | 846 + .../x/sys/unix/zerrors_linux_arm64.go | 840 + .../x/sys/unix/zerrors_linux_loong64.go | 832 + .../x/sys/unix/zerrors_linux_mips.go | 847 + .../x/sys/unix/zerrors_linux_mips64.go | 847 + .../x/sys/unix/zerrors_linux_mips64le.go | 847 + .../x/sys/unix/zerrors_linux_mipsle.go | 847 + .../x/sys/unix/zerrors_linux_ppc.go | 899 + .../x/sys/unix/zerrors_linux_ppc64.go | 903 + .../x/sys/unix/zerrors_linux_ppc64le.go | 903 + .../x/sys/unix/zerrors_linux_riscv64.go | 827 + .../x/sys/unix/zerrors_linux_s390x.go | 902 + .../x/sys/unix/zerrors_linux_sparc64.go | 945 + .../x/sys/unix/zerrors_netbsd_386.go | 1780 ++ .../x/sys/unix/zerrors_netbsd_amd64.go | 1770 ++ .../x/sys/unix/zerrors_netbsd_arm.go | 1759 ++ .../x/sys/unix/zerrors_netbsd_arm64.go | 1770 ++ .../x/sys/unix/zerrors_openbsd_386.go | 1906 ++ .../x/sys/unix/zerrors_openbsd_amd64.go | 1906 ++ .../x/sys/unix/zerrors_openbsd_arm.go | 1906 ++ .../x/sys/unix/zerrors_openbsd_arm64.go | 1906 ++ .../x/sys/unix/zerrors_openbsd_mips64.go | 1906 ++ .../x/sys/unix/zerrors_openbsd_ppc64.go | 1905 ++ .../x/sys/unix/zerrors_openbsd_riscv64.go | 1904 ++ .../x/sys/unix/zerrors_solaris_amd64.go | 1557 ++ .../x/sys/unix/zerrors_zos_s390x.go | 860 + .../x/sys/unix/zptrace_armnn_linux.go | 42 + .../x/sys/unix/zptrace_linux_arm64.go | 17 + .../x/sys/unix/zptrace_mipsnn_linux.go | 51 + .../x/sys/unix/zptrace_mipsnnle_linux.go | 51 + .../x/sys/unix/zptrace_x86_linux.go | 81 + .../golang.org/x/sys/unix/zsyscall_aix_ppc.go | 1462 ++ .../x/sys/unix/zsyscall_aix_ppc64.go | 1421 ++ .../x/sys/unix/zsyscall_aix_ppc64_gc.go | 1189 ++ .../x/sys/unix/zsyscall_aix_ppc64_gccgo.go | 1070 + .../x/sys/unix/zsyscall_darwin_amd64.go | 2544 +++ .../x/sys/unix/zsyscall_darwin_amd64.s | 754 + .../x/sys/unix/zsyscall_darwin_arm64.go | 2544 +++ .../x/sys/unix/zsyscall_darwin_arm64.s | 754 + .../x/sys/unix/zsyscall_dragonfly_amd64.go | 1667 ++ .../x/sys/unix/zsyscall_freebsd_386.go | 1887 ++ .../x/sys/unix/zsyscall_freebsd_amd64.go | 1887 ++ .../x/sys/unix/zsyscall_freebsd_arm.go | 1887 ++ .../x/sys/unix/zsyscall_freebsd_arm64.go | 1887 ++ .../x/sys/unix/zsyscall_freebsd_riscv64.go | 1887 ++ .../x/sys/unix/zsyscall_illumos_amd64.go | 102 + .../golang.org/x/sys/unix/zsyscall_linux.go | 2197 ++ .../x/sys/unix/zsyscall_linux_386.go | 487 + .../x/sys/unix/zsyscall_linux_amd64.go | 654 + .../x/sys/unix/zsyscall_linux_arm.go | 602 + .../x/sys/unix/zsyscall_linux_arm64.go | 553 + .../x/sys/unix/zsyscall_linux_loong64.go | 487 + .../x/sys/unix/zsyscall_linux_mips.go | 654 + .../x/sys/unix/zsyscall_linux_mips64.go | 648 + .../x/sys/unix/zsyscall_linux_mips64le.go | 637 + .../x/sys/unix/zsyscall_linux_mipsle.go | 654 + .../x/sys/unix/zsyscall_linux_ppc.go | 659 + .../x/sys/unix/zsyscall_linux_ppc64.go | 705 + .../x/sys/unix/zsyscall_linux_ppc64le.go | 705 + .../x/sys/unix/zsyscall_linux_riscv64.go | 549 + .../x/sys/unix/zsyscall_linux_s390x.go | 496 + .../x/sys/unix/zsyscall_linux_sparc64.go | 649 + .../x/sys/unix/zsyscall_netbsd_386.go | 1849 ++ .../x/sys/unix/zsyscall_netbsd_amd64.go | 1849 ++ .../x/sys/unix/zsyscall_netbsd_arm.go | 1849 ++ .../x/sys/unix/zsyscall_netbsd_arm64.go | 1849 ++ .../x/sys/unix/zsyscall_openbsd_386.go | 2231 +++ .../x/sys/unix/zsyscall_openbsd_386.s | 674 + .../x/sys/unix/zsyscall_openbsd_amd64.go | 2231 +++ .../x/sys/unix/zsyscall_openbsd_amd64.s | 674 + .../x/sys/unix/zsyscall_openbsd_arm.go | 2231 +++ .../x/sys/unix/zsyscall_openbsd_arm.s | 674 + .../x/sys/unix/zsyscall_openbsd_arm64.go | 2231 +++ .../x/sys/unix/zsyscall_openbsd_arm64.s | 674 + .../x/sys/unix/zsyscall_openbsd_mips64.go | 2231 +++ .../x/sys/unix/zsyscall_openbsd_mips64.s | 674 + .../x/sys/unix/zsyscall_openbsd_ppc64.go | 2231 +++ .../x/sys/unix/zsyscall_openbsd_ppc64.s | 808 + .../x/sys/unix/zsyscall_openbsd_riscv64.go | 2231 +++ .../x/sys/unix/zsyscall_openbsd_riscv64.s | 674 + .../x/sys/unix/zsyscall_solaris_amd64.go | 2104 ++ .../x/sys/unix/zsyscall_zos_s390x.go | 1254 ++ .../x/sys/unix/zsysctl_openbsd_386.go | 281 + .../x/sys/unix/zsysctl_openbsd_amd64.go | 281 + .../x/sys/unix/zsysctl_openbsd_arm.go | 281 + .../x/sys/unix/zsysctl_openbsd_arm64.go | 281 + .../x/sys/unix/zsysctl_openbsd_mips64.go | 281 + .../x/sys/unix/zsysctl_openbsd_ppc64.go | 281 + .../x/sys/unix/zsysctl_openbsd_riscv64.go | 282 + .../x/sys/unix/zsysnum_darwin_amd64.go | 440 + .../x/sys/unix/zsysnum_darwin_arm64.go | 438 + .../x/sys/unix/zsysnum_dragonfly_amd64.go | 317 + .../x/sys/unix/zsysnum_freebsd_386.go | 394 + .../x/sys/unix/zsysnum_freebsd_amd64.go | 394 + .../x/sys/unix/zsysnum_freebsd_arm.go | 394 + .../x/sys/unix/zsysnum_freebsd_arm64.go | 394 + .../x/sys/unix/zsysnum_freebsd_riscv64.go | 394 + .../x/sys/unix/zsysnum_linux_386.go | 451 + .../x/sys/unix/zsysnum_linux_amd64.go | 373 + .../x/sys/unix/zsysnum_linux_arm.go | 415 + .../x/sys/unix/zsysnum_linux_arm64.go | 318 + .../x/sys/unix/zsysnum_linux_loong64.go | 312 + .../x/sys/unix/zsysnum_linux_mips.go | 435 + .../x/sys/unix/zsysnum_linux_mips64.go | 365 + .../x/sys/unix/zsysnum_linux_mips64le.go | 365 + .../x/sys/unix/zsysnum_linux_mipsle.go | 435 + .../x/sys/unix/zsysnum_linux_ppc.go | 442 + .../x/sys/unix/zsysnum_linux_ppc64.go | 414 + .../x/sys/unix/zsysnum_linux_ppc64le.go | 414 + .../x/sys/unix/zsysnum_linux_riscv64.go | 319 + .../x/sys/unix/zsysnum_linux_s390x.go | 380 + .../x/sys/unix/zsysnum_linux_sparc64.go | 393 + .../x/sys/unix/zsysnum_netbsd_386.go | 275 + .../x/sys/unix/zsysnum_netbsd_amd64.go | 275 + .../x/sys/unix/zsysnum_netbsd_arm.go | 275 + .../x/sys/unix/zsysnum_netbsd_arm64.go | 275 + .../x/sys/unix/zsysnum_openbsd_386.go | 220 + .../x/sys/unix/zsysnum_openbsd_amd64.go | 220 + .../x/sys/unix/zsysnum_openbsd_arm.go | 220 + .../x/sys/unix/zsysnum_openbsd_arm64.go | 219 + .../x/sys/unix/zsysnum_openbsd_mips64.go | 222 + .../x/sys/unix/zsysnum_openbsd_ppc64.go | 218 + .../x/sys/unix/zsysnum_openbsd_riscv64.go | 219 + .../x/sys/unix/zsysnum_zos_s390x.go | 2670 +++ .../golang.org/x/sys/unix/ztypes_aix_ppc.go | 354 + .../golang.org/x/sys/unix/ztypes_aix_ppc64.go | 358 + .../x/sys/unix/ztypes_darwin_amd64.go | 806 + .../x/sys/unix/ztypes_darwin_arm64.go | 806 + .../x/sys/unix/ztypes_dragonfly_amd64.go | 474 + .../x/sys/unix/ztypes_freebsd_386.go | 651 + .../x/sys/unix/ztypes_freebsd_amd64.go | 656 + .../x/sys/unix/ztypes_freebsd_arm.go | 642 + .../x/sys/unix/ztypes_freebsd_arm64.go | 636 + .../x/sys/unix/ztypes_freebsd_riscv64.go | 638 + vendor/golang.org/x/sys/unix/ztypes_linux.go | 5885 ++++++ .../golang.org/x/sys/unix/ztypes_linux_386.go | 698 + .../x/sys/unix/ztypes_linux_amd64.go | 713 + .../golang.org/x/sys/unix/ztypes_linux_arm.go | 693 + .../x/sys/unix/ztypes_linux_arm64.go | 692 + .../x/sys/unix/ztypes_linux_loong64.go | 693 + .../x/sys/unix/ztypes_linux_mips.go | 698 + .../x/sys/unix/ztypes_linux_mips64.go | 695 + .../x/sys/unix/ztypes_linux_mips64le.go | 695 + .../x/sys/unix/ztypes_linux_mipsle.go | 698 + .../golang.org/x/sys/unix/ztypes_linux_ppc.go | 706 + .../x/sys/unix/ztypes_linux_ppc64.go | 701 + .../x/sys/unix/ztypes_linux_ppc64le.go | 701 + .../x/sys/unix/ztypes_linux_riscv64.go | 747 + .../x/sys/unix/ztypes_linux_s390x.go | 715 + .../x/sys/unix/ztypes_linux_sparc64.go | 696 + .../x/sys/unix/ztypes_netbsd_386.go | 586 + .../x/sys/unix/ztypes_netbsd_amd64.go | 594 + .../x/sys/unix/ztypes_netbsd_arm.go | 591 + .../x/sys/unix/ztypes_netbsd_arm64.go | 594 + .../x/sys/unix/ztypes_openbsd_386.go | 569 + .../x/sys/unix/ztypes_openbsd_amd64.go | 569 + .../x/sys/unix/ztypes_openbsd_arm.go | 576 + .../x/sys/unix/ztypes_openbsd_arm64.go | 569 + .../x/sys/unix/ztypes_openbsd_mips64.go | 569 + .../x/sys/unix/ztypes_openbsd_ppc64.go | 571 + .../x/sys/unix/ztypes_openbsd_riscv64.go | 571 + .../x/sys/unix/ztypes_solaris_amd64.go | 517 + .../golang.org/x/sys/unix/ztypes_zos_s390x.go | 415 + vendor/golang.org/x/text/LICENSE | 27 + vendor/golang.org/x/text/PATENTS | 22 + .../x/text/internal/language/common.go | 16 + .../x/text/internal/language/compact.go | 29 + .../text/internal/language/compact/compact.go | 61 + .../internal/language/compact/language.go | 260 + .../text/internal/language/compact/parents.go | 120 + .../text/internal/language/compact/tables.go | 1015 + .../x/text/internal/language/compact/tags.go | 91 + .../x/text/internal/language/compose.go | 167 + .../x/text/internal/language/coverage.go | 28 + .../x/text/internal/language/language.go | 627 + .../x/text/internal/language/lookup.go | 412 + .../x/text/internal/language/match.go | 226 + .../x/text/internal/language/parse.go | 608 + .../x/text/internal/language/tables.go | 3494 ++++ .../x/text/internal/language/tags.go | 48 + vendor/golang.org/x/text/internal/tag/tag.go | 100 + vendor/golang.org/x/text/language/coverage.go | 187 + vendor/golang.org/x/text/language/doc.go | 98 + vendor/golang.org/x/text/language/language.go | 605 + vendor/golang.org/x/text/language/match.go | 735 + vendor/golang.org/x/text/language/parse.go | 256 + vendor/golang.org/x/text/language/tables.go | 298 + vendor/golang.org/x/text/language/tags.go | 145 + .../x/text/secure/bidirule/bidirule.go | 336 + .../x/text/secure/bidirule/bidirule10.0.0.go | 12 + .../x/text/secure/bidirule/bidirule9.0.0.go | 15 + .../golang.org/x/text/transform/transform.go | 709 + vendor/golang.org/x/text/unicode/bidi/bidi.go | 359 + .../golang.org/x/text/unicode/bidi/bracket.go | 335 + vendor/golang.org/x/text/unicode/bidi/core.go | 1071 + vendor/golang.org/x/text/unicode/bidi/prop.go | 206 + .../x/text/unicode/bidi/tables10.0.0.go | 1816 ++ .../x/text/unicode/bidi/tables11.0.0.go | 1888 ++ .../x/text/unicode/bidi/tables12.0.0.go | 1924 ++ .../x/text/unicode/bidi/tables13.0.0.go | 1956 ++ .../x/text/unicode/bidi/tables15.0.0.go | 2043 ++ .../x/text/unicode/bidi/tables9.0.0.go | 1782 ++ .../golang.org/x/text/unicode/bidi/trieval.go | 48 + .../x/text/unicode/norm/composition.go | 512 + .../x/text/unicode/norm/forminfo.go | 279 + .../golang.org/x/text/unicode/norm/input.go | 109 + vendor/golang.org/x/text/unicode/norm/iter.go | 458 + .../x/text/unicode/norm/normalize.go | 610 + .../x/text/unicode/norm/readwriter.go | 125 + .../x/text/unicode/norm/tables10.0.0.go | 7658 +++++++ .../x/text/unicode/norm/tables11.0.0.go | 7694 +++++++ .../x/text/unicode/norm/tables12.0.0.go | 7711 +++++++ .../x/text/unicode/norm/tables13.0.0.go | 7761 ++++++++ .../x/text/unicode/norm/tables15.0.0.go | 7908 ++++++++ .../x/text/unicode/norm/tables9.0.0.go | 7638 +++++++ .../x/text/unicode/norm/transform.go | 88 + vendor/golang.org/x/text/unicode/norm/trie.go | 54 + vendor/google.golang.org/protobuf/LICENSE | 27 + vendor/google.golang.org/protobuf/PATENTS | 22 + .../protobuf/encoding/protowire/wire.go | 551 + .../protobuf/internal/detrand/rand.go | 69 + .../encoding/messageset/messageset.go | 242 + .../protobuf/internal/errors/errors.go | 89 + .../protobuf/internal/errors/is_go112.go | 40 + .../protobuf/internal/errors/is_go113.go | 13 + .../protobuf/internal/flags/flags.go | 24 + .../internal/flags/proto_legacy_disable.go | 10 + .../internal/flags/proto_legacy_enable.go | 10 + .../protobuf/internal/genid/any_gen.go | 34 + .../protobuf/internal/genid/api_gen.go | 106 + .../protobuf/internal/genid/descriptor_gen.go | 829 + .../protobuf/internal/genid/doc.go | 11 + .../protobuf/internal/genid/duration_gen.go | 34 + .../protobuf/internal/genid/empty_gen.go | 19 + .../protobuf/internal/genid/field_mask_gen.go | 31 + .../protobuf/internal/genid/goname.go | 25 + .../protobuf/internal/genid/map_entry.go | 16 + .../internal/genid/source_context_gen.go | 31 + .../protobuf/internal/genid/struct_gen.go | 116 + .../protobuf/internal/genid/timestamp_gen.go | 34 + .../protobuf/internal/genid/type_gen.go | 184 + .../protobuf/internal/genid/wrappers.go | 13 + .../protobuf/internal/genid/wrappers_gen.go | 175 + .../protobuf/internal/order/order.go | 89 + .../protobuf/internal/order/range.go | 115 + .../protobuf/internal/pragma/pragma.go | 29 + .../protobuf/internal/strs/strings.go | 196 + .../protobuf/internal/strs/strings_pure.go | 28 + .../protobuf/internal/strs/strings_unsafe.go | 95 + .../protobuf/proto/checkinit.go | 71 + .../protobuf/proto/decode.go | 294 + .../protobuf/proto/decode_gen.go | 603 + .../google.golang.org/protobuf/proto/doc.go | 89 + .../protobuf/proto/encode.go | 322 + .../protobuf/proto/encode_gen.go | 97 + .../google.golang.org/protobuf/proto/equal.go | 171 + .../protobuf/proto/extension.go | 92 + .../google.golang.org/protobuf/proto/merge.go | 139 + .../protobuf/proto/messageset.go | 93 + .../google.golang.org/protobuf/proto/proto.go | 43 + .../protobuf/proto/proto_methods.go | 20 + .../protobuf/proto/proto_reflect.go | 20 + .../google.golang.org/protobuf/proto/reset.go | 43 + .../google.golang.org/protobuf/proto/size.go | 97 + .../protobuf/proto/size_gen.go | 55 + .../protobuf/proto/wrappers.go | 29 + .../protobuf/reflect/protoreflect/methods.go | 78 + .../protobuf/reflect/protoreflect/proto.go | 508 + .../protobuf/reflect/protoreflect/source.go | 129 + .../reflect/protoreflect/source_gen.go | 461 + .../protobuf/reflect/protoreflect/type.go | 666 + .../protobuf/reflect/protoreflect/value.go | 285 + .../reflect/protoreflect/value_pure.go | 60 + .../reflect/protoreflect/value_union.go | 438 + .../reflect/protoreflect/value_unsafe.go | 99 + .../reflect/protoregistry/registry.go | 882 + .../protobuf/runtime/protoiface/legacy.go | 15 + .../protobuf/runtime/protoiface/methods.go | 168 + vendor/gopkg.in/yaml.v3/LICENSE | 50 + vendor/gopkg.in/yaml.v3/NOTICE | 13 + vendor/gopkg.in/yaml.v3/README.md | 150 + vendor/gopkg.in/yaml.v3/apic.go | 747 + vendor/gopkg.in/yaml.v3/decode.go | 1000 + vendor/gopkg.in/yaml.v3/emitterc.go | 2020 ++ vendor/gopkg.in/yaml.v3/encode.go | 577 + vendor/gopkg.in/yaml.v3/parserc.go | 1258 ++ vendor/gopkg.in/yaml.v3/readerc.go | 434 + vendor/gopkg.in/yaml.v3/resolve.go | 326 + vendor/gopkg.in/yaml.v3/scannerc.go | 3038 +++ vendor/gopkg.in/yaml.v3/sorter.go | 134 + vendor/gopkg.in/yaml.v3/writerc.go | 48 + vendor/gopkg.in/yaml.v3/yaml.go | 698 + vendor/gopkg.in/yaml.v3/yamlh.go | 807 + vendor/gopkg.in/yaml.v3/yamlprivateh.go | 198 + vendor/modules.txt | 147 + 1255 files changed, 604360 insertions(+), 1074 deletions(-) create mode 100644 .github/dependabot.yml delete mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 Procfile create mode 100644 README.md create mode 100644 docker-compose.yml create mode 100644 go.mod create mode 100644 go.sum delete mode 100644 index.js create mode 100644 main.go delete mode 100644 package-lock.json delete mode 100644 package.json create mode 100644 scalingo.json delete mode 100644 screenshot.xwd create mode 100644 templates/index.tmpl create mode 100644 vendor/github.com/bytedance/sonic/.gitignore create mode 100644 vendor/github.com/bytedance/sonic/.gitmodules create mode 100644 vendor/github.com/bytedance/sonic/.licenserc.yaml create mode 100644 vendor/github.com/bytedance/sonic/CODE_OF_CONDUCT.md create mode 100644 vendor/github.com/bytedance/sonic/CONTRIBUTING.md create mode 100644 vendor/github.com/bytedance/sonic/CREDITS create mode 100644 vendor/github.com/bytedance/sonic/INTRODUCTION.md create mode 100644 vendor/github.com/bytedance/sonic/LICENSE create mode 100644 vendor/github.com/bytedance/sonic/Makefile create mode 100644 vendor/github.com/bytedance/sonic/README.md create mode 100644 vendor/github.com/bytedance/sonic/api.go create mode 100644 vendor/github.com/bytedance/sonic/ast/api_amd64.go create mode 100644 vendor/github.com/bytedance/sonic/ast/api_compat.go create mode 100644 vendor/github.com/bytedance/sonic/ast/asm.s create mode 100644 vendor/github.com/bytedance/sonic/ast/decode.go create mode 100644 vendor/github.com/bytedance/sonic/ast/encode.go create mode 100644 vendor/github.com/bytedance/sonic/ast/error.go create mode 100644 vendor/github.com/bytedance/sonic/ast/iterator.go create mode 100644 vendor/github.com/bytedance/sonic/ast/node.go create mode 100644 vendor/github.com/bytedance/sonic/ast/parser.go create mode 100644 vendor/github.com/bytedance/sonic/ast/search.go create mode 100644 vendor/github.com/bytedance/sonic/ast/sort.go create mode 100644 vendor/github.com/bytedance/sonic/ast/stubs_go115.go create mode 100644 vendor/github.com/bytedance/sonic/ast/stubs_go120.go create mode 100644 vendor/github.com/bytedance/sonic/bench-arm.sh create mode 100644 vendor/github.com/bytedance/sonic/bench-large.png create mode 100644 vendor/github.com/bytedance/sonic/bench-small.png create mode 100644 vendor/github.com/bytedance/sonic/bench.py create mode 100644 vendor/github.com/bytedance/sonic/bench.sh create mode 100644 vendor/github.com/bytedance/sonic/check_branch_name.sh create mode 100644 vendor/github.com/bytedance/sonic/compat.go create mode 100644 vendor/github.com/bytedance/sonic/decoder/asm.s create mode 100644 vendor/github.com/bytedance/sonic/decoder/assembler_amd64_go116.go create mode 100644 vendor/github.com/bytedance/sonic/decoder/assembler_amd64_go117.go create mode 100644 vendor/github.com/bytedance/sonic/decoder/compiler.go create mode 100644 vendor/github.com/bytedance/sonic/decoder/debug.go create mode 100644 vendor/github.com/bytedance/sonic/decoder/decoder.go create mode 100644 vendor/github.com/bytedance/sonic/decoder/errors.go create mode 100644 vendor/github.com/bytedance/sonic/decoder/generic_amd64_go116.go create mode 100644 vendor/github.com/bytedance/sonic/decoder/generic_amd64_go117.go create mode 100644 vendor/github.com/bytedance/sonic/decoder/generic_amd64_go117_test.s create mode 100644 vendor/github.com/bytedance/sonic/decoder/generic_amd64_test.s create mode 100644 vendor/github.com/bytedance/sonic/decoder/pools.go create mode 100644 vendor/github.com/bytedance/sonic/decoder/primitives.go create mode 100644 vendor/github.com/bytedance/sonic/decoder/stream.go create mode 100644 vendor/github.com/bytedance/sonic/decoder/stubs_go115.go create mode 100644 vendor/github.com/bytedance/sonic/decoder/stubs_go120.go create mode 100644 vendor/github.com/bytedance/sonic/decoder/types.go create mode 100644 vendor/github.com/bytedance/sonic/decoder/utils.go create mode 100644 vendor/github.com/bytedance/sonic/encoder/asm.s create mode 100644 vendor/github.com/bytedance/sonic/encoder/assembler_amd64_go116.go create mode 100644 vendor/github.com/bytedance/sonic/encoder/assembler_amd64_go117.go create mode 100644 vendor/github.com/bytedance/sonic/encoder/compiler.go create mode 100644 vendor/github.com/bytedance/sonic/encoder/debug_go116.go create mode 100644 vendor/github.com/bytedance/sonic/encoder/debug_go117.go create mode 100644 vendor/github.com/bytedance/sonic/encoder/encoder.go create mode 100644 vendor/github.com/bytedance/sonic/encoder/errors.go create mode 100644 vendor/github.com/bytedance/sonic/encoder/mapiter.go create mode 100644 vendor/github.com/bytedance/sonic/encoder/pools.go create mode 100644 vendor/github.com/bytedance/sonic/encoder/primitives.go create mode 100644 vendor/github.com/bytedance/sonic/encoder/sort.go create mode 100644 vendor/github.com/bytedance/sonic/encoder/stream.go create mode 100644 vendor/github.com/bytedance/sonic/encoder/stubs_go116.go create mode 100644 vendor/github.com/bytedance/sonic/encoder/stubs_go117.go create mode 100644 vendor/github.com/bytedance/sonic/encoder/stubs_go120.go create mode 100644 vendor/github.com/bytedance/sonic/encoder/types.go create mode 100644 vendor/github.com/bytedance/sonic/encoder/utils.go create mode 100644 vendor/github.com/bytedance/sonic/go.work create mode 100644 vendor/github.com/bytedance/sonic/internal/caching/asm.s create mode 100644 vendor/github.com/bytedance/sonic/internal/caching/fcache.go create mode 100644 vendor/github.com/bytedance/sonic/internal/caching/hashing.go create mode 100644 vendor/github.com/bytedance/sonic/internal/caching/pcache.go create mode 100644 vendor/github.com/bytedance/sonic/internal/cpu/features.go create mode 100644 vendor/github.com/bytedance/sonic/internal/jit/arch_amd64.go create mode 100644 vendor/github.com/bytedance/sonic/internal/jit/asm.s create mode 100644 vendor/github.com/bytedance/sonic/internal/jit/assembler_amd64.go create mode 100644 vendor/github.com/bytedance/sonic/internal/jit/backend.go create mode 100644 vendor/github.com/bytedance/sonic/internal/jit/runtime.go create mode 100644 vendor/github.com/bytedance/sonic/internal/loader/asm.s create mode 100644 vendor/github.com/bytedance/sonic/internal/loader/funcdata.go create mode 100644 vendor/github.com/bytedance/sonic/internal/loader/funcdata_go115.go create mode 100644 vendor/github.com/bytedance/sonic/internal/loader/funcdata_go116.go create mode 100644 vendor/github.com/bytedance/sonic/internal/loader/funcdata_go118.go create mode 100644 vendor/github.com/bytedance/sonic/internal/loader/funcdata_go120.go create mode 100644 vendor/github.com/bytedance/sonic/internal/loader/loader.go create mode 100644 vendor/github.com/bytedance/sonic/internal/loader/loader_windows.go create mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx/native_amd64.go create mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx/native_amd64.s create mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx/native_export_amd64.go create mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx/native_subr_amd64.go create mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/native_amd64.go create mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/native_amd64.s create mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/native_export_amd64.go create mode 100644 vendor/github.com/bytedance/sonic/internal/native/avx2/native_subr_amd64.go create mode 100644 vendor/github.com/bytedance/sonic/internal/native/dispatch_amd64.go create mode 100644 vendor/github.com/bytedance/sonic/internal/native/dispatch_amd64.s create mode 100644 vendor/github.com/bytedance/sonic/internal/native/fastfloat_amd64_test.tmpl create mode 100644 vendor/github.com/bytedance/sonic/internal/native/fastint_amd64_test.tmpl create mode 100644 vendor/github.com/bytedance/sonic/internal/native/native_amd64.tmpl create mode 100644 vendor/github.com/bytedance/sonic/internal/native/native_amd64_test.tmpl create mode 100644 vendor/github.com/bytedance/sonic/internal/native/native_export_amd64.tmpl create mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/native_amd64.go create mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/native_amd64.s create mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/native_export_amd64.go create mode 100644 vendor/github.com/bytedance/sonic/internal/native/sse/native_subr_amd64.go create mode 100644 vendor/github.com/bytedance/sonic/internal/native/types/types.go create mode 100644 vendor/github.com/bytedance/sonic/internal/resolver/asm.s create mode 100644 vendor/github.com/bytedance/sonic/internal/resolver/resolver.go create mode 100644 vendor/github.com/bytedance/sonic/internal/resolver/stubs.go create mode 100644 vendor/github.com/bytedance/sonic/internal/rt/asm_amd64.s create mode 100644 vendor/github.com/bytedance/sonic/internal/rt/asm_arm64.s create mode 100644 vendor/github.com/bytedance/sonic/internal/rt/fastmem.go create mode 100644 vendor/github.com/bytedance/sonic/internal/rt/fastvalue.go create mode 100644 vendor/github.com/bytedance/sonic/internal/rt/gcwb.go create mode 100644 vendor/github.com/bytedance/sonic/internal/rt/int48.go create mode 100644 vendor/github.com/bytedance/sonic/internal/rt/stackmap.go create mode 100644 vendor/github.com/bytedance/sonic/introduction-1.png create mode 100644 vendor/github.com/bytedance/sonic/introduction-2.png create mode 100644 vendor/github.com/bytedance/sonic/loader/funcdata.go create mode 100644 vendor/github.com/bytedance/sonic/loader/funcdata_go115.go create mode 100644 vendor/github.com/bytedance/sonic/loader/funcdata_go118.go create mode 100644 vendor/github.com/bytedance/sonic/loader/funcdata_go120.go create mode 100644 vendor/github.com/bytedance/sonic/loader/loader.go create mode 100644 vendor/github.com/bytedance/sonic/loader/loader_go115.go create mode 100644 vendor/github.com/bytedance/sonic/loader/loader_go118.go create mode 100644 vendor/github.com/bytedance/sonic/loader/mmap_unix.go create mode 100644 vendor/github.com/bytedance/sonic/loader/mmap_windows.go create mode 100644 vendor/github.com/bytedance/sonic/loader/pcdata.go create mode 100644 vendor/github.com/bytedance/sonic/loader/stubs.go create mode 100644 vendor/github.com/bytedance/sonic/option/option.go create mode 100644 vendor/github.com/bytedance/sonic/other-langs.png create mode 100644 vendor/github.com/bytedance/sonic/sonic.go create mode 100644 vendor/github.com/bytedance/sonic/unquote/unquote.go create mode 100644 vendor/github.com/bytedance/sonic/utf8/utf8.go create mode 100644 vendor/github.com/chenzhuoyu/base64x/.gitignore create mode 100644 vendor/github.com/chenzhuoyu/base64x/.gitmodules create mode 100644 vendor/github.com/chenzhuoyu/base64x/LICENSE create mode 100644 vendor/github.com/chenzhuoyu/base64x/Makefile create mode 100644 vendor/github.com/chenzhuoyu/base64x/README.md create mode 100644 vendor/github.com/chenzhuoyu/base64x/base64x.go create mode 100644 vendor/github.com/chenzhuoyu/base64x/cpuid.go create mode 100644 vendor/github.com/chenzhuoyu/base64x/faststr.go create mode 100644 vendor/github.com/chenzhuoyu/base64x/native_amd64.go create mode 100644 vendor/github.com/chenzhuoyu/base64x/native_amd64.s create mode 100644 vendor/github.com/chenzhuoyu/base64x/native_subr_amd64.go create mode 100644 vendor/github.com/gin-contrib/sse/.travis.yml create mode 100644 vendor/github.com/gin-contrib/sse/LICENSE create mode 100644 vendor/github.com/gin-contrib/sse/README.md create mode 100644 vendor/github.com/gin-contrib/sse/sse-decoder.go create mode 100644 vendor/github.com/gin-contrib/sse/sse-encoder.go create mode 100644 vendor/github.com/gin-contrib/sse/writer.go create mode 100644 vendor/github.com/gin-gonic/gin/.gitignore create mode 100644 vendor/github.com/gin-gonic/gin/.golangci.yml create mode 100644 vendor/github.com/gin-gonic/gin/.goreleaser.yaml create mode 100644 vendor/github.com/gin-gonic/gin/AUTHORS.md create mode 100644 vendor/github.com/gin-gonic/gin/BENCHMARKS.md create mode 100644 vendor/github.com/gin-gonic/gin/CHANGELOG.md create mode 100644 vendor/github.com/gin-gonic/gin/CODE_OF_CONDUCT.md create mode 100644 vendor/github.com/gin-gonic/gin/CONTRIBUTING.md create mode 100644 vendor/github.com/gin-gonic/gin/LICENSE create mode 100644 vendor/github.com/gin-gonic/gin/Makefile create mode 100644 vendor/github.com/gin-gonic/gin/README.md create mode 100644 vendor/github.com/gin-gonic/gin/any.go create mode 100644 vendor/github.com/gin-gonic/gin/auth.go create mode 100644 vendor/github.com/gin-gonic/gin/binding/any.go create mode 100644 vendor/github.com/gin-gonic/gin/binding/binding.go create mode 100644 vendor/github.com/gin-gonic/gin/binding/binding_nomsgpack.go create mode 100644 vendor/github.com/gin-gonic/gin/binding/default_validator.go create mode 100644 vendor/github.com/gin-gonic/gin/binding/form.go create mode 100644 vendor/github.com/gin-gonic/gin/binding/form_mapping.go create mode 100644 vendor/github.com/gin-gonic/gin/binding/header.go create mode 100644 vendor/github.com/gin-gonic/gin/binding/json.go create mode 100644 vendor/github.com/gin-gonic/gin/binding/msgpack.go create mode 100644 vendor/github.com/gin-gonic/gin/binding/multipart_form_mapping.go create mode 100644 vendor/github.com/gin-gonic/gin/binding/protobuf.go create mode 100644 vendor/github.com/gin-gonic/gin/binding/query.go create mode 100644 vendor/github.com/gin-gonic/gin/binding/toml.go create mode 100644 vendor/github.com/gin-gonic/gin/binding/uri.go create mode 100644 vendor/github.com/gin-gonic/gin/binding/xml.go create mode 100644 vendor/github.com/gin-gonic/gin/binding/yaml.go create mode 100644 vendor/github.com/gin-gonic/gin/codecov.yml create mode 100644 vendor/github.com/gin-gonic/gin/context.go create mode 100644 vendor/github.com/gin-gonic/gin/context_appengine.go create mode 100644 vendor/github.com/gin-gonic/gin/debug.go create mode 100644 vendor/github.com/gin-gonic/gin/deprecated.go create mode 100644 vendor/github.com/gin-gonic/gin/doc.go create mode 100644 vendor/github.com/gin-gonic/gin/errors.go create mode 100644 vendor/github.com/gin-gonic/gin/fs.go create mode 100644 vendor/github.com/gin-gonic/gin/gin.go create mode 100644 vendor/github.com/gin-gonic/gin/internal/bytesconv/bytesconv.go create mode 100644 vendor/github.com/gin-gonic/gin/internal/json/go_json.go create mode 100644 vendor/github.com/gin-gonic/gin/internal/json/json.go create mode 100644 vendor/github.com/gin-gonic/gin/internal/json/jsoniter.go create mode 100644 vendor/github.com/gin-gonic/gin/internal/json/sonic.go create mode 100644 vendor/github.com/gin-gonic/gin/logger.go create mode 100644 vendor/github.com/gin-gonic/gin/mode.go create mode 100644 vendor/github.com/gin-gonic/gin/path.go create mode 100644 vendor/github.com/gin-gonic/gin/recovery.go create mode 100644 vendor/github.com/gin-gonic/gin/render/any.go create mode 100644 vendor/github.com/gin-gonic/gin/render/data.go create mode 100644 vendor/github.com/gin-gonic/gin/render/html.go create mode 100644 vendor/github.com/gin-gonic/gin/render/json.go create mode 100644 vendor/github.com/gin-gonic/gin/render/msgpack.go create mode 100644 vendor/github.com/gin-gonic/gin/render/protobuf.go create mode 100644 vendor/github.com/gin-gonic/gin/render/reader.go create mode 100644 vendor/github.com/gin-gonic/gin/render/redirect.go create mode 100644 vendor/github.com/gin-gonic/gin/render/render.go create mode 100644 vendor/github.com/gin-gonic/gin/render/text.go create mode 100644 vendor/github.com/gin-gonic/gin/render/toml.go create mode 100644 vendor/github.com/gin-gonic/gin/render/xml.go create mode 100644 vendor/github.com/gin-gonic/gin/render/yaml.go create mode 100644 vendor/github.com/gin-gonic/gin/response_writer.go create mode 100644 vendor/github.com/gin-gonic/gin/routergroup.go create mode 100644 vendor/github.com/gin-gonic/gin/test_helpers.go create mode 100644 vendor/github.com/gin-gonic/gin/tree.go create mode 100644 vendor/github.com/gin-gonic/gin/utils.go create mode 100644 vendor/github.com/gin-gonic/gin/version.go create mode 100644 vendor/github.com/go-playground/locales/.gitignore create mode 100644 vendor/github.com/go-playground/locales/.travis.yml create mode 100644 vendor/github.com/go-playground/locales/LICENSE create mode 100644 vendor/github.com/go-playground/locales/README.md create mode 100644 vendor/github.com/go-playground/locales/currency/currency.go create mode 100644 vendor/github.com/go-playground/locales/logo.png create mode 100644 vendor/github.com/go-playground/locales/rules.go create mode 100644 vendor/github.com/go-playground/universal-translator/.gitignore create mode 100644 vendor/github.com/go-playground/universal-translator/.travis.yml create mode 100644 vendor/github.com/go-playground/universal-translator/LICENSE create mode 100644 vendor/github.com/go-playground/universal-translator/Makefile create mode 100644 vendor/github.com/go-playground/universal-translator/README.md create mode 100644 vendor/github.com/go-playground/universal-translator/errors.go create mode 100644 vendor/github.com/go-playground/universal-translator/import_export.go create mode 100644 vendor/github.com/go-playground/universal-translator/logo.png create mode 100644 vendor/github.com/go-playground/universal-translator/translator.go create mode 100644 vendor/github.com/go-playground/universal-translator/universal_translator.go create mode 100644 vendor/github.com/go-playground/validator/v10/.gitignore create mode 100644 vendor/github.com/go-playground/validator/v10/LICENSE create mode 100644 vendor/github.com/go-playground/validator/v10/MAINTAINERS.md create mode 100644 vendor/github.com/go-playground/validator/v10/Makefile create mode 100644 vendor/github.com/go-playground/validator/v10/README.md create mode 100644 vendor/github.com/go-playground/validator/v10/baked_in.go create mode 100644 vendor/github.com/go-playground/validator/v10/cache.go create mode 100644 vendor/github.com/go-playground/validator/v10/country_codes.go create mode 100644 vendor/github.com/go-playground/validator/v10/currency_codes.go create mode 100644 vendor/github.com/go-playground/validator/v10/doc.go create mode 100644 vendor/github.com/go-playground/validator/v10/errors.go create mode 100644 vendor/github.com/go-playground/validator/v10/field_level.go create mode 100644 vendor/github.com/go-playground/validator/v10/logo.png create mode 100644 vendor/github.com/go-playground/validator/v10/postcode_regexes.go create mode 100644 vendor/github.com/go-playground/validator/v10/regexes.go create mode 100644 vendor/github.com/go-playground/validator/v10/struct_level.go create mode 100644 vendor/github.com/go-playground/validator/v10/translations.go create mode 100644 vendor/github.com/go-playground/validator/v10/util.go create mode 100644 vendor/github.com/go-playground/validator/v10/validator.go create mode 100644 vendor/github.com/go-playground/validator/v10/validator_instance.go create mode 100644 vendor/github.com/goccy/go-json/.codecov.yml create mode 100644 vendor/github.com/goccy/go-json/.gitignore create mode 100644 vendor/github.com/goccy/go-json/.golangci.yml create mode 100644 vendor/github.com/goccy/go-json/CHANGELOG.md create mode 100644 vendor/github.com/goccy/go-json/LICENSE create mode 100644 vendor/github.com/goccy/go-json/Makefile create mode 100644 vendor/github.com/goccy/go-json/README.md create mode 100644 vendor/github.com/goccy/go-json/color.go create mode 100644 vendor/github.com/goccy/go-json/decode.go create mode 100644 vendor/github.com/goccy/go-json/docker-compose.yml create mode 100644 vendor/github.com/goccy/go-json/encode.go create mode 100644 vendor/github.com/goccy/go-json/error.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/anonymous_field.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/array.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/assign.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/bool.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/bytes.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/compile.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/compile_norace.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/compile_race.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/context.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/float.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/func.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/int.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/interface.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/invalid.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/map.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/number.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/option.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/path.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/ptr.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/slice.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/stream.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/string.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/struct.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/type.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/uint.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/unmarshal_json.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/unmarshal_text.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/wrapped_string.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/code.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/compact.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/compiler.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/compiler_norace.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/compiler_race.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/context.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/decode_rune.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/encoder.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/indent.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/int.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/map112.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/map113.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/opcode.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/option.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/optype.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/query.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/string.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/string_table.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm/debug_vm.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm/hack.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm/util.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm/vm.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm_color/debug_vm.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm_color/hack.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm_color/util.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm_color/vm.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm_color_indent/debug_vm.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm_color_indent/util.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm_color_indent/vm.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm_indent/debug_vm.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm_indent/hack.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm_indent/util.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm_indent/vm.go create mode 100644 vendor/github.com/goccy/go-json/internal/errors/error.go create mode 100644 vendor/github.com/goccy/go-json/internal/runtime/rtype.go create mode 100644 vendor/github.com/goccy/go-json/internal/runtime/struct_field.go create mode 100644 vendor/github.com/goccy/go-json/internal/runtime/type.go create mode 100644 vendor/github.com/goccy/go-json/json.go create mode 100644 vendor/github.com/goccy/go-json/option.go create mode 100644 vendor/github.com/goccy/go-json/path.go create mode 100644 vendor/github.com/goccy/go-json/query.go create mode 100644 vendor/github.com/json-iterator/go/.codecov.yml create mode 100644 vendor/github.com/json-iterator/go/.gitignore create mode 100644 vendor/github.com/json-iterator/go/.travis.yml create mode 100644 vendor/github.com/json-iterator/go/Gopkg.lock create mode 100644 vendor/github.com/json-iterator/go/Gopkg.toml create mode 100644 vendor/github.com/json-iterator/go/LICENSE create mode 100644 vendor/github.com/json-iterator/go/README.md create mode 100644 vendor/github.com/json-iterator/go/adapter.go create mode 100644 vendor/github.com/json-iterator/go/any.go create mode 100644 vendor/github.com/json-iterator/go/any_array.go create mode 100644 vendor/github.com/json-iterator/go/any_bool.go create mode 100644 vendor/github.com/json-iterator/go/any_float.go create mode 100644 vendor/github.com/json-iterator/go/any_int32.go create mode 100644 vendor/github.com/json-iterator/go/any_int64.go create mode 100644 vendor/github.com/json-iterator/go/any_invalid.go create mode 100644 vendor/github.com/json-iterator/go/any_nil.go create mode 100644 vendor/github.com/json-iterator/go/any_number.go create mode 100644 vendor/github.com/json-iterator/go/any_object.go create mode 100644 vendor/github.com/json-iterator/go/any_str.go create mode 100644 vendor/github.com/json-iterator/go/any_uint32.go create mode 100644 vendor/github.com/json-iterator/go/any_uint64.go create mode 100644 vendor/github.com/json-iterator/go/build.sh create mode 100644 vendor/github.com/json-iterator/go/config.go create mode 100644 vendor/github.com/json-iterator/go/fuzzy_mode_convert_table.md create mode 100644 vendor/github.com/json-iterator/go/iter.go create mode 100644 vendor/github.com/json-iterator/go/iter_array.go create mode 100644 vendor/github.com/json-iterator/go/iter_float.go create mode 100644 vendor/github.com/json-iterator/go/iter_int.go create mode 100644 vendor/github.com/json-iterator/go/iter_object.go create mode 100644 vendor/github.com/json-iterator/go/iter_skip.go create mode 100644 vendor/github.com/json-iterator/go/iter_skip_sloppy.go create mode 100644 vendor/github.com/json-iterator/go/iter_skip_strict.go create mode 100644 vendor/github.com/json-iterator/go/iter_str.go create mode 100644 vendor/github.com/json-iterator/go/jsoniter.go create mode 100644 vendor/github.com/json-iterator/go/pool.go create mode 100644 vendor/github.com/json-iterator/go/reflect.go create mode 100644 vendor/github.com/json-iterator/go/reflect_array.go create mode 100644 vendor/github.com/json-iterator/go/reflect_dynamic.go create mode 100644 vendor/github.com/json-iterator/go/reflect_extension.go create mode 100644 vendor/github.com/json-iterator/go/reflect_json_number.go create mode 100644 vendor/github.com/json-iterator/go/reflect_json_raw_message.go create mode 100644 vendor/github.com/json-iterator/go/reflect_map.go create mode 100644 vendor/github.com/json-iterator/go/reflect_marshaler.go create mode 100644 vendor/github.com/json-iterator/go/reflect_native.go create mode 100644 vendor/github.com/json-iterator/go/reflect_optional.go create mode 100644 vendor/github.com/json-iterator/go/reflect_slice.go create mode 100644 vendor/github.com/json-iterator/go/reflect_struct_decoder.go create mode 100644 vendor/github.com/json-iterator/go/reflect_struct_encoder.go create mode 100644 vendor/github.com/json-iterator/go/stream.go create mode 100644 vendor/github.com/json-iterator/go/stream_float.go create mode 100644 vendor/github.com/json-iterator/go/stream_int.go create mode 100644 vendor/github.com/json-iterator/go/stream_str.go create mode 100644 vendor/github.com/json-iterator/go/test.sh create mode 100644 vendor/github.com/klauspost/cpuid/v2/.gitignore create mode 100644 vendor/github.com/klauspost/cpuid/v2/.goreleaser.yml create mode 100644 vendor/github.com/klauspost/cpuid/v2/CONTRIBUTING.txt create mode 100644 vendor/github.com/klauspost/cpuid/v2/LICENSE create mode 100644 vendor/github.com/klauspost/cpuid/v2/README.md create mode 100644 vendor/github.com/klauspost/cpuid/v2/cpuid.go create mode 100644 vendor/github.com/klauspost/cpuid/v2/cpuid_386.s create mode 100644 vendor/github.com/klauspost/cpuid/v2/cpuid_amd64.s create mode 100644 vendor/github.com/klauspost/cpuid/v2/cpuid_arm64.s create mode 100644 vendor/github.com/klauspost/cpuid/v2/detect_arm64.go create mode 100644 vendor/github.com/klauspost/cpuid/v2/detect_ref.go create mode 100644 vendor/github.com/klauspost/cpuid/v2/detect_x86.go create mode 100644 vendor/github.com/klauspost/cpuid/v2/featureid_string.go create mode 100644 vendor/github.com/klauspost/cpuid/v2/os_darwin_arm64.go create mode 100644 vendor/github.com/klauspost/cpuid/v2/os_linux_arm64.go create mode 100644 vendor/github.com/klauspost/cpuid/v2/os_other_arm64.go create mode 100644 vendor/github.com/klauspost/cpuid/v2/os_safe_linux_arm64.go create mode 100644 vendor/github.com/klauspost/cpuid/v2/os_unsafe_linux_arm64.go create mode 100644 vendor/github.com/klauspost/cpuid/v2/test-architectures.sh create mode 100644 vendor/github.com/leodido/go-urn/.gitignore create mode 100644 vendor/github.com/leodido/go-urn/.travis.yml create mode 100644 vendor/github.com/leodido/go-urn/LICENSE create mode 100644 vendor/github.com/leodido/go-urn/README.md create mode 100644 vendor/github.com/leodido/go-urn/machine.go create mode 100644 vendor/github.com/leodido/go-urn/machine.go.rl create mode 100644 vendor/github.com/leodido/go-urn/makefile create mode 100644 vendor/github.com/leodido/go-urn/urn.go create mode 100644 vendor/github.com/mattn/go-isatty/LICENSE create mode 100644 vendor/github.com/mattn/go-isatty/README.md create mode 100644 vendor/github.com/mattn/go-isatty/doc.go create mode 100644 vendor/github.com/mattn/go-isatty/go.test.sh create mode 100644 vendor/github.com/mattn/go-isatty/isatty_bsd.go create mode 100644 vendor/github.com/mattn/go-isatty/isatty_others.go create mode 100644 vendor/github.com/mattn/go-isatty/isatty_plan9.go create mode 100644 vendor/github.com/mattn/go-isatty/isatty_solaris.go create mode 100644 vendor/github.com/mattn/go-isatty/isatty_tcgets.go create mode 100644 vendor/github.com/mattn/go-isatty/isatty_windows.go create mode 100644 vendor/github.com/modern-go/concurrent/LICENSE create mode 100644 vendor/github.com/modern-go/concurrent/README.md create mode 100644 vendor/github.com/modern-go/concurrent/executor.go create mode 100644 vendor/github.com/modern-go/concurrent/go_above_19.go create mode 100644 vendor/github.com/modern-go/concurrent/go_below_19.go create mode 100644 vendor/github.com/modern-go/concurrent/unbounded_executor.go create mode 100644 vendor/github.com/modern-go/reflect2/.gitignore create mode 100644 vendor/github.com/modern-go/reflect2/.travis.yml create mode 100644 vendor/github.com/modern-go/reflect2/Gopkg.lock create mode 100644 vendor/github.com/modern-go/reflect2/Gopkg.toml create mode 100644 vendor/github.com/modern-go/reflect2/LICENSE create mode 100644 vendor/github.com/modern-go/reflect2/README.md create mode 100644 vendor/github.com/modern-go/reflect2/go_above_118.go create mode 100644 vendor/github.com/modern-go/reflect2/go_above_19.go create mode 100644 vendor/github.com/modern-go/reflect2/go_below_118.go create mode 100644 vendor/github.com/modern-go/reflect2/reflect2.go create mode 100644 vendor/github.com/modern-go/reflect2/reflect2_amd64.s create mode 100644 vendor/github.com/modern-go/reflect2/reflect2_kind.go create mode 100644 vendor/github.com/modern-go/reflect2/relfect2_386.s create mode 100644 vendor/github.com/modern-go/reflect2/relfect2_amd64p32.s create mode 100644 vendor/github.com/modern-go/reflect2/relfect2_arm.s create mode 100644 vendor/github.com/modern-go/reflect2/relfect2_arm64.s create mode 100644 vendor/github.com/modern-go/reflect2/relfect2_mips64x.s create mode 100644 vendor/github.com/modern-go/reflect2/relfect2_mipsx.s create mode 100644 vendor/github.com/modern-go/reflect2/relfect2_ppc64x.s create mode 100644 vendor/github.com/modern-go/reflect2/relfect2_s390x.s create mode 100644 vendor/github.com/modern-go/reflect2/safe_field.go create mode 100644 vendor/github.com/modern-go/reflect2/safe_map.go create mode 100644 vendor/github.com/modern-go/reflect2/safe_slice.go create mode 100644 vendor/github.com/modern-go/reflect2/safe_struct.go create mode 100644 vendor/github.com/modern-go/reflect2/safe_type.go create mode 100644 vendor/github.com/modern-go/reflect2/type_map.go create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_array.go create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_eface.go create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_field.go create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_iface.go create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_link.go create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_map.go create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_ptr.go create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_slice.go create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_struct.go create mode 100644 vendor/github.com/modern-go/reflect2/unsafe_type.go create mode 100644 vendor/github.com/pelletier/go-toml/v2/.dockerignore create mode 100644 vendor/github.com/pelletier/go-toml/v2/.gitattributes create mode 100644 vendor/github.com/pelletier/go-toml/v2/.gitignore create mode 100644 vendor/github.com/pelletier/go-toml/v2/.golangci.toml create mode 100644 vendor/github.com/pelletier/go-toml/v2/.goreleaser.yaml create mode 100644 vendor/github.com/pelletier/go-toml/v2/CONTRIBUTING.md create mode 100644 vendor/github.com/pelletier/go-toml/v2/Dockerfile create mode 100644 vendor/github.com/pelletier/go-toml/v2/LICENSE create mode 100644 vendor/github.com/pelletier/go-toml/v2/README.md create mode 100644 vendor/github.com/pelletier/go-toml/v2/SECURITY.md create mode 100644 vendor/github.com/pelletier/go-toml/v2/ci.sh create mode 100644 vendor/github.com/pelletier/go-toml/v2/decode.go create mode 100644 vendor/github.com/pelletier/go-toml/v2/doc.go create mode 100644 vendor/github.com/pelletier/go-toml/v2/errors.go create mode 100644 vendor/github.com/pelletier/go-toml/v2/internal/characters/ascii.go create mode 100644 vendor/github.com/pelletier/go-toml/v2/internal/characters/utf8.go create mode 100644 vendor/github.com/pelletier/go-toml/v2/internal/danger/danger.go create mode 100644 vendor/github.com/pelletier/go-toml/v2/internal/danger/typeid.go create mode 100644 vendor/github.com/pelletier/go-toml/v2/internal/tracker/key.go create mode 100644 vendor/github.com/pelletier/go-toml/v2/internal/tracker/seen.go create mode 100644 vendor/github.com/pelletier/go-toml/v2/internal/tracker/tracker.go create mode 100644 vendor/github.com/pelletier/go-toml/v2/localtime.go create mode 100644 vendor/github.com/pelletier/go-toml/v2/marshaler.go create mode 100644 vendor/github.com/pelletier/go-toml/v2/strict.go create mode 100644 vendor/github.com/pelletier/go-toml/v2/toml.abnf create mode 100644 vendor/github.com/pelletier/go-toml/v2/types.go create mode 100644 vendor/github.com/pelletier/go-toml/v2/unmarshaler.go create mode 100644 vendor/github.com/pelletier/go-toml/v2/unstable/ast.go create mode 100644 vendor/github.com/pelletier/go-toml/v2/unstable/builder.go create mode 100644 vendor/github.com/pelletier/go-toml/v2/unstable/doc.go create mode 100644 vendor/github.com/pelletier/go-toml/v2/unstable/kind.go create mode 100644 vendor/github.com/pelletier/go-toml/v2/unstable/parser.go create mode 100644 vendor/github.com/pelletier/go-toml/v2/unstable/scanner.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/LICENSE create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/asm/arch/arch.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/asm/arch/arm.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/asm/arch/arm64.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/asm/arch/mips.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/asm/arch/ppc64.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/asm/arch/riscv64.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/asm/arch/s390x.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/bio/buf.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/bio/buf_mmap.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/bio/buf_nommap.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/bio/must.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/dwarf/dwarf.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/dwarf/dwarf_defs.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/goobj/builtin.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/goobj/builtinlist.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/goobj/funcinfo.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/goobj/objfile.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/abi_string.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/addrtype_string.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/arm/a.out.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/arm/anames.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/arm/anames5.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/arm/asm5.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/arm/list5.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/arm/obj5.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/arm64/a.out.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/arm64/anames.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/arm64/anames7.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/arm64/asm7.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/arm64/doc.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/arm64/list7.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/arm64/obj7.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/arm64/sysRegEnc.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/data.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/dwarf.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/go.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/inl.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/ld.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/line.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/link.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/mips/a.out.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/mips/anames.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/mips/anames0.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/mips/asm0.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/mips/list0.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/mips/obj0.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/objfile.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/pass.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/pcln.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/plist.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/ppc64/a.out.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/ppc64/anames.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/ppc64/anames9.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/ppc64/asm9.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/ppc64/doc.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/ppc64/list9.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/ppc64/obj9.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/riscv/anames.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/riscv/cpu.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/riscv/inst.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/riscv/list.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/riscv/obj.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/s390x/a.out.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/s390x/anames.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/s390x/anamesz.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/s390x/asmz.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/s390x/condition_code.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/s390x/listz.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/s390x/objz.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/s390x/rotate.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/s390x/vector.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/sym.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/textflag.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/util.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/wasm/a.out.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/wasm/anames.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/wasm/wasmobj.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/x86/a.out.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/x86/aenum.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/x86/anames.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/x86/asm6.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/x86/avx_optabs.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/x86/evex.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/x86/list6.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/x86/obj6.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/obj/x86/ytab.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/objabi/autotype.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/objabi/flag.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/objabi/funcdata.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/objabi/funcid.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/objabi/head.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/objabi/line.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/objabi/path.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/objabi/reloctype.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/objabi/reloctype_string.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/objabi/stack.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/objabi/symkind.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/objabi/symkind_string.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/objabi/typekind.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/objabi/util.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/src/pos.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/src/xpos.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/sys/arch.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/sys/supported.go create mode 100644 vendor/github.com/twitchyliquid64/golang-asm/unsafeheader/unsafeheader.go create mode 100644 vendor/github.com/ugorji/go/codec/0_importpath.go create mode 100644 vendor/github.com/ugorji/go/codec/LICENSE create mode 100644 vendor/github.com/ugorji/go/codec/README.md create mode 100644 vendor/github.com/ugorji/go/codec/binc.go create mode 100644 vendor/github.com/ugorji/go/codec/build.sh create mode 100644 vendor/github.com/ugorji/go/codec/cbor.go create mode 100644 vendor/github.com/ugorji/go/codec/codecgen.go create mode 100644 vendor/github.com/ugorji/go/codec/decimal.go create mode 100644 vendor/github.com/ugorji/go/codec/decode.go create mode 100644 vendor/github.com/ugorji/go/codec/doc.go create mode 100644 vendor/github.com/ugorji/go/codec/encode.go create mode 100644 vendor/github.com/ugorji/go/codec/fast-path.generated.go create mode 100644 vendor/github.com/ugorji/go/codec/fast-path.go.tmpl create mode 100644 vendor/github.com/ugorji/go/codec/fast-path.not.go create mode 100644 vendor/github.com/ugorji/go/codec/gen-dec-array.go.tmpl create mode 100644 vendor/github.com/ugorji/go/codec/gen-dec-map.go.tmpl create mode 100644 vendor/github.com/ugorji/go/codec/gen-enc-chan.go.tmpl create mode 100644 vendor/github.com/ugorji/go/codec/gen-helper.generated.go create mode 100644 vendor/github.com/ugorji/go/codec/gen-helper.go.tmpl create mode 100644 vendor/github.com/ugorji/go/codec/gen.generated.go create mode 100644 vendor/github.com/ugorji/go/codec/gen.go create mode 100644 vendor/github.com/ugorji/go/codec/goversion_arrayof_gte_go15.go create mode 100644 vendor/github.com/ugorji/go/codec/goversion_arrayof_lt_go15.go create mode 100644 vendor/github.com/ugorji/go/codec/goversion_fmt_time_gte_go15.go create mode 100644 vendor/github.com/ugorji/go/codec/goversion_fmt_time_lt_go15.go create mode 100644 vendor/github.com/ugorji/go/codec/goversion_growslice_unsafe_gte_go120.go create mode 100644 vendor/github.com/ugorji/go/codec/goversion_growslice_unsafe_lt_go120.go create mode 100644 vendor/github.com/ugorji/go/codec/goversion_makemap_lt_go110.go create mode 100644 vendor/github.com/ugorji/go/codec/goversion_makemap_not_unsafe_gte_go110.go create mode 100644 vendor/github.com/ugorji/go/codec/goversion_makemap_unsafe_gte_go110.go create mode 100644 vendor/github.com/ugorji/go/codec/goversion_maprange_gte_go112.go create mode 100644 vendor/github.com/ugorji/go/codec/goversion_maprange_lt_go112.go create mode 100644 vendor/github.com/ugorji/go/codec/goversion_unexportedembeddedptr_gte_go110.go create mode 100644 vendor/github.com/ugorji/go/codec/goversion_unexportedembeddedptr_lt_go110.go create mode 100644 vendor/github.com/ugorji/go/codec/goversion_unsupported_lt_go14.go create mode 100644 vendor/github.com/ugorji/go/codec/goversion_vendor_eq_go15.go create mode 100644 vendor/github.com/ugorji/go/codec/goversion_vendor_eq_go16.go create mode 100644 vendor/github.com/ugorji/go/codec/goversion_vendor_gte_go17.go create mode 100644 vendor/github.com/ugorji/go/codec/goversion_vendor_lt_go15.go create mode 100644 vendor/github.com/ugorji/go/codec/helper.go create mode 100644 vendor/github.com/ugorji/go/codec/helper.s create mode 100644 vendor/github.com/ugorji/go/codec/helper_internal.go create mode 100644 vendor/github.com/ugorji/go/codec/helper_not_unsafe.go create mode 100644 vendor/github.com/ugorji/go/codec/helper_not_unsafe_not_gc.go create mode 100644 vendor/github.com/ugorji/go/codec/helper_unsafe.go create mode 100644 vendor/github.com/ugorji/go/codec/helper_unsafe_compiler_gc.go create mode 100644 vendor/github.com/ugorji/go/codec/helper_unsafe_compiler_not_gc.go create mode 100644 vendor/github.com/ugorji/go/codec/json.go create mode 100644 vendor/github.com/ugorji/go/codec/mammoth-test.go.tmpl create mode 100644 vendor/github.com/ugorji/go/codec/mammoth2-test.go.tmpl create mode 100644 vendor/github.com/ugorji/go/codec/msgpack.go create mode 100644 vendor/github.com/ugorji/go/codec/reader.go create mode 100644 vendor/github.com/ugorji/go/codec/register_ext.go create mode 100644 vendor/github.com/ugorji/go/codec/rpc.go create mode 100644 vendor/github.com/ugorji/go/codec/simple.go create mode 100644 vendor/github.com/ugorji/go/codec/sort-slice.generated.go create mode 100644 vendor/github.com/ugorji/go/codec/sort-slice.go.tmpl create mode 100644 vendor/github.com/ugorji/go/codec/test-cbor-goldens.json create mode 100644 vendor/github.com/ugorji/go/codec/test.py create mode 100644 vendor/github.com/ugorji/go/codec/writer.go create mode 100644 vendor/golang.org/x/arch/AUTHORS create mode 100644 vendor/golang.org/x/arch/CONTRIBUTORS create mode 100644 vendor/golang.org/x/arch/LICENSE create mode 100644 vendor/golang.org/x/arch/PATENTS create mode 100644 vendor/golang.org/x/arch/x86/x86asm/Makefile create mode 100644 vendor/golang.org/x/arch/x86/x86asm/decode.go create mode 100644 vendor/golang.org/x/arch/x86/x86asm/gnu.go create mode 100644 vendor/golang.org/x/arch/x86/x86asm/inst.go create mode 100644 vendor/golang.org/x/arch/x86/x86asm/intel.go create mode 100644 vendor/golang.org/x/arch/x86/x86asm/plan9x.go create mode 100644 vendor/golang.org/x/arch/x86/x86asm/tables.go create mode 100644 vendor/golang.org/x/crypto/LICENSE create mode 100644 vendor/golang.org/x/crypto/PATENTS create mode 100644 vendor/golang.org/x/crypto/sha3/doc.go create mode 100644 vendor/golang.org/x/crypto/sha3/hashes.go create mode 100644 vendor/golang.org/x/crypto/sha3/hashes_generic.go create mode 100644 vendor/golang.org/x/crypto/sha3/keccakf.go create mode 100644 vendor/golang.org/x/crypto/sha3/keccakf_amd64.go create mode 100644 vendor/golang.org/x/crypto/sha3/keccakf_amd64.s create mode 100644 vendor/golang.org/x/crypto/sha3/register.go create mode 100644 vendor/golang.org/x/crypto/sha3/sha3.go create mode 100644 vendor/golang.org/x/crypto/sha3/sha3_s390x.go create mode 100644 vendor/golang.org/x/crypto/sha3/sha3_s390x.s create mode 100644 vendor/golang.org/x/crypto/sha3/shake.go create mode 100644 vendor/golang.org/x/crypto/sha3/shake_generic.go create mode 100644 vendor/golang.org/x/crypto/sha3/xor.go create mode 100644 vendor/golang.org/x/crypto/sha3/xor_generic.go create mode 100644 vendor/golang.org/x/crypto/sha3/xor_unaligned.go create mode 100644 vendor/golang.org/x/net/LICENSE create mode 100644 vendor/golang.org/x/net/PATENTS create mode 100644 vendor/golang.org/x/net/http/httpguts/guts.go create mode 100644 vendor/golang.org/x/net/http/httpguts/httplex.go create mode 100644 vendor/golang.org/x/net/http2/.gitignore create mode 100644 vendor/golang.org/x/net/http2/ascii.go create mode 100644 vendor/golang.org/x/net/http2/ciphers.go create mode 100644 vendor/golang.org/x/net/http2/client_conn_pool.go create mode 100644 vendor/golang.org/x/net/http2/databuffer.go create mode 100644 vendor/golang.org/x/net/http2/errors.go create mode 100644 vendor/golang.org/x/net/http2/flow.go create mode 100644 vendor/golang.org/x/net/http2/frame.go create mode 100644 vendor/golang.org/x/net/http2/go111.go create mode 100644 vendor/golang.org/x/net/http2/go115.go create mode 100644 vendor/golang.org/x/net/http2/go118.go create mode 100644 vendor/golang.org/x/net/http2/gotrack.go create mode 100644 vendor/golang.org/x/net/http2/h2c/h2c.go create mode 100644 vendor/golang.org/x/net/http2/headermap.go create mode 100644 vendor/golang.org/x/net/http2/hpack/encode.go create mode 100644 vendor/golang.org/x/net/http2/hpack/hpack.go create mode 100644 vendor/golang.org/x/net/http2/hpack/huffman.go create mode 100644 vendor/golang.org/x/net/http2/hpack/static_table.go create mode 100644 vendor/golang.org/x/net/http2/hpack/tables.go create mode 100644 vendor/golang.org/x/net/http2/http2.go create mode 100644 vendor/golang.org/x/net/http2/not_go111.go create mode 100644 vendor/golang.org/x/net/http2/not_go115.go create mode 100644 vendor/golang.org/x/net/http2/not_go118.go create mode 100644 vendor/golang.org/x/net/http2/pipe.go create mode 100644 vendor/golang.org/x/net/http2/server.go create mode 100644 vendor/golang.org/x/net/http2/transport.go create mode 100644 vendor/golang.org/x/net/http2/write.go create mode 100644 vendor/golang.org/x/net/http2/writesched.go create mode 100644 vendor/golang.org/x/net/http2/writesched_priority.go create mode 100644 vendor/golang.org/x/net/http2/writesched_random.go create mode 100644 vendor/golang.org/x/net/http2/writesched_roundrobin.go create mode 100644 vendor/golang.org/x/net/idna/go118.go create mode 100644 vendor/golang.org/x/net/idna/idna10.0.0.go create mode 100644 vendor/golang.org/x/net/idna/idna9.0.0.go create mode 100644 vendor/golang.org/x/net/idna/pre_go118.go create mode 100644 vendor/golang.org/x/net/idna/punycode.go create mode 100644 vendor/golang.org/x/net/idna/tables10.0.0.go create mode 100644 vendor/golang.org/x/net/idna/tables11.0.0.go create mode 100644 vendor/golang.org/x/net/idna/tables12.0.0.go create mode 100644 vendor/golang.org/x/net/idna/tables13.0.0.go create mode 100644 vendor/golang.org/x/net/idna/tables15.0.0.go create mode 100644 vendor/golang.org/x/net/idna/tables9.0.0.go create mode 100644 vendor/golang.org/x/net/idna/trie.go create mode 100644 vendor/golang.org/x/net/idna/trie12.0.0.go create mode 100644 vendor/golang.org/x/net/idna/trie13.0.0.go create mode 100644 vendor/golang.org/x/net/idna/trieval.go create mode 100644 vendor/golang.org/x/sys/LICENSE create mode 100644 vendor/golang.org/x/sys/PATENTS create mode 100644 vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s create mode 100644 vendor/golang.org/x/sys/cpu/byteorder.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_aix.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_arm.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_arm64.s create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gc_x86.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c create mode 100644 vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_arm.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_loong64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_mips64x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_mipsx.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_netbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.s create mode 100644 vendor/golang.org/x/sys/cpu/cpu_other_arm.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_other_arm64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_other_mips64x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_other_ppc64x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_other_riscv64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_ppc64x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_riscv64.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_s390x.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_s390x.s create mode 100644 vendor/golang.org/x/sys/cpu/cpu_wasm.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_x86.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_x86.s create mode 100644 vendor/golang.org/x/sys/cpu/cpu_zos.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/cpu/endian_big.go create mode 100644 vendor/golang.org/x/sys/cpu/endian_little.go create mode 100644 vendor/golang.org/x/sys/cpu/hwcap_linux.go create mode 100644 vendor/golang.org/x/sys/cpu/parse.go create mode 100644 vendor/golang.org/x/sys/cpu/proc_cpuinfo_linux.go create mode 100644 vendor/golang.org/x/sys/cpu/runtime_auxv.go create mode 100644 vendor/golang.org/x/sys/cpu/runtime_auxv_go121.go create mode 100644 vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go create mode 100644 vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go create mode 100644 vendor/golang.org/x/sys/unix/.gitignore create mode 100644 vendor/golang.org/x/sys/unix/README.md create mode 100644 vendor/golang.org/x/sys/unix/affinity_linux.go create mode 100644 vendor/golang.org/x/sys/unix/aliases.go create mode 100644 vendor/golang.org/x/sys/unix/asm_aix_ppc64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_386.s create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_arm.s create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_arm64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_ppc64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_bsd_riscv64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_386.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_arm.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_arm64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_loong64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_mips64x.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_mipsx.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_riscv64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_linux_s390x.s create mode 100644 vendor/golang.org/x/sys/unix/asm_openbsd_mips64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_solaris_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/asm_zos_s390x.s create mode 100644 vendor/golang.org/x/sys/unix/bluetooth_linux.go create mode 100644 vendor/golang.org/x/sys/unix/cap_freebsd.go create mode 100644 vendor/golang.org/x/sys/unix/constants.go create mode 100644 vendor/golang.org/x/sys/unix/dev_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/dev_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/dev_darwin.go create mode 100644 vendor/golang.org/x/sys/unix/dev_dragonfly.go create mode 100644 vendor/golang.org/x/sys/unix/dev_freebsd.go create mode 100644 vendor/golang.org/x/sys/unix/dev_linux.go create mode 100644 vendor/golang.org/x/sys/unix/dev_netbsd.go create mode 100644 vendor/golang.org/x/sys/unix/dev_openbsd.go create mode 100644 vendor/golang.org/x/sys/unix/dev_zos.go create mode 100644 vendor/golang.org/x/sys/unix/dirent.go create mode 100644 vendor/golang.org/x/sys/unix/endian_big.go create mode 100644 vendor/golang.org/x/sys/unix/endian_little.go create mode 100644 vendor/golang.org/x/sys/unix/env_unix.go create mode 100644 vendor/golang.org/x/sys/unix/epoll_zos.go create mode 100644 vendor/golang.org/x/sys/unix/fcntl.go create mode 100644 vendor/golang.org/x/sys/unix/fcntl_darwin.go create mode 100644 vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go create mode 100644 vendor/golang.org/x/sys/unix/fdset.go create mode 100644 vendor/golang.org/x/sys/unix/fstatfs_zos.go create mode 100644 vendor/golang.org/x/sys/unix/gccgo.go create mode 100644 vendor/golang.org/x/sys/unix/gccgo_c.c create mode 100644 vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ifreq_linux.go create mode 100644 vendor/golang.org/x/sys/unix/ioctl_linux.go create mode 100644 vendor/golang.org/x/sys/unix/ioctl_signed.go create mode 100644 vendor/golang.org/x/sys/unix/ioctl_unsigned.go create mode 100644 vendor/golang.org/x/sys/unix/ioctl_zos.go create mode 100644 vendor/golang.org/x/sys/unix/mkall.sh create mode 100644 vendor/golang.org/x/sys/unix/mkerrors.sh create mode 100644 vendor/golang.org/x/sys/unix/mmap_nomremap.go create mode 100644 vendor/golang.org/x/sys/unix/mremap.go create mode 100644 vendor/golang.org/x/sys/unix/pagesize_unix.go create mode 100644 vendor/golang.org/x/sys/unix/pledge_openbsd.go create mode 100644 vendor/golang.org/x/sys/unix/ptrace_darwin.go create mode 100644 vendor/golang.org/x/sys/unix/ptrace_ios.go create mode 100644 vendor/golang.org/x/sys/unix/race.go create mode 100644 vendor/golang.org/x/sys/unix/race0.go create mode 100644 vendor/golang.org/x/sys/unix/readdirent_getdents.go create mode 100644 vendor/golang.org/x/sys/unix/readdirent_getdirentries.go create mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_dragonfly.go create mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_linux.go create mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_unix.go create mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_unix_other.go create mode 100644 vendor/golang.org/x/sys/unix/syscall.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_aix.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_bsd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_dragonfly.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_hurd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_hurd_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_illumos.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_alarm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gc_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_loong64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_libc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_solaris.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_unix.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_unix_gc.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/sysvshm_linux.go create mode 100644 vendor/golang.org/x/sys/unix/sysvshm_unix.go create mode 100644 vendor/golang.org/x/sys/unix/sysvshm_unix_other.go create mode 100644 vendor/golang.org/x/sys/unix/timestruct.go create mode 100644 vendor/golang.org/x/sys/unix/unveil_openbsd.go create mode 100644 vendor/golang.org/x/sys/unix/xattr_bsd.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zerrors_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zptrace_armnn_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zptrace_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zptrace_mipsnn_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zptrace_mipsnnle_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zptrace_x86_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/zsysnum_zos_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_386.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_arm.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_ppc64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go create mode 100644 vendor/golang.org/x/sys/unix/ztypes_zos_s390x.go create mode 100644 vendor/golang.org/x/text/LICENSE create mode 100644 vendor/golang.org/x/text/PATENTS create mode 100644 vendor/golang.org/x/text/internal/language/common.go create mode 100644 vendor/golang.org/x/text/internal/language/compact.go create mode 100644 vendor/golang.org/x/text/internal/language/compact/compact.go create mode 100644 vendor/golang.org/x/text/internal/language/compact/language.go create mode 100644 vendor/golang.org/x/text/internal/language/compact/parents.go create mode 100644 vendor/golang.org/x/text/internal/language/compact/tables.go create mode 100644 vendor/golang.org/x/text/internal/language/compact/tags.go create mode 100644 vendor/golang.org/x/text/internal/language/compose.go create mode 100644 vendor/golang.org/x/text/internal/language/coverage.go create mode 100644 vendor/golang.org/x/text/internal/language/language.go create mode 100644 vendor/golang.org/x/text/internal/language/lookup.go create mode 100644 vendor/golang.org/x/text/internal/language/match.go create mode 100644 vendor/golang.org/x/text/internal/language/parse.go create mode 100644 vendor/golang.org/x/text/internal/language/tables.go create mode 100644 vendor/golang.org/x/text/internal/language/tags.go create mode 100644 vendor/golang.org/x/text/internal/tag/tag.go create mode 100644 vendor/golang.org/x/text/language/coverage.go create mode 100644 vendor/golang.org/x/text/language/doc.go create mode 100644 vendor/golang.org/x/text/language/language.go create mode 100644 vendor/golang.org/x/text/language/match.go create mode 100644 vendor/golang.org/x/text/language/parse.go create mode 100644 vendor/golang.org/x/text/language/tables.go create mode 100644 vendor/golang.org/x/text/language/tags.go create mode 100644 vendor/golang.org/x/text/secure/bidirule/bidirule.go create mode 100644 vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go create mode 100644 vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go create mode 100644 vendor/golang.org/x/text/transform/transform.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/bidi.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/bracket.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/core.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/prop.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables12.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/trieval.go create mode 100644 vendor/golang.org/x/text/unicode/norm/composition.go create mode 100644 vendor/golang.org/x/text/unicode/norm/forminfo.go create mode 100644 vendor/golang.org/x/text/unicode/norm/input.go create mode 100644 vendor/golang.org/x/text/unicode/norm/iter.go create mode 100644 vendor/golang.org/x/text/unicode/norm/normalize.go create mode 100644 vendor/golang.org/x/text/unicode/norm/readwriter.go create mode 100644 vendor/golang.org/x/text/unicode/norm/tables10.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/norm/tables11.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/norm/tables12.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/norm/tables13.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/norm/tables15.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/norm/tables9.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/norm/transform.go create mode 100644 vendor/golang.org/x/text/unicode/norm/trie.go create mode 100644 vendor/google.golang.org/protobuf/LICENSE create mode 100644 vendor/google.golang.org/protobuf/PATENTS create mode 100644 vendor/google.golang.org/protobuf/encoding/protowire/wire.go create mode 100644 vendor/google.golang.org/protobuf/internal/detrand/rand.go create mode 100644 vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go create mode 100644 vendor/google.golang.org/protobuf/internal/errors/errors.go create mode 100644 vendor/google.golang.org/protobuf/internal/errors/is_go112.go create mode 100644 vendor/google.golang.org/protobuf/internal/errors/is_go113.go create mode 100644 vendor/google.golang.org/protobuf/internal/flags/flags.go create mode 100644 vendor/google.golang.org/protobuf/internal/flags/proto_legacy_disable.go create mode 100644 vendor/google.golang.org/protobuf/internal/flags/proto_legacy_enable.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/any_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/api_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/doc.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/duration_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/empty_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/field_mask_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/goname.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/map_entry.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/source_context_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/struct_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/timestamp_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/type_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/wrappers.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/wrappers_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/order/order.go create mode 100644 vendor/google.golang.org/protobuf/internal/order/range.go create mode 100644 vendor/google.golang.org/protobuf/internal/pragma/pragma.go create mode 100644 vendor/google.golang.org/protobuf/internal/strs/strings.go create mode 100644 vendor/google.golang.org/protobuf/internal/strs/strings_pure.go create mode 100644 vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go create mode 100644 vendor/google.golang.org/protobuf/proto/checkinit.go create mode 100644 vendor/google.golang.org/protobuf/proto/decode.go create mode 100644 vendor/google.golang.org/protobuf/proto/decode_gen.go create mode 100644 vendor/google.golang.org/protobuf/proto/doc.go create mode 100644 vendor/google.golang.org/protobuf/proto/encode.go create mode 100644 vendor/google.golang.org/protobuf/proto/encode_gen.go create mode 100644 vendor/google.golang.org/protobuf/proto/equal.go create mode 100644 vendor/google.golang.org/protobuf/proto/extension.go create mode 100644 vendor/google.golang.org/protobuf/proto/merge.go create mode 100644 vendor/google.golang.org/protobuf/proto/messageset.go create mode 100644 vendor/google.golang.org/protobuf/proto/proto.go create mode 100644 vendor/google.golang.org/protobuf/proto/proto_methods.go create mode 100644 vendor/google.golang.org/protobuf/proto/proto_reflect.go create mode 100644 vendor/google.golang.org/protobuf/proto/reset.go create mode 100644 vendor/google.golang.org/protobuf/proto/size.go create mode 100644 vendor/google.golang.org/protobuf/proto/size_gen.go create mode 100644 vendor/google.golang.org/protobuf/proto/wrappers.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/methods.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/source.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/type.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value_pure.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe.go create mode 100644 vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go create mode 100644 vendor/google.golang.org/protobuf/runtime/protoiface/legacy.go create mode 100644 vendor/google.golang.org/protobuf/runtime/protoiface/methods.go create mode 100644 vendor/gopkg.in/yaml.v3/LICENSE create mode 100644 vendor/gopkg.in/yaml.v3/NOTICE create mode 100644 vendor/gopkg.in/yaml.v3/README.md create mode 100644 vendor/gopkg.in/yaml.v3/apic.go create mode 100644 vendor/gopkg.in/yaml.v3/decode.go create mode 100644 vendor/gopkg.in/yaml.v3/emitterc.go create mode 100644 vendor/gopkg.in/yaml.v3/encode.go create mode 100644 vendor/gopkg.in/yaml.v3/parserc.go create mode 100644 vendor/gopkg.in/yaml.v3/readerc.go create mode 100644 vendor/gopkg.in/yaml.v3/resolve.go create mode 100644 vendor/gopkg.in/yaml.v3/scannerc.go create mode 100644 vendor/gopkg.in/yaml.v3/sorter.go create mode 100644 vendor/gopkg.in/yaml.v3/writerc.go create mode 100644 vendor/gopkg.in/yaml.v3/yaml.go create mode 100644 vendor/gopkg.in/yaml.v3/yamlh.go create mode 100644 vendor/gopkg.in/yaml.v3/yamlprivateh.go create mode 100644 vendor/modules.txt diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000000..e70b676f57c --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,14 @@ +version: 2 +updates: + - package-ecosystem: "gomod" + directory: "/" + allow: + - dependency-type: "all" + schedule: + interval: "monthly" + reviewers: + - "ipfaze" + groups: + dependencies: + patterns: + - "*" diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 3c3629e647f..00000000000 --- a/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000000..eeef2578336 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,8 @@ +FROM golang:1.20 + +RUN go install github.com/cespare/reflex@latest +ADD . /go/src/github.com/Scalingo/sample-go-gin +WORKDIR /go/src/github.com/Scalingo/sample-go-gin +EXPOSE 3000 +RUN go install -buildvcs=false +CMD /go/bin/sample-go-gin diff --git a/Procfile b/Procfile new file mode 100644 index 00000000000..58346e822af --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: sample-go-gin diff --git a/README.md b/README.md new file mode 100644 index 00000000000..ae26259688e --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# Sample Application with Go and Gin + +This sample is running on: https://go-gin.is-easy-on-scalingo.com/ + +## Deploy via Git + +Create an application on https://scalingo.com, then: + +```shell +scalingo --app my-app git-setup +git push scalingo master +``` + +And that's it! + +## Deploy via One-Click + +[![Deploy to Scalingo](https://cdn.scalingo.com/deploy/button.svg)](https://my.scalingo.com/deploy) + +## Running Locally + +```shell +docker-compose up +``` + +The app listens by default on the port 3000 or the one defined in the `PORT` +environment variable. diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000000..2b6989ace50 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,11 @@ +version: '2' +services: + sample-go-gin: + build: . + volumes: + - ./:/go/src/github.com/Scalingo/sample-go-gin + ports: + - 3000:3000 + environment: + PORT: 3000 + command: reflex -r '\.go$$' -s -- sh -c 'go install -buildvcs=false -race && /go/bin/sample-go-gin' diff --git a/go.mod b/go.mod new file mode 100644 index 00000000000..f72387d8a96 --- /dev/null +++ b/go.mod @@ -0,0 +1,31 @@ +module github.com/Scalingo/sample-go-gin + +go 1.20 + +require github.com/gin-gonic/gin v1.9.0 + +require ( + github.com/bytedance/sonic v1.8.0 // indirect + github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.11.2 // indirect + github.com/goccy/go-json v0.10.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/cpuid/v2 v2.0.9 // indirect + github.com/leodido/go-urn v1.2.1 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.9 // indirect + golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 00000000000..6579c26720d --- /dev/null +++ b/go.sum @@ -0,0 +1,81 @@ +github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= +github.com/bytedance/sonic v1.8.0 h1:ea0Xadu+sHlu7x5O3gKhRpQ1IKiMrSiHttPF0ybECuA= +github.com/bytedance/sonic v1.8.0/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= +github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.9.0 h1:OjyFBKICoexlu99ctXNR2gg+c5pKrKMuyjgARg9qeY8= +github.com/gin-gonic/gin v1.9.0/go.mod h1:W1Me9+hsUSyj3CePGrd1/QrKJMSJ1Tu/0hFEH89961k= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.11.2 h1:q3SHpufmypg+erIExEKUmsgmhDTyhcJ38oeKGACXohU= +github.com/go-playground/validator/v10 v10.11.2/go.mod h1:NieE624vt4SCTJtD87arVLvdmjPAeV8BQlHtMnw9D7s= +github.com/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA= +github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= +github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.9 h1:rmenucSohSTiyL09Y+l2OCk+FrMxGMzho2+tjr5ticU= +github.com/ugorji/go/codec v1.2.9/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/index.js b/index.js deleted file mode 100644 index c5678b1fa6d..00000000000 --- a/index.js +++ /dev/null @@ -1,15 +0,0 @@ -var express = require('express') -var app = express() -var child_process = require('child_process') - -app.get('/', function (req, res) { - const process = child_process.spawn("xclock") - process.kill('SIGKILL') - res.send('Hello World!') -}) - -var server = app.listen(process.env.PORT || 3000, function () { - var host = server.address().address - var port = server.address().port - console.log('App listening at http://%s:%s', host, port) -}) diff --git a/main.go b/main.go new file mode 100644 index 00000000000..5e0e237230b --- /dev/null +++ b/main.go @@ -0,0 +1,68 @@ +package main + +import ( + "fmt" + "log" + "net" + "net/http" + "os" + "os/signal" + "strconv" + "syscall" + "time" + + "github.com/gin-gonic/gin" +) + +func isPrime(value int) bool { + for i := 2; i <= value/2; i++ { + if value%i == 0 { + return false + } + } + return value > 1 +} + +func main() { + m := gin.Default() + m.LoadHTMLGlob("templates/*") + + m.GET("/", func(c *gin.Context) { + waitQuery := c.Request.URL.Query().Get("wait") + primeQuery := c.Request.URL.Query().Get("prime") + + if waitQuery != "" { + sleep, _ := strconv.Atoi(waitQuery) + log.Printf("Sleep for %d seconds\n", sleep) + time.Sleep(time.Duration(sleep) * time.Second) + } + if primeQuery != "" { + val, _ := strconv.Atoi(primeQuery) + log.Printf("Is %d prime: %t", val, isPrime(val)) + } + c.HTML(http.StatusOK, "index.tmpl", nil) + }) + + if os.Getenv("PANIC") == "true" { + panic("this is crashing") + } + + port := "3000" + if os.Getenv("PORT") != "" { + port = os.Getenv("PORT") + } + + listener, err := net.Listen("tcp", ":"+port) + if err != nil { + panic(err) + } + + go http.Serve(listener, m) + log.Println("Listening on 0.0.0.0:" + port) + + sigs := make(chan os.Signal) + signal.Notify(sigs, syscall.SIGTERM) + <-sigs + fmt.Println("SIGTERM, time to shutdown") + listener.Close() +} diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 918ded96d44..00000000000 --- a/package-lock.json +++ /dev/null @@ -1,1036 +0,0 @@ -{ - "name": "sample", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "sample", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "express": "^4.18.2" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - } - }, - "dependencies": { - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 3ae122ae4b1..00000000000 --- a/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "sample", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/SCedricThomas/sample.git" - }, - "author": "", - "license": "ISC", - "bugs": { - "url": "https://github.com/SCedricThomas/sample/issues" - }, - "homepage": "https://github.com/SCedricThomas/sample#readme", - "dependencies": { - "express": "^4.18.2" - } -} diff --git a/scalingo.json b/scalingo.json new file mode 100644 index 00000000000..3eae0980c8e --- /dev/null +++ b/scalingo.json @@ -0,0 +1,13 @@ +{ + "name": "Sample Go Gin", + "description": "Sample web application using the Go framework Gin", + "logo": "https://scalingo.com/logo.svg", + "repository": "https://github.com/Scalingo/sample-go-gin", + "website": "https://scalingo.com", + "formation": { + "web": { + "amount": 1, + "size": "S" + } + } +} diff --git a/screenshot.xwd b/screenshot.xwd deleted file mode 100644 index bf332b8f3ee0562d81a3a16809d1b299a818942c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29863019 zcmeF)34Byl{wR3gn|brzyqP!q@@D4szyG~&w?aZdQ9#+GX^|FMp%u4QY@`)hMWq!Q z8x>FxS&TG@1VJ_-fJvpQ`^~=Z`@Zk{zVFMMU%0uK>V&G?sw727zUTAl^5oVz_nz}T zr>Z{pa(;d8xZ{o&@3`ZRKOO)3lkvYlf5#nvZr2@m{F#>{pQS$@&itA9Z@ho!(4T+m zj=wbYpZq1>`xEi^(Emo&zvGQxJ@@*S+B4qqXYcqES&ICh%u?k4vMfdZFV9ls|5TPD z|5s!w@_#x@k^eJUiu_-hrO5x;EJgmW%2MS2>MTY6&t)m{e@&Jm|JPo-@_#-{k^kGW6#2hBOOgLOvK0Bhkfq3f zB}OOaokrN}SIQskFrDe}v* z6#4tJ6#3;@iu@0=6!{fdiu{kV6!{0T6#11|iu{9Fiu|f9MgGTGiu^-aiu~#8Z1$p0csk$)jek$*8u zk>8x9$ZyF~`M0tZ`QKzI^1HGW`M0wa`FFAu`FFDv`Q2HH{GKdD zes7i{|6Z0N|9+Mtzb{LX-=C$(e~_ifAIMVVKg?3(4`wOyhq4s;!&!>_kt{|2qbxEJglQmLmUImLh*T zOOZd5rO1DtrO2PnQsmENDe~vD6!{BTiu}baMgEH{MgCHjB7Zqck?+e=jDI z`Dw7 z|5BDB|1W1L^8ZSfBLA;uDf0hXmLmVJXDRakMwTM~Z)Pd-|5lbF|8Hk0^8ZejBLDAZ zDf0hbmLmV}XDRakL6#!_A7&}?|527A{~u>5^8ZPeBLAOeDf0hWmLmV3XDRakMV2D} zUuG%t|5cVE|6gY*^8ZbiBLClJDf0hamLmV(XDRakLzW`{KV~WN|5KJC|37Cb^8ZVg zBLBZ;Df0hYmLmVZXDRakN0uW0e`YE2|5uhG|9@vG^8ZhkBLDwpDf0hcmLmU`vJ`oV z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ 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

ZUK!5-N0t5&UAaL6X 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�%U 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

FXbnq)Wm zb>sirL9JhEv)6mP?E8ktccp}vzTKsrQM6TVN^%VAb#Ls9J$KdBBVHna00IagfB*sr zAb(RT7(%Z4H5JTkYSdZRQ_-Jn8sbu5uox9C8$QNzdW;qLyI z7MU0IvtLSLq~7e_M<-s{@OryR)~C|237t9^C7Yy>Njqg%uv`%5RHHy|-uB0==7aq8>={@$m8v4g(2j>4*&QU7cHN7UR)g5ZLK@urz zp|eu|X<3zPNA{BlFKhOWT3D>r>L%Ic{nZcjl@raZ_a9ymjy(ayuEqbVw6jR!)t1f7 z(rr@yr@Nz>e|gaUsPms%)W7hwP(J%3^;mH67Z2QsVFA{?p-}@9fEJUnYsf>ykn$bZ)4%P;Hc* zGLrT=ds8_#TrKn|U!I0lnx8%Gu6ljGRJivRn`V=t3tZ)w*TR&^E60DS&0bgc(|nYr zwf4RpM3kEN zFSS)^-$esGAFAcDhrmksTwktSKJOcnE0w=)>_+Z;o!#VLSeFBgR&6{o<-H~2#!PN(jjvbinl)|7r&H#9J7>|6EkA^faO*qd_>5EG zdv-hR#P#)bYcHoD#5?v>GWA}dBtyP%4 zQlR`PiW*DT9GLyl=ie__Y!vRd-rP`VT;Be)>m4$Z7kPH~JLkl%8uVkOA(v`jcS$bsS+fu#^?xsVLSu>U`lC}KZ3R%mS z4Vmw{*nX*&%g*kduD=qxFAxpYsAcop@bRRE5qBwH7LmvMnPC|MM_q zbHmv@|MIqm@}72Ay*^(m+E=^5k{FhYvRAc$xUu!AK_uyUAPn35=ky^i$pNLWu z|E0Dn?e%53`FuW9%jKGN{@0f?qtE+>WD$_m{JL>A&;PfBGnb_O_e){++T#`Uo5*ft z*}v?uW}JPCl9OZ`oPMIQeI*G55I_I{1Q0*~0R#|0009ILKmY**5I_I{1gecdpv{V0 zi~s@%Ab?48#NnseBar}#CN7SOAC}9 zeR)n~-%>lEz;3OCjr4qcvleP*m6nti%3j1*+O;uG{$ST)C0un~8qyEFb(=(1xh}I` z%BeRGOx>ZKowO6Iq+t&=Z+mRDoHr4_QfXn|XSUfIVsd$gzUZD|MsZmPSb2Y3@n4Db zE2p-;@Sz)w!d-FelIC6W%07=6pFwr?$Tm5L>(rn1VY9*IF9(_@XS}%cIr^rF|2B=n z|5bA8|FQ{r+7E?IE*llM1lj(*?Y)QX&^A|IdFk5w?J6Yb?2RqodguFN(KZ97I>*

*SLrzODf-Id20H@rV?_5{~g+%n_7 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�H`cGHf_YiAshsX)RGBrjGIB0D_H`tO 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

xX^Z`MGIk|BEVfg>>y?-N)t; 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

)-XYNQ)ONg4tcfG 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 + + + Greetings from a sample Go app built with the Gin framework! + + + + + + + + + + + + +

+
+
+

+ Scalingo is the best Platform as a Service on the market: + no server to install, no dependencies to install, just push your code! +

+
+
+ + diff --git a/vendor/github.com/bytedance/sonic/.gitignore b/vendor/github.com/bytedance/sonic/.gitignore new file mode 100644 index 00000000000..0d8844705b1 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/.gitignore @@ -0,0 +1,52 @@ +*.o +*.swp +*.swm +*.swn +*.a +*.so +_obj +_test +*.[568vq] +[568vq].out +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* +_testmain.go +*.exe +*.exe~ +*.test +*.prof +*.rar +*.zip +*.gz +*.psd +*.bmd +*.cfg +*.pptx +*.log +*nohup.out +*settings.pyc +*.sublime-project +*.sublime-workspace +.DS_Store +/.idea/ +/.vscode/ +/output/ +/vendor/ +/Gopkg.lock +/Gopkg.toml +coverage.html +coverage.out +coverage.xml +junit.xml +*.profile +*.svg +*.out +ast/test.out +ast/bench.sh + +!testdata/*.json.gz +fuzz/testdata +*__debug_bin \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/.gitmodules b/vendor/github.com/bytedance/sonic/.gitmodules new file mode 100644 index 00000000000..b8d11c9215a --- /dev/null +++ b/vendor/github.com/bytedance/sonic/.gitmodules @@ -0,0 +1,3 @@ +[submodule "tools/asm2asm"] + path = tools/asm2asm + url = https://github.com/chenzhuoyu/asm2asm diff --git a/vendor/github.com/bytedance/sonic/.licenserc.yaml b/vendor/github.com/bytedance/sonic/.licenserc.yaml new file mode 100644 index 00000000000..1cb993e3985 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/.licenserc.yaml @@ -0,0 +1,24 @@ +header: + license: + spdx-id: Apache-2.0 + copyright-owner: ByteDance Inc. + + paths: + - '**/*.go' + - '**/*.s' + + paths-ignore: + - 'ast/asm.s' # empty file + - 'decoder/asm.s' # empty file + - 'encoder/asm.s' # empty file + - 'internal/caching/asm.s' # empty file + - 'internal/jit/asm.s' # empty file + - 'internal/native/avx/native_amd64.s' # auto-generated by asm2asm + - 'internal/native/avx/native_subr_amd64.go' # auto-generated by asm2asm + - 'internal/native/avx2/native_amd64.s' # auto-generated by asm2asm + - 'internal/native/avx2/native_subr_amd64.go' # auto-generated by asm2asm + - 'internal/resolver/asm.s' # empty file + - 'internal/rt/asm.s' # empty file + - 'internal/loader/asm.s' # empty file + + comment: on-failure \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/CODE_OF_CONDUCT.md b/vendor/github.com/bytedance/sonic/CODE_OF_CONDUCT.md new file mode 100644 index 00000000000..8505feb1c8e --- /dev/null +++ b/vendor/github.com/bytedance/sonic/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +wudi.daniel@bytedance.com. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/vendor/github.com/bytedance/sonic/CONTRIBUTING.md b/vendor/github.com/bytedance/sonic/CONTRIBUTING.md new file mode 100644 index 00000000000..7f63c661a85 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/CONTRIBUTING.md @@ -0,0 +1,63 @@ +# How to Contribute + +## Your First Pull Request +We use GitHub for our codebase. You can start by reading [How To Pull Request](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests). + +## Without Semantic Versioning +We keep the stable code in branch `main` like `golang.org/x`. Development base on branch `develop`. We promise the **Forward Compatibility** by adding new package directory with suffix `v2/v3` when code has break changes. + +## Branch Organization +We use [git-flow](https://nvie.com/posts/a-successful-git-branching-model/) as our branch organization, as known as [FDD](https://en.wikipedia.org/wiki/Feature-driven_development) + + +## Bugs +### 1. How to Find Known Issues +We are using [Github Issues](https://github.com/bytedance/sonic/issues) for our public bugs. We keep a close eye on this and try to make it clear when we have an internal fix in progress. Before filing a new task, try to make sure your problem doesn’t already exist. + +### 2. Reporting New Issues +Providing a reduced test code is a recommended way for reporting issues. Then can be placed in: +- Just in issues +- [Golang Playground](https://play.golang.org/) + +### 3. Security Bugs +Please do not report the safe disclosure of bugs to public issues. Contact us by [Support Email](mailto:sonic@bytedance.com) + +## How to Get in Touch +- [Email](mailto:wudi.daniel@bytedance.com) + +## Submit a Pull Request +Before you submit your Pull Request (PR) consider the following guidelines: +1. Search [GitHub](https://github.com/bytedance/sonic/pulls) for an open or closed PR that relates to your submission. You don't want to duplicate existing efforts. +2. Be sure that an issue describes the problem you're fixing, or documents the design for the feature you'd like to add. Discussing the design upfront helps to ensure that we're ready to accept your work. +3. [Fork](https://docs.github.com/en/github/getting-started-with-github/fork-a-repo) the bytedance/sonic repo. +4. In your forked repository, make your changes in a new git branch: + ``` + git checkout -b bugfix/security_bug develop + ``` +5. Create your patch, including appropriate test cases. +6. Follow our [Style Guides](#code-style-guides). +7. Commit your changes using a descriptive commit message that follows [AngularJS Git Commit Message Conventions](https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit). + Adherence to these conventions is necessary because release notes will be automatically generated from these messages. +8. Push your branch to GitHub: + ``` + git push origin bugfix/security_bug + ``` +9. In GitHub, send a pull request to `sonic:main` + +Note: you must use one of `optimize/feature/bugfix/doc/ci/test/refactor` following a slash(`/`) as the branch prefix. + +Your pr title and commit message should follow https://www.conventionalcommits.org/. + +## Contribution Prerequisites +- Our development environment keeps up with [Go Official](https://golang.org/project/). +- You need fully checking with lint tools before submit your pull request. [gofmt](https://golang.org/pkg/cmd/gofmt/) & [golangci-lint](https://github.com/golangci/golangci-lint) +- You are familiar with [Github](https://github.com) +- Maybe you need familiar with [Actions](https://github.com/features/actions)(our default workflow tool). + +## Code Style Guides +See [Go Code Review Comments](https://github.com/golang/go/wiki/CodeReviewComments). + +Good resources: +- [Effective Go](https://golang.org/doc/effective_go) +- [Pingcap General advice](https://pingcap.github.io/style-guide/general.html) +- [Uber Go Style Guide](https://github.com/uber-go/guide/blob/master/style.md) diff --git a/vendor/github.com/bytedance/sonic/CREDITS b/vendor/github.com/bytedance/sonic/CREDITS new file mode 100644 index 00000000000..e69de29bb2d diff --git a/vendor/github.com/bytedance/sonic/INTRODUCTION.md b/vendor/github.com/bytedance/sonic/INTRODUCTION.md new file mode 100644 index 00000000000..6b42118a787 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/INTRODUCTION.md @@ -0,0 +1,48 @@ +# Introduction to Sonic +## Background +According to the overall profiling of production services in Bytedance, we found that the overhead of JSON serialization and deserialization is unexpectedly high: the total is near to 10% CPU, and the extreme one accounts for more than 40% CPU. Therefore, **the performance of JSON lib is a key issue for the promotion of machine utilization**. + +## Research +We conducted a series of surveys and benchmarks on open-sourced JSON libraries for Golang, but the result is disappointing: **no silver bullet**. First of all, no one can perform at least the top three across various business scenarios. Even the most widely used [json-iterator](https://github.com/json-iterator/go) will severely degrade in generic (no-schema) or big-volume JSON serialization and deserialization. Secondly, compared with other JSON libraries writing in other languages, their speed is generally much slower. For example, [Simdjson-go](https://github.com/minio/simdjson-go) has a 50% reduction in decoding performance compared to [simdjson](https://github.com/simdjson/simdjson). What's more, we barely found JSON libraries which provide API to modify the underlying values. + +Therefore, we decided to **develop a brand-new JSON library with high performance as well as wide applicability**. + +## Thinking +Before starting our design, we need to figure out some questions: + +### Why is Json-iterator faster than Standard Library? +First of all, the **schema-based processing mechanism** used by the standard library is commendable, in which the parser can obtain meta information in advance when scanning, thereby shortening the time of branch selection. However, its original implementation did not make good use of this mechanism, instead, **it spent a lot of time reflecting to obtain meta info of schema**. Meanwhile, The approach of json-iterator is: Interprete structure as field-by-field encoding and decoding functions, and then assembled and cached them, minimizing the performance loss cost by reflection. But does it work once and for all? No. In practical tests, we found that **the deeper and larger the input JSON got, the smaller the gap between json-iterator and other libraries gradually became** - eventually event got surpassed: +![Scalability](introduction-1.png) + +The reason is that **this implementation transforms into a large number of interface encapsulations and function calls**, followed by function-call losses: +1. **Calling interface involves dynamic addressing of itab** +2. **Assembly functions cannot be inlined**, while Golang's function-call performance is poor (no parameter-passing-by-register) + +#### Is there a way to avoid the function-call overhead of dynamic assembly? +The first thing we thought about was code generation like [easyjson](https://github.com/mailru/easyjson). But it comes with **schema dependency and convenience losses**. To achieve a real drop-in replacement of the standard library, we turned to another technology - **[JIT](https://en.wikipedia.org/wiki/Jit) (just-in-time compiling)**. Because the compiled codec function is an integrated function, which can greatly reduce function calls while ensuring flexibility. + +### Why is Simdjson-go not fast enough? +[SIMD](https://en.wikipedia.org/wiki/SIMD) (Single-Instruction-Multi-Data) is a special set of CPU instructions for the parallel processing of vectorized data. At present, it is supported by most CPUs and widely used in image processing and big data computing. Undoubtedly, SIMD is useful in JSON processing (itoa, char-search, and so on are all suitable scenarios). We can see that simdjson-go is very competitive in large JSON scenarios (>100KB). However, for some extremely small or irregular character strings, **the extra load operation required by SIMD will lead to performance degradation**. Therefore, we need to dedicate ourselves to branch predicting and decide which scenarios should use SIMD and which should not (for example, the string length is less than 16 bytes). + +The second problem comes from the Go compiler itself. In order to ensure the compilation speed, **Golang does very little optimization work during the compilation phase** and cannot directly use compiler backends such as [LLVM](https://en.wikipedia.org/wiki/LLVM) (Low-Level Virtual Machine) for optimization. + +So, **can some crucial calculation functions be written in another language with higher execution efficiency**? +C/Clang is an ideal compilation tool (internal integration LLVM). But the key is how to embed the optimized assembly into Golang. + +### How to use Gjson well? +We also found that [gjson](https://github.com/tidwall/gjson) has a huge advantage in single-key lookup scenarios. This is because its lookup is implemented by a **lazy-load mechanism**, which subtlely skips passing-by values and effectively reduces a lot of unnecessary parsing. Practical application has proved that making good use of this feature in product can indeed bring benefits. But when it comes to multi-key lookup, Gjson does worse event than std, which is a side effect of its skipping mechanism - **searching for the same path leads to repeated parsing** (skip is also a lightweight parsing). Therefore, the accurate adaptation of practical scenarios is the key. + +## Design +Based on the above questions, our design is easy to implement: + +1. Aiming at the function-call overhead cost by the codec dynamic-assembly, **`JIT` tech is used to assemble opcodes (asm) corresponding to the schema at runtime**, which is finally cached into the off-heap memory in the form of Golang functions. +2. For practical scenarios where big data and small data coexist, we **use pre-conditional judgment** (string size, floating precision, etc.) **to combine `SIMD` with scalar instructions** to achieve the best adaptation. +3. As for insufficiency in compiling optimization of go language, we decided to **use `C/Clang` to write and compile core computational functions**, and **developed a set of [asm2asm](https://github.com/chenzhuoyu/asm2asm) tools to translate the fully optimized x86 assembly into plan9** and finally load it into Golang runtime. +4. Giving the big speed gap between parsing and skipping, the **`lazy-load` mechanism** is certainly used in our AST parser, but in **a more adaptive and efficient way to reduce the overhead of multiple-key queries**. +![design](introduction-2.png) + +In detail, we conducted some further optimization: +1. Since the native-asm functions cannot be inlined in Golang, we found that its cost even exceeded the improvement brought by the optimization of the C compiler. So we reimplemented a set of lightweight function-calls in JIT: + - `Global-function-table + static offset` for calling instruction + - **Pass parameters using registers** +2. `Sync.Map` was used to cache the codecs at first, but for our **quasi-static** (read far more than write), **fewer elements** (usually no more than a few dozen) scenarios, its performance is not optimal, so we reimplement a high-performance and concurrent-safe cache with `open-addressing-hash + RCU` tech. \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/LICENSE b/vendor/github.com/bytedance/sonic/LICENSE new file mode 100644 index 00000000000..261eeb9e9f8 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/vendor/github.com/bytedance/sonic/Makefile b/vendor/github.com/bytedance/sonic/Makefile new file mode 100644 index 00000000000..8cc0acf15cd --- /dev/null +++ b/vendor/github.com/bytedance/sonic/Makefile @@ -0,0 +1,112 @@ +# +# 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. +# + +ARCH := avx avx2 sse +TMP_DIR := output +OUT_DIR := internal/native +SRC_FILE := native/native.c + +CPU_avx := amd64 +CPU_avx2 := amd64 +CPU_sse := amd64 + +TMPL_avx := fastint_amd64_test fastfloat_amd64_test native_amd64_test native_export_amd64 +TMPL_avx2 := fastint_amd64_test fastfloat_amd64_test native_amd64_test native_export_amd64 +TMPL_sse := fastint_amd64_test fastfloat_amd64_test native_amd64_test native_export_amd64 + +CFLAGS_avx := -msse -mno-sse4 -mavx -mpclmul -mno-avx2 -DUSE_AVX=1 -DUSE_AVX2=0 +CFLAGS_avx2 := -msse -mno-sse4 -mavx -mpclmul -mavx2 -DUSE_AVX=1 -DUSE_AVX2=1 +CFLAGS_sse := -msse -mno-sse4 -mno-avx -mno-avx2 -mpclmul + +CC_amd64 := clang +ASM2ASM_amd64 := tools/asm2asm/asm2asm.py + +CFLAGS := -mno-red-zone +CFLAGS += -target x86_64-apple-macos11 +CFLAGS += -fno-asynchronous-unwind-tables +CFLAGS += -fno-builtin +CFLAGS += -fno-exceptions +CFLAGS += -fno-rtti +CFLAGS += -fno-stack-protector +CFLAGS += -nostdlib +CFLAGS += -O3 +CFLAGS += -Wall -Werror + +NATIVE_SRC := $(wildcard native/*.h) +NATIVE_SRC += $(wildcard native/*.c) + +.PHONY: all clean ${ARCH} + +define build_tmpl + $(eval @arch := $(1)) + $(eval @tmpl := $(2)) + $(eval @dest := $(3)) + +${@dest}: ${@tmpl} + mkdir -p $(dir ${@dest}) + echo '// Code generated by Makefile, DO NOT EDIT.' > ${@dest} + echo >> ${@dest} + sed -e 's/{{PACKAGE}}/${@arch}/g' ${@tmpl} >> ${@dest} +endef + +define build_arch + $(eval @cpu := $(value CPU_$(1))) + $(eval @deps := $(foreach tmpl,$(value TMPL_$(1)),${OUT_DIR}/$(1)/${tmpl}.go)) + $(eval @asmin := ${TMP_DIR}/$(1)/native.s) + $(eval @asmout := ${OUT_DIR}/$(1)/native_${@cpu}.s) + $(eval @stubin := ${OUT_DIR}/native_${@cpu}.tmpl) + $(eval @stubout := ${OUT_DIR}/$(1)/native_${@cpu}.go) + +$(1): ${@asmout} ${@deps} + +${@asmout}: ${@stubout} ${NATIVE_SRC} + mkdir -p ${TMP_DIR}/$(1) + $${CC_${@cpu}} $${CFLAGS} $${CFLAGS_$(1)} -S -o ${TMP_DIR}/$(1)/native.s ${SRC_FILE} + python3 $${ASM2ASM_${@cpu}} ${@asmout} ${TMP_DIR}/$(1)/native.s + asmfmt -w ${@asmout} + +$(eval $(call \ + build_tmpl, \ + $(1), \ + ${@stubin}, \ + ${@stubout} \ +)) + +$(foreach \ + tmpl, \ + $(value TMPL_$(1)), \ + $(eval $(call \ + build_tmpl, \ + $(1), \ + ${OUT_DIR}/${tmpl}.tmpl, \ + ${OUT_DIR}/$(1)/${tmpl}.go \ + )) \ +) +endef + +all: ${ARCH} + +clean: + for arch in ${ARCH}; do \ + rm -vfr ${TMP_DIR}/$${arch}; \ + rm -vfr ${OUT_DIR}/$${arch}; \ + done + +$(foreach \ + arch, \ + ${ARCH}, \ + $(eval $(call build_arch,${arch})) \ +) diff --git a/vendor/github.com/bytedance/sonic/README.md b/vendor/github.com/bytedance/sonic/README.md new file mode 100644 index 00000000000..9cc42c462de --- /dev/null +++ b/vendor/github.com/bytedance/sonic/README.md @@ -0,0 +1,359 @@ +# Sonic + +A blazingly fast JSON serializing & deserializing library, accelerated by JIT (just-in-time compiling) and SIMD (single-instruction-multiple-data). + +## Requirement +- Go 1.15~1.20 +- Linux/MacOS/Windows +- Amd64 ARCH + +## Features +- Runtime object binding without code generation +- Complete APIs for JSON value manipulation +- Fast, fast, fast! + +## Benchmarks +For **all sizes** of json and **all scenarios** of usage, **Sonic performs best**. +- [Medium](https://github.com/bytedance/sonic/blob/main/decoder/testdata_test.go#L19) (13KB, 300+ key, 6 layers) +```powershell +goversion: 1.17.1 +goos: darwin +goarch: amd64 +cpu: Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz +BenchmarkEncoder_Generic_Sonic-16 32393 ns/op 402.40 MB/s 11965 B/op 4 allocs/op +BenchmarkEncoder_Generic_Sonic_Fast-16 21668 ns/op 601.57 MB/s 10940 B/op 4 allocs/op +BenchmarkEncoder_Generic_JsonIter-16 42168 ns/op 309.12 MB/s 14345 B/op 115 allocs/op +BenchmarkEncoder_Generic_GoJson-16 65189 ns/op 199.96 MB/s 23261 B/op 16 allocs/op +BenchmarkEncoder_Generic_StdLib-16 106322 ns/op 122.60 MB/s 49136 B/op 789 allocs/op +BenchmarkEncoder_Binding_Sonic-16 6269 ns/op 2079.26 MB/s 14173 B/op 4 allocs/op +BenchmarkEncoder_Binding_Sonic_Fast-16 5281 ns/op 2468.16 MB/s 12322 B/op 4 allocs/op +BenchmarkEncoder_Binding_JsonIter-16 20056 ns/op 649.93 MB/s 9488 B/op 2 allocs/op +BenchmarkEncoder_Binding_GoJson-16 8311 ns/op 1568.32 MB/s 9481 B/op 1 allocs/op +BenchmarkEncoder_Binding_StdLib-16 16448 ns/op 792.52 MB/s 9479 B/op 1 allocs/op +BenchmarkEncoder_Parallel_Generic_Sonic-16 6681 ns/op 1950.93 MB/s 12738 B/op 4 allocs/op +BenchmarkEncoder_Parallel_Generic_Sonic_Fast-16 4179 ns/op 3118.99 MB/s 10757 B/op 4 allocs/op +BenchmarkEncoder_Parallel_Generic_JsonIter-16 9861 ns/op 1321.84 MB/s 14362 B/op 115 allocs/op +BenchmarkEncoder_Parallel_Generic_GoJson-16 18850 ns/op 691.52 MB/s 23278 B/op 16 allocs/op +BenchmarkEncoder_Parallel_Generic_StdLib-16 45902 ns/op 283.97 MB/s 49174 B/op 789 allocs/op +BenchmarkEncoder_Parallel_Binding_Sonic-16 1480 ns/op 8810.09 MB/s 13049 B/op 4 allocs/op +BenchmarkEncoder_Parallel_Binding_Sonic_Fast-16 1209 ns/op 10785.23 MB/s 11546 B/op 4 allocs/op +BenchmarkEncoder_Parallel_Binding_JsonIter-16 6170 ns/op 2112.58 MB/s 9504 B/op 2 allocs/op +BenchmarkEncoder_Parallel_Binding_GoJson-16 3321 ns/op 3925.52 MB/s 9496 B/op 1 allocs/op +BenchmarkEncoder_Parallel_Binding_StdLib-16 3739 ns/op 3486.49 MB/s 9480 B/op 1 allocs/op + +BenchmarkDecoder_Generic_Sonic-16 66812 ns/op 195.10 MB/s 57602 B/op 723 allocs/op +BenchmarkDecoder_Generic_Sonic_Fast-16 54523 ns/op 239.07 MB/s 49786 B/op 313 allocs/op +BenchmarkDecoder_Generic_StdLib-16 124260 ns/op 104.90 MB/s 50869 B/op 772 allocs/op +BenchmarkDecoder_Generic_JsonIter-16 91274 ns/op 142.81 MB/s 55782 B/op 1068 allocs/op +BenchmarkDecoder_Generic_GoJson-16 88569 ns/op 147.17 MB/s 66367 B/op 973 allocs/op +BenchmarkDecoder_Binding_Sonic-16 32557 ns/op 400.38 MB/s 28302 B/op 137 allocs/op +BenchmarkDecoder_Binding_Sonic_Fast-16 28649 ns/op 455.00 MB/s 24999 B/op 34 allocs/op +BenchmarkDecoder_Binding_StdLib-16 111437 ns/op 116.97 MB/s 10576 B/op 208 allocs/op +BenchmarkDecoder_Binding_JsonIter-16 35090 ns/op 371.48 MB/s 14673 B/op 385 allocs/op +BenchmarkDecoder_Binding_GoJson-16 28738 ns/op 453.59 MB/s 22039 B/op 49 allocs/op +BenchmarkDecoder_Parallel_Generic_Sonic-16 12321 ns/op 1057.91 MB/s 57233 B/op 723 allocs/op +BenchmarkDecoder_Parallel_Generic_Sonic_Fast-16 10644 ns/op 1224.64 MB/s 49362 B/op 313 allocs/op +BenchmarkDecoder_Parallel_Generic_StdLib-16 57587 ns/op 226.35 MB/s 50874 B/op 772 allocs/op +BenchmarkDecoder_Parallel_Generic_JsonIter-16 38666 ns/op 337.12 MB/s 55789 B/op 1068 allocs/op +BenchmarkDecoder_Parallel_Generic_GoJson-16 30259 ns/op 430.79 MB/s 66370 B/op 974 allocs/op +BenchmarkDecoder_Parallel_Binding_Sonic-16 5965 ns/op 2185.28 MB/s 27747 B/op 137 allocs/op +BenchmarkDecoder_Parallel_Binding_Sonic_Fast-16 5170 ns/op 2521.31 MB/s 24715 B/op 34 allocs/op +BenchmarkDecoder_Parallel_Binding_StdLib-16 27582 ns/op 472.58 MB/s 10576 B/op 208 allocs/op +BenchmarkDecoder_Parallel_Binding_JsonIter-16 13571 ns/op 960.51 MB/s 14685 B/op 385 allocs/op +BenchmarkDecoder_Parallel_Binding_GoJson-16 10031 ns/op 1299.51 MB/s 22111 B/op 49 allocs/op + +BenchmarkGetOne_Sonic-16 3276 ns/op 3975.78 MB/s 24 B/op 1 allocs/op +BenchmarkGetOne_Gjson-16 9431 ns/op 1380.81 MB/s 0 B/op 0 allocs/op +BenchmarkGetOne_Jsoniter-16 51178 ns/op 254.46 MB/s 27936 B/op 647 allocs/op +BenchmarkGetOne_Parallel_Sonic-16 216.7 ns/op 60098.95 MB/s 24 B/op 1 allocs/op +BenchmarkGetOne_Parallel_Gjson-16 1076 ns/op 12098.62 MB/s 0 B/op 0 allocs/op +BenchmarkGetOne_Parallel_Jsoniter-16 17741 ns/op 734.06 MB/s 27945 B/op 647 allocs/op +BenchmarkSetOne_Sonic-16 9571 ns/op 1360.61 MB/s 1584 B/op 17 allocs/op +BenchmarkSetOne_Sjson-16 36456 ns/op 357.22 MB/s 52180 B/op 9 allocs/op +BenchmarkSetOne_Jsoniter-16 79475 ns/op 163.86 MB/s 45862 B/op 964 allocs/op +BenchmarkSetOne_Parallel_Sonic-16 850.9 ns/op 15305.31 MB/s 1584 B/op 17 allocs/op +BenchmarkSetOne_Parallel_Sjson-16 18194 ns/op 715.77 MB/s 52247 B/op 9 allocs/op +BenchmarkSetOne_Parallel_Jsoniter-16 33560 ns/op 388.05 MB/s 45892 B/op 964 allocs/op +``` +- [Small](https://github.com/bytedance/sonic/blob/main/testdata/small.go) (400B, 11 keys, 3 layers) +![small benchmarks](bench-small.png) +- [Large](https://github.com/bytedance/sonic/blob/main/testdata/twitter.json) (635KB, 10000+ key, 6 layers) +![large benchmarks](bench-large.png) + +See [bench.sh](https://github.com/bytedance/sonic/blob/main/bench.sh) for benchmark codes. + +## How it works +See [INTRODUCTION.md](INTRODUCTION.md). + +## Usage + +### Marshal/Unmarshal + +Default behaviors are mostly consistent with `encoding/json`, except HTML escaping form (see [Escape HTML](https://github.com/bytedance/sonic/blob/main/README.md#escape-html)) and `SortKeys` feature (optional support see [Sort Keys](https://github.com/bytedance/sonic/blob/main/README.md#sort-keys)) that is **NOT** in conformity to [RFC8259](https://datatracker.ietf.org/doc/html/rfc8259). + ```go +import "github.com/bytedance/sonic" + +var data YourSchema +// Marshal +output, err := sonic.Marshal(&data) +// Unmarshal +err := sonic.Unmarshal(output, &data) + ``` + +### Streaming IO +Sonic supports decoding json from `io.Reader` or encoding objects into `io.`Writer`, aims at handling multiple values as well as reducing memory consumption. +- encoder +```go +import "github.com/bytedance/sonic/encoder" + +var o1 = map[string]interface{}{ + "a": "b", +} +var o2 = 1 +var w = bytes.NewBuffer(nil) +var enc = encoder.NewStreamEncoder(w) +enc.Encode(o1) +enc.Encode(o2) +println(w.String()) // "{"a":"b"}\n1" +``` +- decoder +```go +import "github.com/bytedance/sonic/decoder" + +var o = map[string]interface{}{} +var r = strings.NewReader(`{"a":"b"}{"1":"2"}`) +var dec = decoder.NewStreamDecoder(r) +dec.Decode(&o) +dec.Decode(&o) +fmt.Printf("%+v", o) // map[1:2 a:b] +``` + +### Use Number/Use Int64 + ```go +import "github.com/bytedance/sonic/decoder" + +var input = `1` +var data interface{} + +// default float64 +dc := decoder.NewDecoder(input) +dc.Decode(&data) // data == float64(1) +// use json.Number +dc = decoder.NewDecoder(input) +dc.UseNumber() +dc.Decode(&data) // data == json.Number("1") +// use int64 +dc = decoder.NewDecoder(input) +dc.UseInt64() +dc.Decode(&data) // data == int64(1) + +root, err := sonic.GetFromString(input) +// Get json.Number +jn := root.Number() +jm := root.InterfaceUseNumber().(json.Number) // jn == jm +// Get float64 +fn := root.Float64() +fm := root.Interface().(float64) // jn == jm + ``` + +### Sort Keys +On account of the performance loss from sorting (roughly 10%), sonic doesn't enable this feature by default. If your component depends on it to work (like [zstd](https://github.com/facebook/zstd)), Use it like this: +```go +import "github.com/bytedance/sonic" +import "github.com/bytedance/sonic/encoder" + +// Binding map only +m := map[string]interface{}{} +v, err := encoder.Encode(m, encoder.SortMapKeys) + +// Or ast.Node.SortKeys() before marshal +var root := sonic.Get(JSON) +err := root.SortKeys() +``` +### Escape HTML +On account of the performance loss (roughly 15%), sonic doesn't enable this feature by default. You can use `encoder.EscapeHTML` option to open this feature (align with `encoding/json.HTMLEscape`). +```go +import "github.com/bytedance/sonic" + +v := map[string]string{"&&":"<>"} +ret, err := Encode(v, EscapeHTML) // ret == `{"\u0026\u0026":{"X":"\u003c\u003e"}}` +``` +### Compact Format +Sonic encodes primitive objects (struct/map...) as compact-format JSON by default, except marshaling `json.RawMessage` or `json.Marshaler`: sonic ensures validating their output JSON but **DONOT** compacting them for performance concerns. We provide the option `encoder.CompactMarshaler` to add compacting process. + +### Print Error +If there invalid syntax in input JSON, sonic will return `decoder.SyntaxError`, which supports pretty-printing of error position +```go +import "github.com/bytedance/sonic" +import "github.com/bytedance/sonic/decoder" + +var data interface{} +err := sonic.UnmarshalString("[[[}]]", &data) +if err != nil { + /* One line by default */ + println(e.Error()) // "Syntax error at index 3: invalid char\n\n\t[[[}]]\n\t...^..\n" + /* Pretty print */ + if e, ok := err.(decoder.SyntaxError); ok { + /*Syntax error at index 3: invalid char + + [[[}]] + ...^.. + */ + print(e.Description()) + } else if me, ok := err.(*decoder.MismatchTypeError); ok { + // decoder.MismatchTypeError is new to Sonic v1.6.0 + print(me.Description()) + } +} +``` + +#### Mismatched Types [Sonic v1.6.0] +If there a **mismatch-typed** value for a given key, sonic will report `decoder.MismatchTypeError` (if there are many, report the last one), but still skip wrong the value and keep decoding next JSON. +```go +import "github.com/bytedance/sonic" +import "github.com/bytedance/sonic/decoder" + +var data = struct{ + A int + B int +}{} +err := UnmarshalString(`{"A":"1","B":1}`, &data) +println(err.Error()) // Mismatch type int with value string "at index 5: mismatched type with value\n\n\t{\"A\":\"1\",\"B\":1}\n\t.....^.........\n" +fmt.Printf("%+v", data) // {A:0 B:1} +``` +### Ast.Node +Sonic/ast.Node is a completely self-contained AST for JSON. It implements serialization and deserialization both and provides robust APIs for obtaining and modification of generic data. +#### Get/Index +Search partial JSON by given paths, which must be non-negative integer or string, or nil +```go +import "github.com/bytedance/sonic" + +input := []byte(`{"key1":[{},{"key2":{"key3":[1,2,3]}}]}`) + +// no path, returns entire json +root, err := sonic.Get(input) +raw := root.Raw() // == string(input) + +// multiple paths +root, err := sonic.Get(input, "key1", 1, "key2") +sub := root.Get("key3").Index(2).Int64() // == 3 +``` +**Tip**: since `Index()` uses offset to locate data, which is much faster than scanning like `Get()`, we suggest you use it as much as possible. And sonic also provides another API `IndexOrGet()` to underlying use offset as well as ensure the key is matched. + +#### Set/Unset +Modify the json content by Set()/Unset() +```go +import "github.com/bytedance/sonic" + +// Set +exist, err := root.Set("key4", NewBool(true)) // exist == false +alias1 := root.Get("key4") +println(alias1.Valid()) // true +alias2 := root.Index(1) +println(alias1 == alias2) // true + +// Unset +exist, err := root.UnsetByIndex(1) // exist == true +println(root.Get("key4").Check()) // "value not exist" +``` + +#### Serialize +To encode `ast.Node` as json, use `MarshalJson()` or `json.Marshal()` (MUST pass the node's pointer) +```go +import ( + "encoding/json" + "github.com/bytedance/sonic" +) + +buf, err := root.MarshalJson() +println(string(buf)) // {"key1":[{},{"key2":{"key3":[1,2,3]}}]} +exp, err := json.Marshal(&root) // WARN: use pointer +println(string(buf) == string(exp)) // true +``` + +#### APIs +- validation: `Check()`, `Error()`, `Valid()`, `Exist()` +- searching: `Index()`, `Get()`, `IndexPair()`, `IndexOrGet()`, `GetByPath()` +- go-type casting: `Int64()`, `Float64()`, `String()`, `Number()`, `Bool()`, `Map[UseNumber|UseNode]()`, `Array[UseNumber|UseNode]()`, `Interface[UseNumber|UseNode]()` +- go-type packing: `NewRaw()`, `NewNumber()`, `NewNull()`, `NewBool()`, `NewString()`, `NewObject()`, `NewArray()` +- iteration: `Values()`, `Properties()`, `ForEach()`, `SortKeys()` +- modification: `Set()`, `SetByIndex()`, `Add()` + +## Compatibility +Sonic **DOES NOT** ensure to support all environments, due to the difficulty of developing high-performance codes. For developers who use sonic to build their applications in different environments, we have the following suggestions: + +- Developing on **Mac M1**: Make sure you have Rosetta 2 installed on your machine, and set `GOARCH=amd64` when building your application. Rosetta 2 can automatically translate x86 binaries to arm64 binaries and run x86 applications on Mac M1. +- Developing on **Linux arm64**: You can install qemu and use the `qemu-x86_64 -cpu max` command to convert x86 binaries to amr64 binaries for applications built with sonic. The qemu can achieve a similar transfer effect to Rosetta 2 on Mac M1. + +For developers who want to use sonic on Linux arm64 without qemu, or those who want to handle JSON strictly consistent with `encoding/json`, we provide some compatible APIs as `sonic.API` +- `ConfigDefault`: the sonic's default config (`EscapeHTML=false`,`SortKeys=false`...) to run on sonic-supporting environment. It will fall back to `encoding/json` with the corresponding config, and some options like `SortKeys=false` will be invalid. +- `ConfigStd`: the std-compatible config (`EscapeHTML=true`,`SortKeys=true`...) to run on sonic-supporting environment. It will fall back to `encoding/json`. +- `ConfigFastest`: the fastest config (`NoQuoteTextMarshaler=true`) to run on sonic-supporting environment. It will fall back to `encoding/json` with the corresponding config, and some options will be invalid. + +## Tips + +### Pretouch +Since Sonic uses [golang-asm](https://github.com/twitchyliquid64/golang-asm) as a JIT assembler, which is NOT very suitable for runtime compiling, first-hit running of a huge schema may cause request-timeout or even process-OOM. For better stability, we advise **using `Pretouch()` for huge-schema or compact-memory applications** before `Marshal()/Unmarshal()`. +```go +import ( + "reflect" + "github.com/bytedance/sonic" + "github.com/bytedance/sonic/option" +) + +func init() { + var v HugeStruct + + // For most large types (nesting depth <= option.DefaultMaxInlineDepth) + err := sonic.Pretouch(reflect.TypeOf(v)) + + // with more CompileOption... + err := sonic.Pretouch(reflect.TypeOf(v), + // If the type is too deep nesting (nesting depth > option.DefaultMaxInlineDepth), + // you can set compile recursive loops in Pretouch for better stability in JIT. + option.WithCompileRecursiveDepth(loop), + // For a large nested struct, try to set a smaller depth to reduce compiling time. + option.WithCompileMaxInlineDepth(depth), + ) +} +``` + +### Copy string +When decoding **string values without any escaped characters**, sonic references them from the origin JSON buffer instead of mallocing a new buffer to copy. This helps a lot for CPU performance but may leave the whole JSON buffer in memory as long as the decoded objects are being used. In practice, we found the extra memory introduced by referring JSON buffer is usually 20% ~ 80% of decoded objects. Once an application holds these objects for a long time (for example, cache the decoded objects for reusing), its in-use memory on the server may go up. We provide the option `decoder.CopyString()` for users to choose not to reference the JSON buffer, which may cause a decline in CPU performance to some degree. + +### Pass string or []byte? +For alignment to `encoding/json`, we provide API to pass `[]byte` as an argument, but the string-to-bytes copy is conducted at the same time considering safety, which may lose performance when the origin JSON is huge. Therefore, you can use `UnmarshalString()` and `GetFromString()` to pass a string, as long as your origin data is a string or **nocopy-cast** is safe for your []byte. We also provide API `MarshalString()` for convenient **nocopy-cast** of encoded JSON []byte, which is safe since sonic's output bytes is always duplicated and unique. + +### Accelerate `encoding.TextMarshaler` +To ensure data security, sonic.Encoder quotes and escapes string values from `encoding.TextMarshaler` interfaces by default, which may degrade performance much if most of your data is in form of them. We provide `encoder.NoQuoteTextMarshaler` to skip these operations, which means you **MUST** ensure their output string escaped and quoted following [RFC8259](https://datatracker.ietf.org/doc/html/rfc8259). + + +### Better performance for generic data +In **fully-parsed** scenario, `Unmarshal()` performs better than `Get()`+`Node.Interface()`. But if you only have a part of the schema for specific json, you can combine `Get()` and `Unmarshal()` together: +```go +import "github.com/bytedance/sonic" + +node, err := sonic.GetFromString(_TwitterJson, "statuses", 3, "user") +var user User // your partial schema... +err = sonic.UnmarshalString(node.Raw(), &user) +``` +Even if you don't have any schema, use `ast.Node` as the container of generic values instead of `map` or `interface`: +```go +import "github.com/bytedance/sonic" + +root, err := sonic.GetFromString(_TwitterJson) +user := root.GetByPath("statuses", 3, "user") // === root.Get("status").Index(3).Get("user") +err = user.Check() + +// err = user.LoadAll() // only call this when you want to use 'user' concurrently... +go someFunc(user) +``` +Why? Because `ast.Node` stores its children using `array`: +- `Array`'s performance is **much better** than `Map` when Inserting (Deserialize) and Scanning (Serialize) data; +- **Hashing** (`map[x]`) is not as efficient as **Indexing** (`array[x]`), which `ast.Node` can conduct on **both array and object**; +- Using `Interface()`/`Map()` means Sonic must parse all the underlying values, while `ast.Node` can parse them **on demand**. + +**CAUTION:** `ast.Node` **DOESN'T** ensure concurrent security directly, due to its **lazy-load** design. However, you can call `Node.Load()`/`Node.LoadAll()` to achieve that, which may bring performance reduction while it still works faster than converting to `map` or `interface{}` + +## Community +Sonic is a subproject of [CloudWeGo](https://www.cloudwego.io/). We are committed to building a cloud native ecosystem. diff --git a/vendor/github.com/bytedance/sonic/api.go b/vendor/github.com/bytedance/sonic/api.go new file mode 100644 index 00000000000..a2bc67eaa00 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/api.go @@ -0,0 +1,185 @@ +/* + * 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 sonic + +import ( + `io` + + `github.com/bytedance/sonic/ast` +) + +// Config is a combination of sonic/encoder.Options and sonic/decoder.Options +type Config struct { + // 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 bool + + // SortMapKeys indicates encoder that the keys of a map needs to be sorted + // before serializing into JSON. + // WARNING: This hurts performance A LOT, USE WITH CARE. + SortMapKeys bool + + // CompactMarshaler indicates encoder that the output JSON from json.Marshaler + // is always compact and needs no validation + CompactMarshaler bool + + // NoQuoteTextMarshaler indicates encoder that the output text from encoding.TextMarshaler + // is always escaped string and needs no quoting + NoQuoteTextMarshaler bool + + // NoNullSliceOrMap indicates encoder that all empty Array or Object are encoded as '[]' or '{}', + // instead of 'null' + NoNullSliceOrMap bool + + // UseInt64 indicates decoder to unmarshal an integer into an interface{} as an + // int64 instead of as a float64. + UseInt64 bool + + // UseNumber indicates decoder to unmarshal a number into an interface{} as a + // json.Number instead of as a float64. + UseNumber bool + + // UseUnicodeErrors indicates decoder to return an error when encounter invalid + // UTF-8 escape sequences. + UseUnicodeErrors bool + + // DisallowUnknownFields indicates 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. + DisallowUnknownFields bool + + // CopyString indicates decoder to decode string values by copying instead of referring. + CopyString bool + + // ValidateString indicates decoder and encoder to valid string values: decoder will return errors + // when unescaped control chars(\u0000-\u001f) in the string value of JSON. + ValidateString bool +} + +var ( + // ConfigDefault is the default config of APIs, aiming at efficiency and safty. + ConfigDefault = Config{}.Froze() + + // ConfigStd is the standard config of APIs, aiming at being compatible with encoding/json. + ConfigStd = Config{ + EscapeHTML : true, + SortMapKeys: true, + CompactMarshaler: true, + CopyString : true, + ValidateString : true, + }.Froze() + + // ConfigFastest is the fastest config of APIs, aiming at speed. + ConfigFastest = Config{ + NoQuoteTextMarshaler: true, + }.Froze() +) + + +// API is a binding of specific config. +// This interface is inspired by github.com/json-iterator/go, +// and has same behaviors under equavilent config. +type API interface { + // MarshalToString returns the JSON encoding string of v + MarshalToString(v interface{}) (string, error) + // Marshal returns the JSON encoding bytes of v. + Marshal(v interface{}) ([]byte, error) + // MarshalIndent returns the JSON encoding bytes with indent and prefix. + MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) + // UnmarshalFromString parses the JSON-encoded bytes and stores the result in the value pointed to by v. + UnmarshalFromString(str string, v interface{}) error + // Unmarshal parses the JSON-encoded string and stores the result in the value pointed to by v. + Unmarshal(data []byte, v interface{}) error + // NewEncoder create a Encoder holding writer + NewEncoder(writer io.Writer) Encoder + // NewDecoder create a Decoder holding reader + NewDecoder(reader io.Reader) Decoder + // Valid validates the JSON-encoded bytes and reportes if it is valid + Valid(data []byte) bool +} + +// Encoder encodes JSON into io.Writer +type Encoder interface { + // Encode writes the JSON encoding of v to the stream, followed by a newline character. + Encode(val interface{}) error + // SetEscapeHTML specifies whether problematic HTML characters + // should be escaped inside JSON quoted strings. + // The default behavior NOT ESCAPE + SetEscapeHTML(on bool) + // SetIndent instructs the encoder to format each subsequent encoded value + // as if indented by the package-level function Indent(dst, src, prefix, indent). + // Calling SetIndent("", "") disables indentation + SetIndent(prefix, indent string) +} + +// Decoder decodes JSON from io.Read +type Decoder interface { + // Decode reads the next JSON-encoded value from its input and stores it in the value pointed to by v. + Decode(val interface{}) error + // Buffered returns a reader of the data remaining in the Decoder's buffer. + // The reader is valid until the next call to Decode. + Buffered() io.Reader + // DisallowUnknownFields causes 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. + DisallowUnknownFields() + // More reports whether there is another element in the current array or object being parsed. + More() bool + // UseNumber causes the Decoder to unmarshal a number into an interface{} as a Number instead of as a float64. + UseNumber() +} + +// Marshal returns the JSON encoding bytes of v. +func Marshal(val interface{}) ([]byte, error) { + return ConfigDefault.Marshal(val) +} + +// MarshalString returns the JSON encoding string of v. +func MarshalString(val interface{}) (string, error) { + return ConfigDefault.MarshalToString(val) +} + +// Unmarshal parses the JSON-encoded data and stores the result in the value pointed to by v. +// NOTICE: This API copies given buffer by default, +// if you want to pass JSON more efficiently, use UnmarshalString instead. +func Unmarshal(buf []byte, val interface{}) error { + return ConfigDefault.Unmarshal(buf, val) +} + +// UnmarshalString is like Unmarshal, except buf is a string. +func UnmarshalString(buf string, val interface{}) error { + return ConfigDefault.UnmarshalFromString(buf, val) +} + +// Get searches the given path from json, +// and returns its representing ast.Node. +// +// Each path arg must be integer or string: +// - Integer means searching current node as array +// - String means searching current node as object +// +// Note, the api expects the json is well-formed at least, +// otherwise it may return unexpected result. +func Get(src []byte, path ...interface{}) (ast.Node, error) { + return GetFromString(string(src), path...) +} + +// GetFromString is same with Get except src is string, +// which can reduce unnecessary memory copy. +func GetFromString(src string, path ...interface{}) (ast.Node, error) { + return ast.NewSearcher(src).GetByPath(path...) +} \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/ast/api_amd64.go b/vendor/github.com/bytedance/sonic/ast/api_amd64.go new file mode 100644 index 00000000000..6b3458aeebc --- /dev/null +++ b/vendor/github.com/bytedance/sonic/ast/api_amd64.go @@ -0,0 +1,126 @@ +// +build amd64,go1.15,!go1.21 + + +package ast + +import ( + `runtime` + `unsafe` + + `github.com/bytedance/sonic/encoder` + `github.com/bytedance/sonic/internal/native` + `github.com/bytedance/sonic/internal/native/types` + `github.com/bytedance/sonic/internal/rt` + uq `github.com/bytedance/sonic/unquote` + `github.com/chenzhuoyu/base64x` +) + +var typeByte = rt.UnpackEface(byte(0)).Type + +func quote(buf *[]byte, val string) { + *buf = append(*buf, '"') + if len(val) == 0 { + *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 + ret := native.Quote(sp, nb, dp, &dn, 0) + // update *buf length + b.Len += dn + + // no need more output + if ret >= 0 { + break + } + + // double buf size + *b = 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) + *buf = append(*buf, '"') +} + +func unquote(src string) (string, types.ParsingError) { + return uq.String(src) +} + +func decodeBase64(src string) ([]byte, error) { + return base64x.StdEncoding.DecodeString(src) +} + +func encodeBase64(src []byte) string { + return base64x.StdEncoding.EncodeToString(src) +} + +func (self *Parser) decodeValue() (val types.JsonState) { + sv := (*rt.GoString)(unsafe.Pointer(&self.s)) + self.p = native.Value(sv.Ptr, sv.Len, self.p, &val, 0) + return +} + +func (self *Parser) skip() (int, types.ParsingError) { + fsm := types.NewStateMachine() + start := native.SkipOne(&self.s, &self.p, fsm, 0) + types.FreeStateMachine(fsm) + + if start < 0 { + return self.p, types.ParsingError(-start) + } + return start, 0 +} + +func (self *Node) encodeInterface(buf *[]byte) error { + //WARN: NOT compatible with json.Encoder + return encoder.EncodeInto(buf, self.packAny(), 0) +} + +func (self *Parser) skipFast() (int, types.ParsingError) { + start := native.SkipOneFast(&self.s, &self.p) + if start < 0 { + return self.p, types.ParsingError(-start) + } + return start, 0 +} + +func (self *Parser) getByPath(path ...interface{}) (int, types.ParsingError) { + start := native.GetByPath(&self.s, &self.p, &path) + runtime.KeepAlive(path) + if start < 0 { + return self.p, types.ParsingError(-start) + } + return start, 0 +} + + +func (self *Searcher) GetByPath(path ...interface{}) (Node, error) { + var err types.ParsingError + var start int + + self.parser.p = 0 + start, err = self.parser.getByPath(path...) + if err != 0 { + return Node{}, self.parser.syntaxError(err) + } + + t := switchRawType(self.parser.s[start]) + if t == _V_NONE { + return Node{}, self.parser.ExportError(err) + } + return newRawNode(self.parser.s[start:self.parser.p], t), nil +} \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/ast/api_compat.go b/vendor/github.com/bytedance/sonic/ast/api_compat.go new file mode 100644 index 00000000000..642330c51d5 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/ast/api_compat.go @@ -0,0 +1,102 @@ +// +build !amd64 go1.21 + +package ast + +import ( + `encoding/base64` + `encoding/json` + `fmt` + + `github.com/bytedance/sonic/internal/native/types` + `github.com/bytedance/sonic/internal/rt` +) + +func quote(buf *[]byte, val string) { + quoteString(buf, val) +} + +func unquote(src string) (string, types.ParsingError) { + sp := rt.IndexChar(src, -1) + out, ok := unquoteBytes(rt.BytesFrom(sp, len(src)+2, len(src)+2)) + if !ok { + return "", types.ERR_INVALID_ESCAPE + } + return rt.Mem2Str(out), 0 +} + + + +func decodeBase64(src string) ([]byte, error) { + return base64.StdEncoding.DecodeString(src) +} + +func encodeBase64(src []byte) string { + return base64.StdEncoding.EncodeToString(src) +} + +func (self *Parser) decodeValue() (val types.JsonState) { + e, v := decodeValue(self.s, self.p) + if e < 0 { + return v + } + self.p = e + return v +} + +func (self *Parser) skip() (int, types.ParsingError) { + e, s := skipValue(self.s, self.p) + if e < 0 { + return self.p, types.ParsingError(-e) + } + self.p = e + return s, 0 +} + +func (self *Parser) skipFast() (int, types.ParsingError) { + return self.skip() +} + +func (self *Node) encodeInterface(buf *[]byte) error { + out, err := json.Marshal(self.packAny()) + if err != nil { + return err + } + *buf = append(*buf, out...) + return nil +} + +func (self *Searcher) GetByPath(path ...interface{}) (Node, error) { + self.parser.p = 0 + + var err types.ParsingError + for _, p := range path { + switch p := p.(type) { + case int: + if err = self.parser.searchIndex(p); err != 0 { + return Node{}, self.parser.ExportError(err) + } + case string: + if err = self.parser.searchKey(p); err != 0 { + return Node{}, self.parser.ExportError(err) + } + default: + panic("path must be either int or string") + } + } + + var start = self.parser.p + if start, err = self.parser.skip(); err != 0 { + return Node{}, self.parser.ExportError(err) + } + ns := len(self.parser.s) + if self.parser.p > ns || start >= ns || start>=self.parser.p { + return Node{}, fmt.Errorf("skip %d char out of json boundary", start) + } + + t := switchRawType(self.parser.s[start]) + if t == _V_NONE { + return Node{}, self.parser.ExportError(err) + } + + return newRawNode(self.parser.s[start:self.parser.p], t), nil +} \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/ast/asm.s b/vendor/github.com/bytedance/sonic/ast/asm.s new file mode 100644 index 00000000000..e69de29bb2d diff --git a/vendor/github.com/bytedance/sonic/ast/decode.go b/vendor/github.com/bytedance/sonic/ast/decode.go new file mode 100644 index 00000000000..d54e9831809 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/ast/decode.go @@ -0,0 +1,430 @@ +package ast + +import ( + `encoding/base64` + `runtime` + `strconv` + `unsafe` + + `github.com/bytedance/sonic/internal/native/types` + `github.com/bytedance/sonic/internal/rt` +) + +const _blankCharsMask = (1 << ' ') | (1 << '\t') | (1 << '\r') | (1 << '\n') + +const ( + bytesNull = "null" + bytesTrue = "true" + bytesFalse = "false" + bytesObject = "{}" + bytesArray = "[]" +) + +func isSpace(c byte) bool { + return (int(1<= se { + return -int(types.ERR_EOF) + } + runtime.KeepAlive(src) + return int(sp - uintptr(rt.IndexChar(src, 0))) +} + +func decodeNull(src string, pos int) (ret int) { + ret = pos + 4 + if ret > len(src) { + return -int(types.ERR_EOF) + } + if src[pos:ret] == bytesNull { + return ret + } else { + return -int(types.ERR_INVALID_CHAR) + } +} + +func decodeTrue(src string, pos int) (ret int) { + ret = pos + 4 + if ret > len(src) { + return -int(types.ERR_EOF) + } + if src[pos:ret] == bytesTrue { + return ret + } else { + return -int(types.ERR_INVALID_CHAR) + } + +} + +func decodeFalse(src string, pos int) (ret int) { + ret = pos + 5 + if ret > len(src) { + return -int(types.ERR_EOF) + } + if src[pos:ret] == bytesFalse { + return ret + } + return -int(types.ERR_INVALID_CHAR) +} + +func decodeString(src string, pos int) (ret int, v string) { + ret, ep := skipString(src, pos) + if ep == -1 { + (*rt.GoString)(unsafe.Pointer(&v)).Ptr = rt.IndexChar(src, pos+1) + (*rt.GoString)(unsafe.Pointer(&v)).Len = ret - pos - 2 + return ret, v + } + + vv, ok := unquoteBytes(rt.Str2Mem(src[pos:ret])) + if !ok { + return -int(types.ERR_INVALID_CHAR), "" + } + + runtime.KeepAlive(src) + return ret, rt.Mem2Str(vv) +} + +func decodeBinary(src string, pos int) (ret int, v []byte) { + var vv string + ret, vv = decodeString(src, pos) + if ret < 0 { + return ret, nil + } + var err error + v, err = base64.StdEncoding.DecodeString(vv) + if err != nil { + return -int(types.ERR_INVALID_CHAR), nil + } + return ret, v +} + +func isDigit(c byte) bool { + return c >= '0' && c <= '9' +} + +func decodeInt64(src string, pos int) (ret int, v int64, err error) { + sp := uintptr(rt.IndexChar(src, pos)) + ss := uintptr(sp) + se := uintptr(rt.IndexChar(src, len(src))) + if uintptr(sp) >= se { + return -int(types.ERR_EOF), 0, nil + } + + if c := *(*byte)(unsafe.Pointer(sp)); c == '-' { + sp += 1 + } + if sp == se { + return -int(types.ERR_EOF), 0, nil + } + + for ; sp < se; sp += uintptr(1) { + if !isDigit(*(*byte)(unsafe.Pointer(sp))) { + break + } + } + + if sp < se { + if c := *(*byte)(unsafe.Pointer(sp)); c == '.' || c == 'e' || c == 'E' { + return -int(types.ERR_INVALID_NUMBER_FMT), 0, nil + } + } + + var vv string + ret = int(uintptr(sp) - uintptr((*rt.GoString)(unsafe.Pointer(&src)).Ptr)) + (*rt.GoString)(unsafe.Pointer(&vv)).Ptr = unsafe.Pointer(ss) + (*rt.GoString)(unsafe.Pointer(&vv)).Len = ret - pos + + v, err = strconv.ParseInt(vv, 10, 64) + if err != nil { + //NOTICE: allow overflow here + if err.(*strconv.NumError).Err == strconv.ErrRange { + return ret, 0, err + } + return -int(types.ERR_INVALID_CHAR), 0, err + } + + runtime.KeepAlive(src) + return ret, v, nil +} + +func isNumberChars(c byte) bool { + return (c >= '0' && c <= '9') || c == '+' || c == '-' || c == 'e' || c == 'E' || c == '.' +} + +func decodeFloat64(src string, pos int) (ret int, v float64, err error) { + sp := uintptr(rt.IndexChar(src, pos)) + ss := uintptr(sp) + se := uintptr(rt.IndexChar(src, len(src))) + if uintptr(sp) >= se { + return -int(types.ERR_EOF), 0, nil + } + + if c := *(*byte)(unsafe.Pointer(sp)); c == '-' { + sp += 1 + } + if sp == se { + return -int(types.ERR_EOF), 0, nil + } + + for ; sp < se; sp += uintptr(1) { + if !isNumberChars(*(*byte)(unsafe.Pointer(sp))) { + break + } + } + + var vv string + ret = int(uintptr(sp) - uintptr((*rt.GoString)(unsafe.Pointer(&src)).Ptr)) + (*rt.GoString)(unsafe.Pointer(&vv)).Ptr = unsafe.Pointer(ss) + (*rt.GoString)(unsafe.Pointer(&vv)).Len = ret - pos + + v, err = strconv.ParseFloat(vv, 64) + if err != nil { + //NOTICE: allow overflow here + if err.(*strconv.NumError).Err == strconv.ErrRange { + return ret, 0, err + } + return -int(types.ERR_INVALID_CHAR), 0, err + } + + runtime.KeepAlive(src) + return ret, v, nil +} + +func decodeValue(src string, pos int) (ret int, v types.JsonState) { + pos = skipBlank(src, pos) + if pos < 0 { + return pos, types.JsonState{Vt: types.ValueType(pos)} + } + switch c := src[pos]; c { + case 'n': + ret = decodeNull(src, pos) + if ret < 0 { + return ret, types.JsonState{Vt: types.ValueType(ret)} + } + return ret, types.JsonState{Vt: types.V_NULL} + case '"': + var ep int + ret, ep = skipString(src, pos) + if ret < 0 { + return ret, types.JsonState{Vt: types.ValueType(ret)} + } + return ret, types.JsonState{Vt: types.V_STRING, Iv: int64(pos + 1), Ep: ep} + case '{': + return pos + 1, types.JsonState{Vt: types.V_OBJECT} + case '[': + return pos + 1, types.JsonState{Vt: types.V_ARRAY} + case 't': + ret = decodeTrue(src, pos) + if ret < 0 { + return ret, types.JsonState{Vt: types.ValueType(ret)} + } + return ret, types.JsonState{Vt: types.V_TRUE} + case 'f': + ret = decodeFalse(src, pos) + if ret < 0 { + return ret, types.JsonState{Vt: types.ValueType(ret)} + } + return ret, types.JsonState{Vt: types.V_FALSE} + case '-', '+', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + var iv int64 + ret, iv, _ = decodeInt64(src, pos) + if ret >= 0 { + return ret, types.JsonState{Vt: types.V_INTEGER, Iv: iv, Ep: pos} + } else if ret != -int(types.ERR_INVALID_NUMBER_FMT) { + return ret, types.JsonState{Vt: types.ValueType(ret)} + } + var fv float64 + ret, fv, _ = decodeFloat64(src, pos) + if ret >= 0 { + return ret, types.JsonState{Vt: types.V_DOUBLE, Dv: fv, Ep: pos} + } else { + return ret, types.JsonState{Vt: types.ValueType(ret)} + } + default: + return -int(types.ERR_INVALID_CHAR), types.JsonState{Vt:-types.ValueType(types.ERR_INVALID_CHAR)} + } +} + +func skipNumber(src string, pos int) (ret int) { + sp := uintptr(rt.IndexChar(src, pos)) + se := uintptr(rt.IndexChar(src, len(src))) + if uintptr(sp) >= se { + return -int(types.ERR_EOF) + } + + if c := *(*byte)(unsafe.Pointer(sp)); c == '-' { + sp += 1 + } + ss := sp + + var pointer bool + var exponent bool + var lastIsDigit bool + var nextNeedDigit = true + + for ; sp < se; sp += uintptr(1) { + c := *(*byte)(unsafe.Pointer(sp)) + if isDigit(c) { + lastIsDigit = true + nextNeedDigit = false + continue + } else if nextNeedDigit { + return -int(types.ERR_INVALID_CHAR) + } else if c == '.' { + if !lastIsDigit || pointer || sp == ss { + return -int(types.ERR_INVALID_CHAR) + } + pointer = true + lastIsDigit = false + nextNeedDigit = true + continue + } else if c == 'e' || c == 'E' { + if !lastIsDigit || exponent { + return -int(types.ERR_INVALID_CHAR) + } + if sp == se-1 { + return -int(types.ERR_EOF) + } + exponent = true + lastIsDigit = false + nextNeedDigit = false + continue + } else if c == '-' || c == '+' { + if prev := *(*byte)(unsafe.Pointer(sp - 1)); prev != 'e' && prev != 'E' { + return -int(types.ERR_INVALID_CHAR) + } + lastIsDigit = false + nextNeedDigit = true + continue + } else { + break + } + } + + if nextNeedDigit { + return -int(types.ERR_EOF) + } + + runtime.KeepAlive(src) + return int(uintptr(sp) - uintptr((*rt.GoString)(unsafe.Pointer(&src)).Ptr)) +} + +func skipString(src string, pos int) (ret int, ep int) { + if pos+1 >= len(src) { + return -int(types.ERR_EOF), -1 + } + + sp := uintptr(rt.IndexChar(src, pos)) + se := uintptr(rt.IndexChar(src, len(src))) + + if *(*byte)(unsafe.Pointer(sp)) != '"' { + return -int(types.ERR_INVALID_CHAR), -1 + } + sp += 1 + + ep = -1 + for sp < se { + c := *(*byte)(unsafe.Pointer(sp)) + if c == '\\' { + if ep == -1 { + ep = int(uintptr(sp) - uintptr((*rt.GoString)(unsafe.Pointer(&src)).Ptr)) + } + sp += 2 + continue + } + sp += 1 + if c == '"' { + break + } + } + + if sp > se { + return -int(types.ERR_EOF), -1 + } + + runtime.KeepAlive(src) + return int(uintptr(sp) - uintptr((*rt.GoString)(unsafe.Pointer(&src)).Ptr)), ep +} + +func skipPair(src string, pos int, lchar byte, rchar byte) (ret int) { + if pos+1 >= len(src) { + return -int(types.ERR_EOF) + } + + sp := uintptr(rt.IndexChar(src, pos)) + se := uintptr(rt.IndexChar(src, len(src))) + + if *(*byte)(unsafe.Pointer(sp)) != lchar { + return -int(types.ERR_INVALID_CHAR) + } + + sp += 1 + nbrace := 1 + inquote := false + + for sp < se { + c := *(*byte)(unsafe.Pointer(sp)) + if c == '\\' { + sp += 2 + continue + } else if c == '"' { + inquote = !inquote + } else if c == lchar { + if !inquote { + nbrace += 1 + } + } else if c == rchar { + if !inquote { + nbrace -= 1 + if nbrace == 0 { + sp += 1 + break + } + } + } + sp += 1 + } + + if nbrace != 0 { + return -int(types.ERR_INVALID_CHAR) + } + + runtime.KeepAlive(src) + return int(uintptr(sp) - uintptr((*rt.GoString)(unsafe.Pointer(&src)).Ptr)) +} + +func skipValue(src string, pos int) (ret int, start int) { + pos = skipBlank(src, pos) + if pos < 0 { + return pos, -1 + } + switch c := src[pos]; c { + case 'n': + ret = decodeNull(src, pos) + case '"': + ret, _ = skipString(src, pos) + case '{': + ret = skipPair(src, pos, '{', '}') + case '[': + ret = skipPair(src, pos, '[', ']') + case 't': + ret = decodeTrue(src, pos) + case 'f': + ret = decodeFalse(src, pos) + case '-', '+', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + ret = skipNumber(src, pos) + default: + ret = -int(types.ERR_INVALID_CHAR) + } + return ret, pos +} diff --git a/vendor/github.com/bytedance/sonic/ast/encode.go b/vendor/github.com/bytedance/sonic/ast/encode.go new file mode 100644 index 00000000000..1187e30c260 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/ast/encode.go @@ -0,0 +1,259 @@ +/* + * 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 ast + +import ( + `sync` + `unicode/utf8` + + `github.com/bytedance/sonic/internal/rt` +) + +const ( + _MaxBuffer = 1024 // 1KB buffer size +) + +func quoteString(e *[]byte, s string) { + *e = append(*e, '"') + start := 0 + for i := 0; i < len(s); { + if b := s[i]; b < utf8.RuneSelf { + if 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, hex[b>>4]) + *e = append(*e, hex[b&0xF]) + } + i++ + start = i + continue + } + c, size := utf8.DecodeRuneInString(s[i:]) + // if c == utf8.RuneError && size == 1 { + // if start < i { + // e.Write(s[start:i]) + // } + // e.WriteString(`\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, hex[c&0xF]) + i += size + start = i + continue + } + i += size + } + if start < len(s) { + *e = append(*e, s[start:]...) + } + *e = append(*e, '"') +} + +var bytesPool = sync.Pool{} + +func (self *Node) MarshalJSON() ([]byte, error) { + buf := newBuffer() + err := self.encode(buf) + if err != nil { + freeBuffer(buf) + return nil, err + } + + ret := make([]byte, len(*buf)) + copy(ret, *buf) + freeBuffer(buf) + return ret, err +} + +func newBuffer() *[]byte { + if ret := bytesPool.Get(); ret != nil { + return ret.(*[]byte) + } else { + buf := make([]byte, 0, _MaxBuffer) + return &buf + } +} + +func freeBuffer(buf *[]byte) { + *buf = (*buf)[:0] + bytesPool.Put(buf) +} + +func (self *Node) encode(buf *[]byte) error { + if self.IsRaw() { + return self.encodeRaw(buf) + } + switch self.Type() { + case V_NONE : return ErrNotExist + case V_ERROR : return self.Check() + case V_NULL : return self.encodeNull(buf) + case V_TRUE : return self.encodeTrue(buf) + case V_FALSE : return self.encodeFalse(buf) + case V_ARRAY : return self.encodeArray(buf) + case V_OBJECT: return self.encodeObject(buf) + case V_STRING: return self.encodeString(buf) + case V_NUMBER: return self.encodeNumber(buf) + case V_ANY : return self.encodeInterface(buf) + default : return ErrUnsupportType + } +} + +func (self *Node) encodeRaw(buf *[]byte) error { + raw, err := self.Raw() + if err != nil { + return err + } + *buf = append(*buf, raw...) + return nil +} + +func (self *Node) encodeNull(buf *[]byte) error { + *buf = append(*buf, bytesNull...) + return nil +} + +func (self *Node) encodeTrue(buf *[]byte) error { + *buf = append(*buf, bytesTrue...) + return nil +} + +func (self *Node) encodeFalse(buf *[]byte) error { + *buf = append(*buf, bytesFalse...) + return nil +} + +func (self *Node) encodeNumber(buf *[]byte) error { + str := rt.StrFrom(self.p, self.v) + *buf = append(*buf, str...) + return nil +} + +func (self *Node) encodeString(buf *[]byte) error { + if self.v == 0 { + *buf = append(*buf, '"', '"') + return nil + } + + quote(buf, rt.StrFrom(self.p, self.v)) + return nil +} + +func (self *Node) encodeArray(buf *[]byte) error { + if self.isLazy() { + if err := self.skipAllIndex(); err != nil { + return err + } + } + + nb := self.len() + if nb == 0 { + *buf = append(*buf, bytesArray...) + return nil + } + + *buf = append(*buf, '[') + + var p = (*Node)(self.p) + err := p.encode(buf) + if err != nil { + return err + } + for i := 1; i < nb; i++ { + *buf = append(*buf, ',') + p = p.unsafe_next() + err := p.encode(buf) + if err != nil { + return err + } + } + + *buf = append(*buf, ']') + return nil +} + +func (self *Pair) encode(buf *[]byte) error { + if len(*buf) == 0 { + *buf = append(*buf, '"', '"', ':') + return self.Value.encode(buf) + } + + quote(buf, self.Key) + *buf = append(*buf, ':') + + return self.Value.encode(buf) +} + +func (self *Node) encodeObject(buf *[]byte) error { + if self.isLazy() { + if err := self.skipAllKey(); err != nil { + return err + } + } + + nb := self.len() + if nb == 0 { + *buf = append(*buf, bytesObject...) + return nil + } + + *buf = append(*buf, '{') + + var p = (*Pair)(self.p) + err := p.encode(buf) + if err != nil { + return err + } + for i := 1; i < nb; i++ { + *buf = append(*buf, ',') + p = p.unsafe_next() + err := p.encode(buf) + if err != nil { + return err + } + } + + *buf = append(*buf, '}') + return nil +} \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/ast/error.go b/vendor/github.com/bytedance/sonic/ast/error.go new file mode 100644 index 00000000000..f4c441ae6c7 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/ast/error.go @@ -0,0 +1,98 @@ +package ast + +import ( + `fmt` + `strings` + `unsafe` + + `github.com/bytedance/sonic/internal/native/types` +) + +func (self *Parser) syntaxError(err types.ParsingError) SyntaxError { + return SyntaxError{ + Pos : self.p, + Src : self.s, + Code: err, + } +} + +func newSyntaxError(err SyntaxError) *Node { + msg := err.Description() + return &Node{ + t: V_ERROR, + v: int64(err.Code), + p: unsafe.Pointer(&msg), + } +} + +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 { + i := 16 + p := self.Pos - i + q := self.Pos + i + + /* check for empty source */ + if self.Src == "" { + return fmt.Sprintf("no sources available: %#v", self) + } + + /* prevent slicing before the beginning */ + if p < 0 { + p, q, i = 0, q - p, i + p + } + + /* prevent slicing beyond the end */ + if n := len(self.Src); q > n { + n = q - n + q = len(self.Src) + + /* move the left bound if possible */ + if p > n { + i += n + p -= n + } + } + + /* left and right length */ + x := clamp_zero(i) + y := clamp_zero(q - p - i - 1) + + /* 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 (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 + } +} diff --git a/vendor/github.com/bytedance/sonic/ast/iterator.go b/vendor/github.com/bytedance/sonic/ast/iterator.go new file mode 100644 index 00000000000..03a25b4e9ff --- /dev/null +++ b/vendor/github.com/bytedance/sonic/ast/iterator.go @@ -0,0 +1,164 @@ +/* + * 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 ast + +import ( + `fmt` + + `github.com/bytedance/sonic/internal/native/types` +) + +type Pair struct { + Key string + Value Node +} + +// Values returns iterator for array's children traversal +func (self *Node) Values() (ListIterator, error) { + if err := self.should(types.V_ARRAY, "an array"); err != nil { + return ListIterator{}, err + } + return ListIterator{Iterator{p: self}}, nil +} + +// Properties returns iterator for object's children traversal +func (self *Node) Properties() (ObjectIterator, error) { + if err := self.should(types.V_OBJECT, "an object"); err != nil { + return ObjectIterator{}, err + } + return ObjectIterator{Iterator{p: self}}, nil +} + +type Iterator struct { + i int + p *Node +} + +func (self *Iterator) Pos() int { + return self.i +} + +func (self *Iterator) Len() int { + return self.p.len() +} + +// HasNext reports if it is the end of iteration or has error. +func (self *Iterator) HasNext() bool { + if !self.p.isLazy() { + return self.p.Valid() && self.i < self.p.len() + } else if self.p.t == _V_ARRAY_LAZY { + return self.p.skipNextNode().Valid() + } else if self.p.t == _V_OBJECT_LAZY { + pair := self.p.skipNextPair() + if pair == nil { + return false + } + return pair.Value.Valid() + } + return false +} + +// ListIterator is specialized iterator for V_ARRAY +type ListIterator struct { + Iterator +} + +// ObjectIterator is specialized iterator for V_ARRAY +type ObjectIterator struct { + Iterator +} + +// Next scans through children of underlying V_ARRAY, +// copies each child to v, and returns .HasNext(). +func (self *ListIterator) Next(v *Node) bool { + if !self.HasNext() { + return false + } else { + *v, self.i = *self.p.nodeAt(self.i), self.i + 1 + return true + } +} + +// Next scans through children of underlying V_OBJECT, +// copies each child to v, and returns .HasNext(). +func (self *ObjectIterator) Next(p *Pair) bool { + if !self.HasNext() { + return false + } else { + *p, self.i = *self.p.pairAt(self.i), self.i + 1 + return true + } +} + +// Sequence represents scanning path of single-layer nodes. +// Index indicates the value's order in both V_ARRAY and V_OBJECT json. +// Key is the value's key (for V_OBJECT json only, otherwise it will be nil). +type Sequence struct { + Index int + Key *string + // Level int +} + +// String is string representation of one Sequence +func (s Sequence) String() string { + k := "" + if s.Key != nil { + k = *s.Key + } + return fmt.Sprintf("Sequence(%d, %q)", s.Index, k) +} + +type Scanner func(path Sequence, node *Node) bool + +// ForEach scans one V_OBJECT node's children from JSON head to tail, +// and pass the Sequence and Node of corresponding JSON value. +// +// Especailly, if the node is not V_ARRAY or V_OBJECT, +// the node itself will be returned and Sequence.Index == -1. +func (self *Node) ForEach(sc Scanner) error { + switch self.itype() { + case types.V_ARRAY: + ns, err := self.UnsafeArray() + if err != nil { + return err + } + for i := range ns { + if !sc(Sequence{i, nil}, &ns[i]) { + return err + } + } + case types.V_OBJECT: + ns, err := self.UnsafeMap() + if err != nil { + return err + } + for i := range ns { + if !sc(Sequence{i, &ns[i].Key}, &ns[i].Value) { + return err + } + } + default: + sc(Sequence{-1, nil}, self) + } + return self.Check() +} + +type PairSlice []Pair + +func (self PairSlice) Sort() { + radixQsort(self, 0, maxDepth(len(self))) +} \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/ast/node.go b/vendor/github.com/bytedance/sonic/ast/node.go new file mode 100644 index 00000000000..0d37baf1205 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/ast/node.go @@ -0,0 +1,1802 @@ +/* + * 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 ast + +import ( + `encoding/json` + `fmt` + `strconv` + `unsafe` + `reflect` + + `github.com/bytedance/sonic/internal/native/types` + `github.com/bytedance/sonic/internal/rt` +) + +const ( + _CAP_BITS = 32 + _LEN_MASK = 1 << _CAP_BITS - 1 + + _NODE_SIZE = unsafe.Sizeof(Node{}) + _PAIR_SIZE = unsafe.Sizeof(Pair{}) +) + +const ( + _V_NONE types.ValueType = 0 + _V_NODE_BASE types.ValueType = 1 << 5 + _V_LAZY types.ValueType = 1 << 7 + _V_RAW types.ValueType = 1 << 8 + _V_NUMBER = _V_NODE_BASE + 1 + _V_ANY = _V_NODE_BASE + 2 + _V_ARRAY_LAZY = _V_LAZY | types.V_ARRAY + _V_OBJECT_LAZY = _V_LAZY | types.V_OBJECT + _MASK_LAZY = _V_LAZY - 1 + _MASK_RAW = _V_RAW - 1 +) + +const ( + V_NONE = 0 + V_ERROR = 1 + V_NULL = 2 + V_TRUE = 3 + V_FALSE = 4 + V_ARRAY = 5 + V_OBJECT = 6 + V_STRING = 7 + V_NUMBER = int(_V_NUMBER) + V_ANY = int(_V_ANY) +) + +var ( + byteType = rt.UnpackType(reflect.TypeOf(byte(0))) +) + +type Node struct { + v int64 + t types.ValueType + p unsafe.Pointer +} + +// UnmarshalJSON is just an adapter to json.Unmarshaler. +// If you want better performance, use Searcher.GetByPath() directly +func (self *Node) UnmarshalJSON(data []byte) (err error) { + *self, err = NewSearcher(string(data)).GetByPath() + return +} + +/** Node Type Accessor **/ + +// Type returns json type represented by the node +// It will be one of belows: +// V_NONE = 0 (empty node) +// V_ERROR = 1 (error node) +// V_NULL = 2 (json value `null`) +// V_TRUE = 3 (json value `true`) +// V_FALSE = 4 (json value `false`) +// V_ARRAY = 5 (json value array) +// V_OBJECT = 6 (json value object) +// V_STRING = 7 (json value string) +// V_NUMBER = 33 (json value number ) +// V_ANY = 34 (golang interface{}) +func (self Node) Type() int { + return int(self.t & _MASK_LAZY & _MASK_RAW) +} + +func (self Node) itype() types.ValueType { + return self.t & _MASK_LAZY & _MASK_RAW +} + +// Exists returns false only if the self is nil or empty node V_NONE +func (self *Node) Exists() bool { + return self != nil && self.t != _V_NONE +} + +// Valid reports if self is NOT V_ERROR or nil +func (self *Node) Valid() bool { + if self == nil { + return false + } + return self.t != V_ERROR +} + +// Check checks if the node itself is valid, and return: +// - ErrNotFound If the node is nil +// - Its underlying error If the node is V_ERROR +func (self *Node) Check() error { + if self == nil { + return ErrNotExist + } else if self.t != V_ERROR { + return nil + } else { + return self + } +} + +// Error returns error message if the node is invalid +func (self Node) Error() string { + if self.t != V_ERROR { + return "" + } else { + return *(*string)(self.p) + } +} + +// IsRaw returns true if node's underlying value is raw json +func (self Node) IsRaw() bool { + return self.t&_V_RAW != 0 +} + +func (self *Node) isLazy() bool { + return self != nil && self.t&_V_LAZY != 0 +} + +func (self *Node) isAny() bool { + return self != nil && self.t == _V_ANY +} + +/** Simple Value Methods **/ + +// Raw returns json representation of the node, +func (self *Node) Raw() (string, error) { + if !self.IsRaw() { + buf, err := self.MarshalJSON() + return rt.Mem2Str(buf), err + } + return rt.StrFrom(self.p, self.v), nil +} + +func (self *Node) checkRaw() error { + if err := self.Check(); err != nil { + return err + } + if self.IsRaw() { + self.parseRaw(false) + } + return nil +} + +// Bool returns bool value represented by this node, +// including types.V_TRUE|V_FALSE|V_NUMBER|V_STRING|V_ANY|V_NULL, +// V_NONE will return error +func (self *Node) Bool() (bool, error) { + if err := self.checkRaw(); err != nil { + return false, err + } + switch self.t { + case types.V_TRUE : return true , nil + case types.V_FALSE : return false, nil + case types.V_NULL : return false, nil + case _V_NUMBER : + if i, err := numberToInt64(self); err == nil { + return i != 0, nil + } else if f, err := numberToFloat64(self); err == nil { + return f != 0, nil + } else { + return false, err + } + case types.V_STRING: return strconv.ParseBool(rt.StrFrom(self.p, self.v)) + case _V_ANY : + any := self.packAny() + switch v := any.(type) { + case bool : return v, nil + case int : return v != 0, nil + case int8 : return v != 0, nil + case int16 : return v != 0, nil + case int32 : return v != 0, nil + case int64 : return v != 0, nil + case uint : return v != 0, nil + case uint8 : return v != 0, nil + case uint16 : return v != 0, nil + case uint32 : return v != 0, nil + case uint64 : return v != 0, nil + case float32: return v != 0, nil + case float64: return v != 0, nil + case string : return strconv.ParseBool(v) + case json.Number: + if i, err := v.Int64(); err == nil { + return i != 0, nil + } else if f, err := v.Float64(); err == nil { + return f != 0, nil + } else { + return false, err + } + default: return false, ErrUnsupportType + } + default : return false, ErrUnsupportType + } +} + +// Int64 casts the node to int64 value, +// including V_NUMBER|V_TRUE|V_FALSE|V_ANY|V_STRING +// V_NONE it will return error +func (self *Node) Int64() (int64, error) { + if err := self.checkRaw(); err != nil { + return 0, err + } + switch self.t { + case _V_NUMBER, types.V_STRING : + if i, err := numberToInt64(self); err == nil { + return i, nil + } else if f, err := numberToFloat64(self); err == nil { + return int64(f), nil + } else { + return 0, err + } + case types.V_TRUE : return 1, nil + case types.V_FALSE : return 0, nil + case types.V_NULL : return 0, nil + case _V_ANY : + any := self.packAny() + switch v := any.(type) { + case bool : if v { return 1, nil } else { return 0, nil } + case int : return int64(v), nil + case int8 : return int64(v), nil + case int16 : return int64(v), nil + case int32 : return int64(v), nil + case int64 : return int64(v), nil + case uint : return int64(v), nil + case uint8 : return int64(v), nil + case uint16 : return int64(v), nil + case uint32 : return int64(v), nil + case uint64 : return int64(v), nil + case float32: return int64(v), nil + case float64: return int64(v), nil + case string : + if i, err := strconv.ParseInt(v, 10, 64); err == nil { + return i, nil + } else if f, err := strconv.ParseFloat(v, 64); err == nil { + return int64(f), nil + } else { + return 0, err + } + case json.Number: + if i, err := v.Int64(); err == nil { + return i, nil + } else if f, err := v.Float64(); err == nil { + return int64(f), nil + } else { + return 0, err + } + default: return 0, ErrUnsupportType + } + default : return 0, ErrUnsupportType + } +} + +// StrictInt64 exports underlying int64 value, including V_NUMBER, V_ANY +func (self *Node) StrictInt64() (int64, error) { + if err := self.checkRaw(); err != nil { + return 0, err + } + switch self.t { + case _V_NUMBER : return numberToInt64(self) + case _V_ANY : + any := self.packAny() + switch v := any.(type) { + case int : return int64(v), nil + case int8 : return int64(v), nil + case int16 : return int64(v), nil + case int32 : return int64(v), nil + case int64 : return int64(v), nil + case uint : return int64(v), nil + case uint8 : return int64(v), nil + case uint16: return int64(v), nil + case uint32: return int64(v), nil + case uint64: return int64(v), nil + case json.Number: + if i, err := v.Int64(); err == nil { + return i, nil + } else { + return 0, err + } + default: return 0, ErrUnsupportType + } + default : return 0, ErrUnsupportType + } +} + +func castNumber(v bool) json.Number { + if v { + return json.Number("1") + } else { + return json.Number("0") + } +} + +// Number casts node to float64, +// including V_NUMBER|V_TRUE|V_FALSE|V_ANY|V_STRING|V_NULL, +// V_NONE it will return error +func (self *Node) Number() (json.Number, error) { + if err := self.checkRaw(); err != nil { + return json.Number(""), err + } + switch self.t { + case _V_NUMBER : return toNumber(self) , nil + case types.V_STRING : + if _, err := numberToInt64(self); err == nil { + return toNumber(self), nil + } else if _, err := numberToFloat64(self); err == nil { + return toNumber(self), nil + } else { + return json.Number(""), err + } + case types.V_TRUE : return json.Number("1"), nil + case types.V_FALSE : return json.Number("0"), nil + case types.V_NULL : return json.Number("0"), nil + case _V_ANY : + any := self.packAny() + switch v := any.(type) { + case bool : return castNumber(v), nil + case int : return castNumber(v != 0), nil + case int8 : return castNumber(v != 0), nil + case int16 : return castNumber(v != 0), nil + case int32 : return castNumber(v != 0), nil + case int64 : return castNumber(v != 0), nil + case uint : return castNumber(v != 0), nil + case uint8 : return castNumber(v != 0), nil + case uint16 : return castNumber(v != 0), nil + case uint32 : return castNumber(v != 0), nil + case uint64 : return castNumber(v != 0), nil + case float32: return castNumber(v != 0), nil + case float64: return castNumber(v != 0), nil + case string : + if _, err := strconv.ParseFloat(v, 64); err == nil { + return json.Number(v), nil + } else { + return json.Number(""), err + } + case json.Number: return v, nil + default: return json.Number(""), ErrUnsupportType + } + default : return json.Number(""), ErrUnsupportType + } +} + +// Number exports underlying float64 value, including V_NUMBER, V_ANY of json.Number +func (self *Node) StrictNumber() (json.Number, error) { + if err := self.checkRaw(); err != nil { + return json.Number(""), err + } + switch self.t { + case _V_NUMBER : return toNumber(self) , nil + case _V_ANY : + if v, ok := self.packAny().(json.Number); ok { + return v, nil + } else { + return json.Number(""), ErrUnsupportType + } + default : return json.Number(""), ErrUnsupportType + } +} + +// String cast node to string, +// including V_NUMBER|V_TRUE|V_FALSE|V_ANY|V_STRING|V_NULL, +// V_NONE it will return error +func (self *Node) String() (string, error) { + if err := self.checkRaw(); err != nil { + return "", err + } + switch self.t { + case types.V_NULL : return "" , nil + case types.V_TRUE : return "true" , nil + case types.V_FALSE : return "false", nil + case types.V_STRING, _V_NUMBER : return rt.StrFrom(self.p, self.v), nil + case _V_ANY : + any := self.packAny() + switch v := any.(type) { + case bool : return strconv.FormatBool(v), nil + case int : return strconv.Itoa(v), nil + case int8 : return strconv.Itoa(int(v)), nil + case int16 : return strconv.Itoa(int(v)), nil + case int32 : return strconv.Itoa(int(v)), nil + case int64 : return strconv.Itoa(int(v)), nil + case uint : return strconv.Itoa(int(v)), nil + case uint8 : return strconv.Itoa(int(v)), nil + case uint16 : return strconv.Itoa(int(v)), nil + case uint32 : return strconv.Itoa(int(v)), nil + case uint64 : return strconv.Itoa(int(v)), nil + case float32: return strconv.FormatFloat(float64(v), 'g', -1, 64), nil + case float64: return strconv.FormatFloat(float64(v), 'g', -1, 64), nil + case string : return v, nil + case json.Number: return v.String(), nil + default: return "", ErrUnsupportType + } + default : return "" , ErrUnsupportType + } +} + +// StrictString returns string value (unescaped), includeing V_STRING, V_ANY of string. +// In other cases, it will return empty string. +func (self *Node) StrictString() (string, error) { + if err := self.checkRaw(); err != nil { + return "", err + } + switch self.t { + case types.V_STRING : return rt.StrFrom(self.p, self.v), nil + case _V_ANY : + if v, ok := self.packAny().(string); ok { + return v, nil + } else { + return "", ErrUnsupportType + } + default : return "", ErrUnsupportType + } +} + +// Float64 cast node to float64, +// including V_NUMBER|V_TRUE|V_FALSE|V_ANY|V_STRING|V_NULL, +// V_NONE it will return error +func (self *Node) Float64() (float64, error) { + if err := self.checkRaw(); err != nil { + return 0.0, err + } + switch self.t { + case _V_NUMBER, types.V_STRING : return numberToFloat64(self) + case types.V_TRUE : return 1.0, nil + case types.V_FALSE : return 0.0, nil + case types.V_NULL : return 0.0, nil + case _V_ANY : + any := self.packAny() + switch v := any.(type) { + case bool : + if v { + return 1.0, nil + } else { + return 0.0, nil + } + case int : return float64(v), nil + case int8 : return float64(v), nil + case int16 : return float64(v), nil + case int32 : return float64(v), nil + case int64 : return float64(v), nil + case uint : return float64(v), nil + case uint8 : return float64(v), nil + case uint16 : return float64(v), nil + case uint32 : return float64(v), nil + case uint64 : return float64(v), nil + case float32: return float64(v), nil + case float64: return float64(v), nil + case string : + if f, err := strconv.ParseFloat(v, 64); err == nil { + return float64(f), nil + } else { + return 0, err + } + case json.Number: + if f, err := v.Float64(); err == nil { + return float64(f), nil + } else { + return 0, err + } + default : return 0, ErrUnsupportType + } + default : return 0.0, ErrUnsupportType + } +} + +// Float64 exports underlying float64 value, includeing V_NUMBER, V_ANY +func (self *Node) StrictFloat64() (float64, error) { + if err := self.checkRaw(); err != nil { + return 0.0, err + } + switch self.t { + case _V_NUMBER : return numberToFloat64(self) + case _V_ANY : + any := self.packAny() + switch v := any.(type) { + case float32 : return float64(v), nil + case float64 : return float64(v), nil + default : return 0, ErrUnsupportType + } + default : return 0.0, ErrUnsupportType + } +} + +/** Sequencial Value Methods **/ + +// Len returns children count of a array|object|string node +// For partially loaded node, it also works but only counts the parsed children +func (self *Node) Len() (int, error) { + if err := self.checkRaw(); err != nil { + return 0, err + } + if self.t == types.V_ARRAY || self.t == types.V_OBJECT || self.t == _V_ARRAY_LAZY || self.t == _V_OBJECT_LAZY { + return int(self.v & _LEN_MASK), nil + } else if self.t == types.V_STRING { + return int(self.v), nil + } else if self.t == _V_NONE || self.t == types.V_NULL { + return 0, nil + } else { + return 0, ErrUnsupportType + } +} + +func (self Node) len() int { + return int(self.v & _LEN_MASK) +} + +// Cap returns malloc capacity of a array|object node for children +func (self *Node) Cap() (int, error) { + if err := self.checkRaw(); err != nil { + return 0, err + } + if self.t == types.V_ARRAY || self.t == types.V_OBJECT || self.t == _V_ARRAY_LAZY || self.t == _V_OBJECT_LAZY { + return int(self.v >> _CAP_BITS), nil + } else if self.t == _V_NONE || self.t == types.V_NULL { + return 0, nil + } else { + return 0, ErrUnsupportType + } +} + +func (self Node) cap() int { + return int(self.v >> _CAP_BITS) +} + +// Set sets the node of given key under self, and reports if the key has existed. +// +// If self is V_NONE or V_NULL, it becomes V_OBJECT and sets the node at the key. +func (self *Node) Set(key string, node Node) (bool, error) { + if self != nil && (self.t == _V_NONE || self.t == types.V_NULL) { + *self = NewObject([]Pair{{key, node}}) + return false, nil + } + + if err := node.Check(); err != nil { + return false, err + } + + p := self.Get(key) + if !p.Exists() { + l := self.len() + c := self.cap() + if l == c { + // TODO: maybe change append size in future + c += _DEFAULT_NODE_CAP + mem := unsafe_NewArray(_PAIR_TYPE, c) + memmove(mem, self.p, _PAIR_SIZE * uintptr(l)) + self.p = mem + } + v := self.pairAt(l) + v.Key = key + v.Value = node + self.setCapAndLen(c, l+1) + return false, nil + + } else if err := p.Check(); err != nil { + return false, err + } + + *p = node + return true, nil +} + +// SetAny wraps val with V_ANY node, and Set() the node. +func (self *Node) SetAny(key string, val interface{}) (bool, error) { + return self.Set(key, NewAny(val)) +} + +// Unset remove the node of given key under object parent, and reports if the key has existed. +func (self *Node) Unset(key string) (bool, error) { + self.must(types.V_OBJECT, "an object") + p, i := self.skipKey(key) + if !p.Exists() { + return false, nil + } else if err := p.Check(); err != nil { + return false, err + } + + self.removePair(i) + return true, nil +} + +// SetByIndex sets the node of given index, and reports if the key has existed. +// +// The index must be within self's children. +func (self *Node) SetByIndex(index int, node Node) (bool, error) { + if err := node.Check(); err != nil { + return false, err + } + + p := self.Index(index) + if !p.Exists() { + return false, ErrNotExist + } else if err := p.Check(); err != nil { + return false, err + } + + *p = node + return true, nil +} + +// SetAny wraps val with V_ANY node, and SetByIndex() the node. +func (self *Node) SetAnyByIndex(index int, val interface{}) (bool, error) { + return self.SetByIndex(index, NewAny(val)) +} + +// UnsetByIndex remove the node of given index +func (self *Node) UnsetByIndex(index int) (bool, error) { + var p *Node + it := self.itype() + if it == types.V_ARRAY { + p = self.Index(index) + }else if it == types.V_OBJECT { + pr := self.skipIndexPair(index) + if pr == nil { + return false, ErrNotExist + } + p = &pr.Value + } else { + return false, ErrUnsupportType + } + + if !p.Exists() { + return false, ErrNotExist + } + + if it == types.V_ARRAY { + self.removeNode(index) + }else if it == types.V_OBJECT { + self.removePair(index) + } + return true, nil +} + +// Add appends the given node under self. +// +// If self is V_NONE or V_NULL, it becomes V_ARRAY and sets the node at index 0. +func (self *Node) Add(node Node) error { + if self != nil && (self.t == _V_NONE || self.t == types.V_NULL) { + *self = NewArray([]Node{node}) + return nil + } + + if err := self.should(types.V_ARRAY, "an array"); err != nil { + return err + } + if err := self.skipAllIndex(); err != nil { + return err + } + + var p rt.GoSlice + p.Cap = self.cap() + p.Len = self.len() + p.Ptr = self.p + + s := *(*[]Node)(unsafe.Pointer(&p)) + s = append(s, node) + + self.p = unsafe.Pointer(&s[0]) + self.setCapAndLen(cap(s), len(s)) + return nil +} + +// SetAny wraps val with V_ANY node, and Add() the node. +func (self *Node) AddAny(val interface{}) error { + return self.Add(NewAny(val)) +} + +// GetByPath load given path on demands, +// which only ensure nodes before this path got parsed. +// +// Note, the api expects the json is well-formed at least, +// otherwise it may return unexpected result. +func (self *Node) GetByPath(path ...interface{}) *Node { + if !self.Valid() { + return self + } + var s = self + for _, p := range path { + switch p := p.(type) { + case int: + s = s.Index(p) + if !s.Valid() { + return s + } + case string: + s = s.Get(p) + if !s.Valid() { + return s + } + default: + panic("path must be either int or string") + } + } + return s +} + +// Get loads given key of an object node on demands +func (self *Node) Get(key string) *Node { + if err := self.should(types.V_OBJECT, "an object"); err != nil { + return unwrapError(err) + } + n, _ := self.skipKey(key) + return n +} + +// Index indexies node at given idx, +// node type CAN be either V_OBJECT or V_ARRAY +func (self *Node) Index(idx int) *Node { + if err := self.checkRaw(); err != nil { + return unwrapError(err) + } + + it := self.itype() + if it == types.V_ARRAY { + return self.skipIndex(idx) + + }else if it == types.V_OBJECT { + pr := self.skipIndexPair(idx) + if pr == nil { + return newError(_ERR_NOT_FOUND, "value not exists") + } + return &pr.Value + + } else { + return newError(_ERR_UNSUPPORT_TYPE, fmt.Sprintf("unsupported type: %v", self.itype())) + } +} + +// IndexPair indexies pair at given idx, +// node type MUST be either V_OBJECT +func (self *Node) IndexPair(idx int) *Pair { + if err := self.should(types.V_OBJECT, "an object"); err != nil { + return nil + } + return self.skipIndexPair(idx) +} + +// IndexOrGet firstly use idx to index a value and check if its key matches +// If not, then use the key to search value +func (self *Node) IndexOrGet(idx int, key string) *Node { + if err := self.should(types.V_OBJECT, "an object"); err != nil { + return unwrapError(err) + } + + pr := self.skipIndexPair(idx) + if pr != nil && pr.Key == key { + return &pr.Value + } + n, _ := self.skipKey(key) + return n +} + +/** Generic Value Converters **/ + +// Map loads all keys of an object node +func (self *Node) Map() (map[string]interface{}, error) { + if self.isAny() { + any := self.packAny() + if v, ok := any.(map[string]interface{}); ok { + return v, nil + } else { + return nil, ErrUnsupportType + } + } + if err := self.should(types.V_OBJECT, "an object"); err != nil { + return nil, err + } + if err := self.loadAllKey(); err != nil { + return nil, err + } + return self.toGenericObject() +} + +// MapUseNumber loads all keys of an object node, with numeric nodes casted to json.Number +func (self *Node) MapUseNumber() (map[string]interface{}, error) { + if self.isAny() { + any := self.packAny() + if v, ok := any.(map[string]interface{}); ok { + return v, nil + } else { + return nil, ErrUnsupportType + } + } + if err := self.should(types.V_OBJECT, "an object"); err != nil { + return nil, err + } + if err := self.loadAllKey(); err != nil { + return nil, err + } + return self.toGenericObjectUseNumber() +} + +// MapUseNode scans both parsed and non-parsed chidren nodes, +// and map them by their keys +func (self *Node) MapUseNode() (map[string]Node, error) { + if self.isAny() { + any := self.packAny() + if v, ok := any.(map[string]Node); ok { + return v, nil + } else { + return nil, ErrUnsupportType + } + } + if err := self.should(types.V_OBJECT, "an object"); err != nil { + return nil, err + } + if err := self.skipAllKey(); err != nil { + return nil, err + } + return self.toGenericObjectUseNode() +} + +// MapUnsafe exports the underlying pointer to its children map +// WARN: don't use it unless you know what you are doing +func (self *Node) UnsafeMap() ([]Pair, error) { + if err := self.should(types.V_OBJECT, "an object"); err != nil { + return nil, err + } + if err := self.skipAllKey(); err != nil { + return nil, err + } + s := rt.Ptr2SlicePtr(self.p, int(self.len()), self.cap()) + return *(*[]Pair)(s), nil +} + +// SortKeys sorts children of a V_OBJECT node in ascending key-order. +// If recurse is true, it recursively sorts children's children as long as a V_OBJECT node is found. +func (self *Node) SortKeys(recurse bool) (err error) { + ps, err := self.UnsafeMap() + if err != nil { + return err + } + PairSlice(ps).Sort() + if recurse { + var sc Scanner + sc = func(path Sequence, node *Node) bool { + if node.itype() == types.V_OBJECT { + if err := node.SortKeys(recurse); err != nil { + return false + } + } + if node.itype() == types.V_ARRAY { + if err := node.ForEach(sc); err != nil { + return false + } + } + return true + } + self.ForEach(sc) + } + return nil +} + +// Array loads all indexes of an array node +func (self *Node) Array() ([]interface{}, error) { + if self.isAny() { + any := self.packAny() + if v, ok := any.([]interface{}); ok { + return v, nil + } else { + return nil, ErrUnsupportType + } + } + if err := self.should(types.V_ARRAY, "an array"); err != nil { + return nil, err + } + if err := self.loadAllIndex(); err != nil { + return nil, err + } + return self.toGenericArray() +} + +// ArrayUseNumber loads all indexes of an array node, with numeric nodes casted to json.Number +func (self *Node) ArrayUseNumber() ([]interface{}, error) { + if self.isAny() { + any := self.packAny() + if v, ok := any.([]interface{}); ok { + return v, nil + } else { + return nil, ErrUnsupportType + } + } + if err := self.should(types.V_ARRAY, "an array"); err != nil { + return nil, err + } + if err := self.loadAllIndex(); err != nil { + return nil, err + } + return self.toGenericArrayUseNumber() +} + +// ArrayUseNode copys both parsed and non-parsed chidren nodes, +// and indexes them by original order +func (self *Node) ArrayUseNode() ([]Node, error) { + if self.isAny() { + any := self.packAny() + if v, ok := any.([]Node); ok { + return v, nil + } else { + return nil, ErrUnsupportType + } + } + if err := self.should(types.V_ARRAY, "an array"); err != nil { + return nil, err + } + if err := self.skipAllIndex(); err != nil { + return nil, err + } + return self.toGenericArrayUseNode() +} + +// ArrayUnsafe exports the underlying pointer to its children array +// WARN: don't use it unless you know what you are doing +func (self *Node) UnsafeArray() ([]Node, error) { + if err := self.should(types.V_ARRAY, "an array"); err != nil { + return nil, err + } + if err := self.skipAllIndex(); err != nil { + return nil, err + } + s := rt.Ptr2SlicePtr(self.p, self.len(), self.cap()) + return *(*[]Node)(s), nil +} + +// Interface loads all children under all pathes from this node, +// and converts itself as generic type. +// WARN: all numberic nodes are casted to float64 +func (self *Node) Interface() (interface{}, error) { + if err := self.checkRaw(); err != nil { + return nil, err + } + switch self.t { + case V_ERROR : return nil, self.Check() + case types.V_NULL : return nil, nil + case types.V_TRUE : return true, nil + case types.V_FALSE : return false, nil + case types.V_ARRAY : return self.toGenericArray() + case types.V_OBJECT : return self.toGenericObject() + case types.V_STRING : return rt.StrFrom(self.p, self.v), nil + case _V_NUMBER : + v, err := numberToFloat64(self) + if err != nil { + return nil, err + } + return v, nil + case _V_ARRAY_LAZY : + if err := self.loadAllIndex(); err != nil { + return nil, err + } + return self.toGenericArray() + case _V_OBJECT_LAZY : + if err := self.loadAllKey(); err != nil { + return nil, err + } + return self.toGenericObject() + case _V_ANY: + switch v := self.packAny().(type) { + case Node : return v.Interface() + case *Node: return v.Interface() + default : return v, nil + } + default : return nil, ErrUnsupportType + } +} + +func (self *Node) packAny() interface{} { + return *(*interface{})(self.p) +} + +// InterfaceUseNumber works same with Interface() +// except numberic nodes are casted to json.Number +func (self *Node) InterfaceUseNumber() (interface{}, error) { + if err := self.checkRaw(); err != nil { + return nil, err + } + switch self.t { + case V_ERROR : return nil, self.Check() + case types.V_NULL : return nil, nil + case types.V_TRUE : return true, nil + case types.V_FALSE : return false, nil + case types.V_ARRAY : return self.toGenericArrayUseNumber() + case types.V_OBJECT : return self.toGenericObjectUseNumber() + case types.V_STRING : return rt.StrFrom(self.p, self.v), nil + case _V_NUMBER : return toNumber(self), nil + case _V_ARRAY_LAZY : + if err := self.loadAllIndex(); err != nil { + return nil, err + } + return self.toGenericArrayUseNumber() + case _V_OBJECT_LAZY : + if err := self.loadAllKey(); err != nil { + return nil, err + } + return self.toGenericObjectUseNumber() + case _V_ANY : return self.packAny(), nil + default : return nil, ErrUnsupportType + } +} + +// InterfaceUseNode clone itself as a new node, +// or its children as map[string]Node (or []Node) +func (self *Node) InterfaceUseNode() (interface{}, error) { + if err := self.checkRaw(); err != nil { + return nil, err + } + switch self.t { + case types.V_ARRAY : return self.toGenericArrayUseNode() + case types.V_OBJECT : return self.toGenericObjectUseNode() + case _V_ARRAY_LAZY : + if err := self.skipAllIndex(); err != nil { + return nil, err + } + return self.toGenericArrayUseNode() + case _V_OBJECT_LAZY : + if err := self.skipAllKey(); err != nil { + return nil, err + } + return self.toGenericObjectUseNode() + default : return *self, self.Check() + } +} + +// LoadAll loads all the node's children and children's children as parsed. +// After calling it, the node can be safely used on concurrency +func (self *Node) LoadAll() error { + if self.IsRaw() { + self.parseRaw(true) + return self.Check() + } + + switch self.itype() { + case types.V_ARRAY: + e := self.len() + if err := self.loadAllIndex(); err != nil { + return err + } + for i := 0; i < e; i++ { + n := self.nodeAt(i) + if n.IsRaw() { + n.parseRaw(true) + } + if err := n.Check(); err != nil { + return err + } + } + return nil + case types.V_OBJECT: + e := self.len() + if err := self.loadAllKey(); err != nil { + return err + } + for i := 0; i < e; i++ { + n := self.pairAt(i) + if n.Value.IsRaw() { + n.Value.parseRaw(true) + } + if err := n.Value.Check(); err != nil { + return err + } + } + return nil + default: + return self.Check() + } +} + +// Load loads the node's children as parsed. +// After calling it, only the node itself can be used on concurrency (not include its children) +func (self *Node) Load() error { + if self.IsRaw() { + self.parseRaw(false) + return self.Load() + } + + switch self.t { + case _V_ARRAY_LAZY: + return self.skipAllIndex() + case _V_OBJECT_LAZY: + return self.skipAllKey() + default: + return self.Check() + } +} + +/**---------------------------------- Internal Helper Methods ----------------------------------**/ + +var ( + _NODE_TYPE = rt.UnpackEface(Node{}).Type + _PAIR_TYPE = rt.UnpackEface(Pair{}).Type +) + +func (self *Node) setCapAndLen(cap int, len int) { + if self.t == types.V_ARRAY || self.t == types.V_OBJECT || self.t == _V_ARRAY_LAZY || self.t == _V_OBJECT_LAZY { + self.v = int64(len&_LEN_MASK | cap<<_CAP_BITS) + } else { + panic("value does not have a length") + } +} + +func (self *Node) unsafe_next() *Node { + return (*Node)(unsafe.Pointer(uintptr(unsafe.Pointer(self)) + _NODE_SIZE)) +} + +func (self *Pair) unsafe_next() *Pair { + return (*Pair)(unsafe.Pointer(uintptr(unsafe.Pointer(self)) + _PAIR_SIZE)) +} + +func (self *Node) must(t types.ValueType, s string) { + if err := self.checkRaw(); err != nil { + panic(err) + } + if err := self.Check(); err != nil { + panic(err) + } + if self.itype() != t { + panic("value cannot be represented as " + s) + } +} + +func (self *Node) should(t types.ValueType, s string) error { + if err := self.checkRaw(); err != nil { + return err + } + if self.itype() != t { + return ErrUnsupportType + } + return nil +} + +func (self *Node) nodeAt(i int) *Node { + var p = self.p + if self.isLazy() { + _, stack := self.getParserAndArrayStack() + p = *(*unsafe.Pointer)(unsafe.Pointer(&stack.v)) + } + return (*Node)(unsafe.Pointer(uintptr(p) + uintptr(i)*_NODE_SIZE)) +} + +func (self *Node) pairAt(i int) *Pair { + var p = self.p + if self.isLazy() { + _, stack := self.getParserAndObjectStack() + p = *(*unsafe.Pointer)(unsafe.Pointer(&stack.v)) + } + return (*Pair)(unsafe.Pointer(uintptr(p) + uintptr(i)*_PAIR_SIZE)) +} + +func (self *Node) getParserAndArrayStack() (*Parser, *parseArrayStack) { + stack := (*parseArrayStack)(self.p) + ret := (*rt.GoSlice)(unsafe.Pointer(&stack.v)) + ret.Len = self.len() + ret.Cap = self.cap() + return &stack.parser, stack +} + +func (self *Node) getParserAndObjectStack() (*Parser, *parseObjectStack) { + stack := (*parseObjectStack)(self.p) + ret := (*rt.GoSlice)(unsafe.Pointer(&stack.v)) + ret.Len = self.len() + ret.Cap = self.cap() + return &stack.parser, stack +} + +func (self *Node) skipAllIndex() error { + if !self.isLazy() { + return nil + } + var err types.ParsingError + parser, stack := self.getParserAndArrayStack() + parser.skipValue = true + parser.noLazy = true + *self, err = parser.decodeArray(stack.v) + if err != 0 { + return parser.ExportError(err) + } + return nil +} + +func (self *Node) skipAllKey() error { + if !self.isLazy() { + return nil + } + var err types.ParsingError + parser, stack := self.getParserAndObjectStack() + parser.skipValue = true + parser.noLazy = true + *self, err = parser.decodeObject(stack.v) + if err != 0 { + return parser.ExportError(err) + } + return nil +} + +func (self *Node) skipKey(key string) (*Node, int) { + nb := self.len() + lazy := self.isLazy() + + if nb > 0 { + /* linear search */ + var p *Pair + if lazy { + s := (*parseObjectStack)(self.p) + p = &s.v[0] + } else { + p = (*Pair)(self.p) + } + + if p.Key == key { + return &p.Value, 0 + } + for i := 1; i < nb; i++ { + p = p.unsafe_next() + if p.Key == key { + return &p.Value, i + } + } + } + + /* not found */ + if !lazy { + return nil, -1 + } + + // lazy load + for last, i := self.skipNextPair(), nb; last != nil; last, i = self.skipNextPair(), i+1 { + if last.Value.Check() != nil { + return &last.Value, -1 + } + if last.Key == key { + return &last.Value, i + } + } + + return nil, -1 +} + +func (self *Node) skipIndex(index int) *Node { + nb := self.len() + if nb > index { + v := self.nodeAt(index) + return v + } + if !self.isLazy() { + return nil + } + + // lazy load + for last := self.skipNextNode(); last != nil; last = self.skipNextNode(){ + if last.Check() != nil { + return last + } + if self.len() > index { + return last + } + } + + return nil +} + +func (self *Node) skipIndexPair(index int) *Pair { + nb := self.len() + if nb > index { + return self.pairAt(index) + } + if !self.isLazy() { + return nil + } + + // lazy load + for last := self.skipNextPair(); last != nil; last = self.skipNextPair(){ + if last.Value.Check() != nil { + return last + } + if self.len() > index { + return last + } + } + + return nil +} + +func (self *Node) loadAllIndex() error { + if !self.isLazy() { + return nil + } + var err types.ParsingError + parser, stack := self.getParserAndArrayStack() + parser.noLazy = true + *self, err = parser.decodeArray(stack.v) + if err != 0 { + return parser.ExportError(err) + } + return nil +} + +func (self *Node) loadAllKey() error { + if !self.isLazy() { + return nil + } + var err types.ParsingError + parser, stack := self.getParserAndObjectStack() + parser.noLazy = true + *self, err = parser.decodeObject(stack.v) + if err != 0 { + return parser.ExportError(err) + } + return nil +} + +func (self *Node) removeNode(i int) { + nb := self.len() - 1 + node := self.nodeAt(i) + if i == nb { + self.setCapAndLen(self.cap(), nb) + *node = Node{} + return + } + + from := self.nodeAt(i + 1) + memmove(unsafe.Pointer(node), unsafe.Pointer(from), _NODE_SIZE * uintptr(nb - i)) + + last := self.nodeAt(nb) + *last = Node{} + + self.setCapAndLen(self.cap(), nb) +} + +func (self *Node) removePair(i int) { + nb := self.len() - 1 + node := self.pairAt(i) + if i == nb { + self.setCapAndLen(self.cap(), nb) + *node = Pair{} + return + } + + from := self.pairAt(i + 1) + memmove(unsafe.Pointer(node), unsafe.Pointer(from), _PAIR_SIZE * uintptr(nb - i)) + + last := self.pairAt(nb) + *last = Pair{} + + self.setCapAndLen(self.cap(), nb) +} + +func (self *Node) toGenericArray() ([]interface{}, error) { + nb := self.len() + ret := make([]interface{}, nb) + if nb == 0 { + return ret, nil + } + + /* convert each item */ + var p = (*Node)(self.p) + x, err := p.Interface() + if err != nil { + return nil, err + } + ret[0] = x + + for i := 1; i < nb; i++ { + p = p.unsafe_next() + x, err := p.Interface() + if err != nil { + return nil, err + } + ret[i] = x + } + + /* all done */ + return ret, nil +} + +func (self *Node) toGenericArrayUseNumber() ([]interface{}, error) { + nb := self.len() + ret := make([]interface{}, nb) + if nb == 0 { + return ret, nil + } + + /* convert each item */ + var p = (*Node)(self.p) + x, err := p.InterfaceUseNumber() + if err != nil { + return nil, err + } + ret[0] = x + + for i := 1; i < nb; i++ { + p = p.unsafe_next() + x, err := p.InterfaceUseNumber() + if err != nil { + return nil, err + } + ret[i] = x + } + + /* all done */ + return ret, nil +} + +func (self *Node) toGenericArrayUseNode() ([]Node, error) { + var nb = self.len() + var out = make([]Node, nb) + if nb == 0 { + return out, nil + } + + var p = (*Node)(self.p) + out[0] = *p + if err := p.Check(); err != nil { + return nil, err + } + + for i := 1; i < nb; i++ { + p = p.unsafe_next() + if err := p.Check(); err != nil { + return nil, err + } + out[i] = *p + } + + return out, nil +} + +func (self *Node) toGenericObject() (map[string]interface{}, error) { + nb := self.len() + ret := make(map[string]interface{}, nb) + if nb == 0 { + return ret, nil + } + + /* convert each item */ + var p = (*Pair)(self.p) + x, err := p.Value.Interface() + if err != nil { + return nil, err + } + ret[p.Key] = x + + for i := 1; i < nb; i++ { + p = p.unsafe_next() + x, err := p.Value.Interface() + if err != nil { + return nil, err + } + ret[p.Key] = x + } + + /* all done */ + return ret, nil +} + + +func (self *Node) toGenericObjectUseNumber() (map[string]interface{}, error) { + nb := self.len() + ret := make(map[string]interface{}, nb) + if nb == 0 { + return ret, nil + } + + /* convert each item */ + var p = (*Pair)(self.p) + x, err := p.Value.InterfaceUseNumber() + if err != nil { + return nil, err + } + ret[p.Key] = x + + for i := 1; i < nb; i++ { + p = p.unsafe_next() + x, err := p.Value.InterfaceUseNumber() + if err != nil { + return nil, err + } + ret[p.Key] = x + } + + /* all done */ + return ret, nil +} + +func (self *Node) toGenericObjectUseNode() (map[string]Node, error) { + var nb = self.len() + var out = make(map[string]Node, nb) + if nb == 0 { + return out, nil + } + + var p = (*Pair)(self.p) + out[p.Key] = p.Value + if err := p.Value.Check(); err != nil { + return nil, err + } + + for i := 1; i < nb; i++ { + p = p.unsafe_next() + if err := p.Value.Check(); err != nil { + return nil, err + } + out[p.Key] = p.Value + } + + /* all done */ + return out, nil +} + +/**------------------------------------ Factory Methods ------------------------------------**/ + +var ( + nullNode = Node{t: types.V_NULL} + trueNode = Node{t: types.V_TRUE} + falseNode = Node{t: types.V_FALSE} + + emptyArrayNode = Node{t: types.V_ARRAY} + emptyObjectNode = Node{t: types.V_OBJECT} +) + +// NewRaw creates a node of raw json, and decides its type by first char. +func NewRaw(json string) Node { + if json == "" { + panic("empty json string") + } + it := switchRawType(json[0]) + return newRawNode(json, it) +} + +// NewAny creates a node of type V_ANY if any's type isn't Node or *Node, +// which stores interface{} and can be only used for `.Interface()`\`.MarshalJSON()`. +func NewAny(any interface{}) Node { + switch n := any.(type) { + case Node: + return n + case *Node: + return *n + default: + return Node{ + t: _V_ANY, + v: 0, + p: unsafe.Pointer(&any), + } + } +} + +// NewBytes encodes given src with Base64 (RFC 4648), and creates a node of type V_STRING. +func NewBytes(src []byte) Node { + if len(src) == 0 { + panic("empty src bytes") + } + out := encodeBase64(src) + return NewString(out) +} + +// NewNull creates a node of type V_NULL +func NewNull() Node { + return Node{ + v: 0, + p: nil, + t: types.V_NULL, + } +} + +// NewBool creates a node of type bool: +// If v is true, returns V_TRUE node +// If v is false, returns V_FALSE node +func NewBool(v bool) Node { + var t = types.V_FALSE + if v { + t = types.V_TRUE + } + return Node{ + v: 0, + p: nil, + t: t, + } +} + +// NewNumber creates a json.Number node +// v must be a decimal string complying with RFC8259 +func NewNumber(v string) Node { + return Node{ + v: int64(len(v) & _LEN_MASK), + p: rt.StrPtr(v), + t: _V_NUMBER, + } +} + +func toNumber(node *Node) json.Number { + return json.Number(rt.StrFrom(node.p, node.v)) +} + +func numberToFloat64(node *Node) (float64, error) { + ret,err := toNumber(node).Float64() + if err != nil { + return 0, err + } + return ret, nil +} + +func numberToInt64(node *Node) (int64, error) { + ret,err := toNumber(node).Int64() + if err != nil { + return 0, err + } + return ret, nil +} + +func newBytes(v []byte) Node { + return Node{ + t: types.V_STRING, + p: mem2ptr(v), + v: int64(len(v) & _LEN_MASK), + } +} + +// NewString creates a node of type V_STRING. +// v is considered to be a valid UTF-8 string, +// which means it won't be validated and unescaped. +// when the node is encoded to json, v will be escaped. +func NewString(v string) Node { + return Node{ + t: types.V_STRING, + p: rt.StrPtr(v), + v: int64(len(v) & _LEN_MASK), + } +} + +// NewArray creates a node of type V_ARRAY, +// using v as its underlying children +func NewArray(v []Node) Node { + return Node{ + t: types.V_ARRAY, + v: int64(len(v)&_LEN_MASK | cap(v)<<_CAP_BITS), + p: *(*unsafe.Pointer)(unsafe.Pointer(&v)), + } +} + +func (self *Node) setArray(v []Node) { + self.t = types.V_ARRAY + self.setCapAndLen(cap(v), len(v)) + self.p = *(*unsafe.Pointer)(unsafe.Pointer(&v)) +} + +// NewObject creates a node of type V_OBJECT, +// using v as its underlying children +func NewObject(v []Pair) Node { + return Node{ + t: types.V_OBJECT, + v: int64(len(v)&_LEN_MASK | cap(v)<<_CAP_BITS), + p: *(*unsafe.Pointer)(unsafe.Pointer(&v)), + } +} + +func (self *Node) setObject(v []Pair) { + self.t = types.V_OBJECT + self.setCapAndLen(cap(v), len(v)) + self.p = *(*unsafe.Pointer)(unsafe.Pointer(&v)) +} + +type parseObjectStack struct { + parser Parser + v []Pair +} + +type parseArrayStack struct { + parser Parser + v []Node +} + +func newLazyArray(p *Parser, v []Node) Node { + s := new(parseArrayStack) + s.parser = *p + s.v = v + return Node{ + t: _V_ARRAY_LAZY, + v: int64(len(v)&_LEN_MASK | cap(v)<<_CAP_BITS), + p: unsafe.Pointer(s), + } +} + +func (self *Node) setLazyArray(p *Parser, v []Node) { + s := new(parseArrayStack) + s.parser = *p + s.v = v + self.t = _V_ARRAY_LAZY + self.setCapAndLen(cap(v), len(v)) + self.p = (unsafe.Pointer)(s) +} + +func newLazyObject(p *Parser, v []Pair) Node { + s := new(parseObjectStack) + s.parser = *p + s.v = v + return Node{ + t: _V_OBJECT_LAZY, + v: int64(len(v)&_LEN_MASK | cap(v)<<_CAP_BITS), + p: unsafe.Pointer(s), + } +} + +func (self *Node) setLazyObject(p *Parser, v []Pair) { + s := new(parseObjectStack) + s.parser = *p + s.v = v + self.t = _V_OBJECT_LAZY + self.setCapAndLen(cap(v), len(v)) + self.p = (unsafe.Pointer)(s) +} + +func newRawNode(str string, typ types.ValueType) Node { + return Node{ + t: _V_RAW | typ, + p: rt.StrPtr(str), + v: int64(len(str) & _LEN_MASK), + } +} + +func (self *Node) parseRaw(full bool) { + raw := rt.StrFrom(self.p, self.v) + parser := NewParser(raw) + if full { + parser.noLazy = true + parser.skipValue = false + } + var e types.ParsingError + *self, e = parser.Parse() + if e != 0 { + *self = *newSyntaxError(parser.syntaxError(e)) + } +} + +func newError(err types.ParsingError, msg string) *Node { + return &Node{ + t: V_ERROR, + v: int64(err), + p: unsafe.Pointer(&msg), + } +} + +var typeJumpTable = [256]types.ValueType{ + '"' : types.V_STRING, + '-' : _V_NUMBER, + '0' : _V_NUMBER, + '1' : _V_NUMBER, + '2' : _V_NUMBER, + '3' : _V_NUMBER, + '4' : _V_NUMBER, + '5' : _V_NUMBER, + '6' : _V_NUMBER, + '7' : _V_NUMBER, + '8' : _V_NUMBER, + '9' : _V_NUMBER, + '[' : types.V_ARRAY, + 'f' : types.V_FALSE, + 'n' : types.V_NULL, + 't' : types.V_TRUE, + '{' : types.V_OBJECT, +} + +func switchRawType(c byte) types.ValueType { + return typeJumpTable[c] +} + +func unwrapError(err error) *Node { + if se, ok := err.(*Node); ok { + return se + }else if sse, ok := err.(Node); ok { + return &sse + } else { + msg := err.Error() + return &Node{ + t: V_ERROR, + v: 0, + p: unsafe.Pointer(&msg), + } + } +} \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/ast/parser.go b/vendor/github.com/bytedance/sonic/ast/parser.go new file mode 100644 index 00000000000..ebb7bb097ea --- /dev/null +++ b/vendor/github.com/bytedance/sonic/ast/parser.go @@ -0,0 +1,618 @@ +/* + * 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 ast + +import ( + `fmt` + `github.com/bytedance/sonic/internal/native/types` + `github.com/bytedance/sonic/internal/rt` +) + +const _DEFAULT_NODE_CAP int = 16 + +const ( + _ERR_NOT_FOUND types.ParsingError = 33 + _ERR_UNSUPPORT_TYPE types.ParsingError = 34 +) + +var ( + ErrNotExist error = newError(_ERR_NOT_FOUND, "value not exists") + ErrUnsupportType error = newError(_ERR_UNSUPPORT_TYPE, "unsupported type") +) + +type Parser struct { + p int + s string + noLazy bool + skipValue bool +} + +/** Parser Private Methods **/ + +func (self *Parser) delim() types.ParsingError { + n := len(self.s) + p := self.lspace(self.p) + + /* check for EOF */ + if p >= n { + return types.ERR_EOF + } + + /* check for the delimtier */ + if self.s[p] != ':' { + return types.ERR_INVALID_CHAR + } + + /* update the read pointer */ + self.p = p + 1 + return 0 +} + +func (self *Parser) object() types.ParsingError { + n := len(self.s) + p := self.lspace(self.p) + + /* check for EOF */ + if p >= n { + return types.ERR_EOF + } + + /* check for the delimtier */ + if self.s[p] != '{' { + return types.ERR_INVALID_CHAR + } + + /* update the read pointer */ + self.p = p + 1 + return 0 +} + +func (self *Parser) array() types.ParsingError { + n := len(self.s) + p := self.lspace(self.p) + + /* check for EOF */ + if p >= n { + return types.ERR_EOF + } + + /* check for the delimtier */ + if self.s[p] != '[' { + return types.ERR_INVALID_CHAR + } + + /* update the read pointer */ + self.p = p + 1 + return 0 +} + +func (self *Parser) lspace(sp int) int { + ns := len(self.s) + for ; sp= ns { + return Node{}, types.ERR_EOF + } + + /* check for empty array */ + if self.s[self.p] == ']' { + self.p++ + return emptyArrayNode, 0 + } + + /* allocate array space and parse every element */ + for { + var val Node + var err types.ParsingError + + if self.skipValue { + /* skip the value */ + var start int + if start, err = self.skipFast(); err != 0 { + return Node{}, err + } + if self.p > ns { + return Node{}, types.ERR_EOF + } + t := switchRawType(self.s[start]) + if t == _V_NONE { + return Node{}, types.ERR_INVALID_CHAR + } + val = newRawNode(self.s[start:self.p], t) + }else{ + /* decode the value */ + if val, err = self.Parse(); err != 0 { + return Node{}, err + } + } + + /* add the value to result */ + ret = append(ret, val) + self.p = self.lspace(self.p) + + /* check for EOF */ + if self.p >= ns { + return Node{}, types.ERR_EOF + } + + /* check for the next character */ + switch self.s[self.p] { + case ',' : self.p++ + case ']' : self.p++; return NewArray(ret), 0 + default: + if val.isLazy() { + return newLazyArray(self, ret), 0 + } + return Node{}, types.ERR_INVALID_CHAR + } + } +} + +func (self *Parser) decodeObject(ret []Pair) (Node, types.ParsingError) { + sp := self.p + ns := len(self.s) + + /* check for EOF */ + if self.p = self.lspace(sp); self.p >= ns { + return Node{}, types.ERR_EOF + } + + /* check for empty object */ + if self.s[self.p] == '}' { + self.p++ + return emptyObjectNode, 0 + } + + /* decode each pair */ + for { + var val Node + var njs types.JsonState + var err types.ParsingError + + /* decode the key */ + if njs = self.decodeValue(); njs.Vt != types.V_STRING { + return Node{}, types.ERR_INVALID_CHAR + } + + /* extract the key */ + idx := self.p - 1 + key := self.s[njs.Iv:idx] + + /* check for escape sequence */ + if njs.Ep != -1 { + if key, err = unquote(key); err != 0 { + return Node{}, err + } + } + + /* expect a ':' delimiter */ + if err = self.delim(); err != 0 { + return Node{}, err + } + + + if self.skipValue { + /* skip the value */ + var start int + if start, err = self.skipFast(); err != 0 { + return Node{}, err + } + if self.p > ns { + return Node{}, types.ERR_EOF + } + t := switchRawType(self.s[start]) + if t == _V_NONE { + return Node{}, types.ERR_INVALID_CHAR + } + val = newRawNode(self.s[start:self.p], t) + } else { + /* decode the value */ + if val, err = self.Parse(); err != 0 { + return Node{}, err + } + } + + /* add the value to result */ + ret = append(ret, Pair{Key: key, Value: val}) + self.p = self.lspace(self.p) + + /* check for EOF */ + if self.p >= ns { + return Node{}, types.ERR_EOF + } + + /* check for the next character */ + switch self.s[self.p] { + case ',' : self.p++ + case '}' : self.p++; return NewObject(ret), 0 + default: + if val.isLazy() { + return newLazyObject(self, ret), 0 + } + return Node{}, types.ERR_INVALID_CHAR + } + } +} + +func (self *Parser) decodeString(iv int64, ep int) (Node, types.ParsingError) { + p := self.p - 1 + s := self.s[iv:p] + + /* fast path: no escape sequence */ + if ep == -1 { + return NewString(s), 0 + } + + /* unquote the string */ + out, err := unquote(s) + + /* check for errors */ + if err != 0 { + return Node{}, err + } else { + return newBytes(rt.Str2Mem(out)), 0 + } +} + +/** Parser Interface **/ + +func (self *Parser) Pos() int { + return self.p +} + +func (self *Parser) Parse() (Node, types.ParsingError) { + switch val := self.decodeValue(); val.Vt { + case types.V_EOF : return Node{}, types.ERR_EOF + case types.V_NULL : return nullNode, 0 + case types.V_TRUE : return trueNode, 0 + case types.V_FALSE : return falseNode, 0 + case types.V_STRING : return self.decodeString(val.Iv, val.Ep) + case types.V_ARRAY: + if self.noLazy { + return self.decodeArray(make([]Node, 0, _DEFAULT_NODE_CAP)) + } + return newLazyArray(self, make([]Node, 0, _DEFAULT_NODE_CAP)), 0 + case types.V_OBJECT: + if self.noLazy { + return self.decodeObject(make([]Pair, 0, _DEFAULT_NODE_CAP)) + } + return newLazyObject(self, make([]Pair, 0, _DEFAULT_NODE_CAP)), 0 + case types.V_DOUBLE : return NewNumber(self.s[val.Ep:self.p]), 0 + case types.V_INTEGER : return NewNumber(self.s[val.Ep:self.p]), 0 + default : return Node{}, types.ParsingError(-val.Vt) + } +} + +func (self *Parser) searchKey(match string) types.ParsingError { + ns := len(self.s) + if err := self.object(); err != 0 { + return err + } + + /* check for EOF */ + if self.p = self.lspace(self.p); self.p >= ns { + return types.ERR_EOF + } + + /* check for empty object */ + if self.s[self.p] == '}' { + self.p++ + return _ERR_NOT_FOUND + } + + var njs types.JsonState + var err types.ParsingError + /* decode each pair */ + for { + + /* decode the key */ + if njs = self.decodeValue(); njs.Vt != types.V_STRING { + return types.ERR_INVALID_CHAR + } + + /* extract the key */ + idx := self.p - 1 + key := self.s[njs.Iv:idx] + + /* check for escape sequence */ + if njs.Ep != -1 { + if key, err = unquote(key); err != 0 { + return err + } + } + + /* expect a ':' delimiter */ + if err = self.delim(); err != 0 { + return err + } + + /* skip value */ + if key != match { + if _, err = self.skip(); err != 0 { + return err + } + } else { + return 0 + } + + /* check for EOF */ + self.p = self.lspace(self.p) + if self.p >= ns { + return types.ERR_EOF + } + + /* check for the next character */ + switch self.s[self.p] { + case ',': + self.p++ + case '}': + self.p++ + return _ERR_NOT_FOUND + default: + return types.ERR_INVALID_CHAR + } + } +} + +func (self *Parser) searchIndex(idx int) types.ParsingError { + ns := len(self.s) + if err := self.array(); err != 0 { + return err + } + + /* check for EOF */ + if self.p = self.lspace(self.p); self.p >= ns { + return types.ERR_EOF + } + + /* check for empty array */ + if self.s[self.p] == ']' { + self.p++ + return _ERR_NOT_FOUND + } + + var err types.ParsingError + /* allocate array space and parse every element */ + for i := 0; i < idx; i++ { + + /* decode the value */ + if _, err = self.skip(); err != 0 { + return err + } + + /* check for EOF */ + self.p = self.lspace(self.p) + if self.p >= ns { + return types.ERR_EOF + } + + /* check for the next character */ + switch self.s[self.p] { + case ',': + self.p++ + case ']': + self.p++ + return _ERR_NOT_FOUND + default: + return types.ERR_INVALID_CHAR + } + } + + return 0 +} + +func (self *Node) skipNextNode() *Node { + if !self.isLazy() { + return nil + } + + parser, stack := self.getParserAndArrayStack() + ret := stack.v + sp := parser.p + ns := len(parser.s) + + /* check for EOF */ + if parser.p = parser.lspace(sp); parser.p >= ns { + return newSyntaxError(parser.syntaxError(types.ERR_EOF)) + } + + /* check for empty array */ + if parser.s[parser.p] == ']' { + parser.p++ + self.setArray(ret) + return nil + } + + var val Node + /* skip the value */ + if start, err := parser.skipFast(); err != 0 { + return newSyntaxError(parser.syntaxError(err)) + } else { + t := switchRawType(parser.s[start]) + if t == _V_NONE { + return newSyntaxError(parser.syntaxError(types.ERR_INVALID_CHAR)) + } + val = newRawNode(parser.s[start:parser.p], t) + } + + /* add the value to result */ + ret = append(ret, val) + parser.p = parser.lspace(parser.p) + + /* check for EOF */ + if parser.p >= ns { + return newSyntaxError(parser.syntaxError(types.ERR_EOF)) + } + + /* check for the next character */ + switch parser.s[parser.p] { + case ',': + parser.p++ + self.setLazyArray(parser, ret) + return &ret[len(ret)-1] + case ']': + parser.p++ + self.setArray(ret) + return &ret[len(ret)-1] + default: + return newSyntaxError(parser.syntaxError(types.ERR_INVALID_CHAR)) + } +} + +func (self *Node) skipNextPair() (*Pair) { + if !self.isLazy() { + return nil + } + + parser, stack := self.getParserAndObjectStack() + ret := stack.v + sp := parser.p + ns := len(parser.s) + + /* check for EOF */ + if parser.p = parser.lspace(sp); parser.p >= ns { + return &Pair{"", *newSyntaxError(parser.syntaxError(types.ERR_EOF))} + } + + /* check for empty object */ + if parser.s[parser.p] == '}' { + parser.p++ + self.setObject(ret) + return nil + } + + /* decode one pair */ + var val Node + var njs types.JsonState + var err types.ParsingError + + /* decode the key */ + if njs = parser.decodeValue(); njs.Vt != types.V_STRING { + return &Pair{"", *newSyntaxError(parser.syntaxError(types.ERR_INVALID_CHAR))} + } + + /* extract the key */ + idx := parser.p - 1 + key := parser.s[njs.Iv:idx] + + /* check for escape sequence */ + if njs.Ep != -1 { + if key, err = unquote(key); err != 0 { + return &Pair{key, *newSyntaxError(parser.syntaxError(err))} + } + } + + /* expect a ':' delimiter */ + if err = parser.delim(); err != 0 { + return &Pair{key, *newSyntaxError(parser.syntaxError(err))} + } + + /* skip the value */ + if start, err := parser.skipFast(); err != 0 { + return &Pair{key, *newSyntaxError(parser.syntaxError(err))} + } else { + t := switchRawType(parser.s[start]) + if t == _V_NONE { + return &Pair{key, *newSyntaxError(parser.syntaxError(types.ERR_INVALID_CHAR))} + } + val = newRawNode(parser.s[start:parser.p], t) + } + + /* add the value to result */ + ret = append(ret, Pair{Key: key, Value: val}) + parser.p = parser.lspace(parser.p) + + /* check for EOF */ + if parser.p >= ns { + return &Pair{key, *newSyntaxError(parser.syntaxError(types.ERR_EOF))} + } + + /* check for the next character */ + switch parser.s[parser.p] { + case ',': + parser.p++ + self.setLazyObject(parser, ret) + return &ret[len(ret)-1] + case '}': + parser.p++ + self.setObject(ret) + return &ret[len(ret)-1] + default: + return &Pair{key, *newSyntaxError(parser.syntaxError(types.ERR_INVALID_CHAR))} + } +} + + +/** Parser Factory **/ + +// Loads parse all json into interface{} +func Loads(src string) (int, interface{}, error) { + ps := &Parser{s: src} + np, err := ps.Parse() + + /* check for errors */ + if err != 0 { + return 0, nil, ps.ExportError(err) + } else { + x, err := np.Interface() + if err != nil { + return 0, nil, err + } + return ps.Pos(), x, nil + } +} + +// LoadsUseNumber parse all json into interface{}, with numeric nodes casted to json.Number +func LoadsUseNumber(src string) (int, interface{}, error) { + ps := &Parser{s: src} + np, err := ps.Parse() + + /* check for errors */ + if err != 0 { + return 0, nil, err + } else { + x, err := np.InterfaceUseNumber() + if err != nil { + return 0, nil, err + } + return ps.Pos(), x, nil + } +} + +func NewParser(src string) *Parser { + return &Parser{s: src} +} + +// ExportError converts types.ParsingError to std Error +func (self *Parser) ExportError(err types.ParsingError) error { + if err == _ERR_NOT_FOUND { + return ErrNotExist + } + return fmt.Errorf("%q", SyntaxError{ + Pos : self.p, + Src : self.s, + Code: err, + }.Description()) +} \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/ast/search.go b/vendor/github.com/bytedance/sonic/ast/search.go new file mode 100644 index 00000000000..bb6fceaa7cb --- /dev/null +++ b/vendor/github.com/bytedance/sonic/ast/search.go @@ -0,0 +1,30 @@ +/* + * 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 ast + +type Searcher struct { + parser Parser +} + +func NewSearcher(str string) *Searcher { + return &Searcher{ + parser: Parser{ + s: str, + noLazy: false, + }, + } +} diff --git a/vendor/github.com/bytedance/sonic/ast/sort.go b/vendor/github.com/bytedance/sonic/ast/sort.go new file mode 100644 index 00000000000..0a9f1455987 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/ast/sort.go @@ -0,0 +1,206 @@ +/* + * 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 ast + +// Algorithm 3-way Radix Quicksort, d means the radix. +// Reference: https://algs4.cs.princeton.edu/51radix/Quick3string.java.html +func radixQsort(kvs PairSlice, d, maxDepth int) { + for len(kvs) > 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].Key, 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 implemention: + // 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 PairSlice, d int) { + for i := 1; i < len(kvs); i++ { + for j := i; j > 0 && lessFrom(kvs[j].Key, kvs[j-1].Key, d); j-- { + swap(kvs, j, j-1) + } + } +} + +func pivot(kvs PairSlice, 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].Key, d), byteAt(kvs[t].Key, d), byteAt(kvs[2*t].Key, d)), + medianThree(byteAt(kvs[m].Key, d), byteAt(kvs[m-t].Key, d), byteAt(kvs[m+t].Key, d)), + medianThree(byteAt(kvs[len(kvs)-1].Key, d), + byteAt(kvs[len(kvs)-1-t].Key, d), + byteAt(kvs[len(kvs)-1-2*t].Key, d))) + } + return medianThree(byteAt(kvs[0].Key, d), byteAt(kvs[m].Key, d), byteAt(kvs[len(kvs)-1].Key, 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 PairSlice, lo, hi, first int) { + root := lo + for { + child := 2*root + 1 + if child >= hi { + break + } + if child+1 < hi && kvs[first+child].Key < kvs[first+child+1].Key { + child++ + } + if kvs[first+root].Key >= kvs[first+child].Key { + return + } + swap(kvs, first+root, first+child) + root = child + } +} + +func heapSort(kvs PairSlice, 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 Pair.Key is NOT pointed to Pair.m when map key is integer after swap +func swap(kvs PairSlice, a, b int) { + kvs[a].Key, kvs[b].Key = kvs[b].Key, kvs[a].Key + kvs[a].Value, kvs[b].Value = kvs[b].Value, kvs[a].Value +} + +// 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/ast/stubs_go115.go b/vendor/github.com/bytedance/sonic/ast/stubs_go115.go new file mode 100644 index 00000000000..37b9451f08d --- /dev/null +++ b/vendor/github.com/bytedance/sonic/ast/stubs_go115.go @@ -0,0 +1,55 @@ +// +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 ast + +import ( + `unsafe` + `unicode/utf8` + + `github.com/bytedance/sonic/internal/rt` +) + +//go:noescape +//go:linkname memmove runtime.memmove +//goland:noinspection GoUnusedParameter +func memmove(to unsafe.Pointer, from unsafe.Pointer, n uintptr) + +//go:linkname unsafe_NewArray reflect.unsafe_NewArray +//goland:noinspection GoUnusedParameter +func unsafe_NewArray(typ *rt.GoType, n int) unsafe.Pointer + +//go:linkname growslice runtime.growslice +//goland:noinspection GoUnusedParameter +func growslice(et *rt.GoType, old rt.GoSlice, cap int) rt.GoSlice + +//go:nosplit +func mem2ptr(s []byte) unsafe.Pointer { + return (*rt.GoSlice)(unsafe.Pointer(&s)).Ptr +} + +var ( + //go:linkname safeSet encoding/json.safeSet + safeSet [utf8.RuneSelf]bool + + //go:linkname hex encoding/json.hex + hex string +) + +//go:linkname unquoteBytes encoding/json.unquoteBytes +func unquoteBytes(s []byte) (t []byte, ok bool) \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/ast/stubs_go120.go b/vendor/github.com/bytedance/sonic/ast/stubs_go120.go new file mode 100644 index 00000000000..bd6fff680d7 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/ast/stubs_go120.go @@ -0,0 +1,55 @@ +// +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 ast + +import ( + `unsafe` + `unicode/utf8` + + `github.com/bytedance/sonic/internal/rt` +) + +//go:noescape +//go:linkname memmove runtime.memmove +//goland:noinspection GoUnusedParameter +func memmove(to unsafe.Pointer, from unsafe.Pointer, n uintptr) + +//go:linkname unsafe_NewArray reflect.unsafe_NewArray +//goland:noinspection GoUnusedParameter +func unsafe_NewArray(typ *rt.GoType, n int) unsafe.Pointer + +//go:linkname growslice reflect.growslice +//goland:noinspection GoUnusedParameter +func growslice(et *rt.GoType, old rt.GoSlice, cap int) rt.GoSlice + +//go:nosplit +func mem2ptr(s []byte) unsafe.Pointer { + return (*rt.GoSlice)(unsafe.Pointer(&s)).Ptr +} + +var ( + //go:linkname safeSet encoding/json.safeSet + safeSet [utf8.RuneSelf]bool + + //go:linkname hex encoding/json.hex + hex string +) + +//go:linkname unquoteBytes encoding/json.unquoteBytes +func unquoteBytes(s []byte) (t []byte, ok bool) \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/bench-arm.sh b/vendor/github.com/bytedance/sonic/bench-arm.sh new file mode 100644 index 00000000000..b47d6278a0e --- /dev/null +++ b/vendor/github.com/bytedance/sonic/bench-arm.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +pwd=$(pwd) +export SONIC_NO_ASYNC_GC=1 + +cd $pwd/ast +go test -benchmem -run=^$ -benchtime=1000000x -bench "^(BenchmarkGet.*|BenchmarkSet.*)$" + +go test -benchmem -run=^$ -benchtime=10000x -bench "^(BenchmarkParser_.*|BenchmarkEncode.*)$" + +go test -benchmem -run=^$ -benchtime=10000000x -bench "^(BenchmarkNodeGetByPath|BenchmarkStructGetByPath|BenchmarkNodeIndex|BenchmarkStructIndex|BenchmarkSliceIndex|BenchmarkMapIndex|BenchmarkNodeGet|BenchmarkSliceGet|BenchmarkMapGet|BenchmarkNodeSet|BenchmarkMapSet|BenchmarkNodeSetByIndex|BenchmarkSliceSetByIndex|BenchmarkStructSetByIndex|BenchmarkNodeUnset|BenchmarkMapUnset|BenchmarkNodUnsetByIndex|BenchmarkSliceUnsetByIndex|BenchmarkNodeAdd|BenchmarkSliceAdd|BenchmarkMapAdd)$" + +unset SONIC_NO_ASYNC_GC +cd $pwd \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/bench-large.png b/vendor/github.com/bytedance/sonic/bench-large.png new file mode 100644 index 0000000000000000000000000000000000000000..8a8785ec9adce4954f5d507c5e7032ea676907d6 GIT binary patch literal 87463 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

vC;enj&_?Y$AW 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 Giz#Dn{ZL8R^MWW)f)^>9oQz_3H*>-EN-ht*h(P zZCBpjzqN6*!l_g3w@H_20yiFO5#AcGN$-qCd2zdUwxD*u>}Z{4g`b}J?$@;>vf;{m5O@9x|aRW}*BRBvh~dgJuw`@1KH2mAfLcZofW5*s`c zH=92kYjWn?x$NEC|9%Z5taMQ+{MVP~-O@q-5DppXh`@k=Q%4>>eoV1nXd69!7}a(z zd_zCt@#B{)-T(eL_dw^PpF8RQ{fc|3kQ?yt*W#hQ1t+s+pM?N$(X& zQhl^UlH2SLp(@K0r%!LWcI_JJkVQ+t*EhO`;iVpl`MGWvE^LdDc6LayKW1jOZ@4i| z!kdnUCedqop7ba@+ef#~Ws83A^N}p=r7R4DZLpoJ%(-{@Iouw|qIQ_T~Q5X_1F5zh=12nk^Wg zu(LZzPD%Uy1|?@QV~p;(*IJo3Ib>W&Q-4O&+rGuGs9~X5SUw4RPg7A)GaEhPkn@Zz zU0mRqr5QD zeK>wc*yv4(VI}|mkN&e$AL$C2+OBEx?VEbpEj!1rSztTAosLu&CFcK-S7k$nUH|cf z65;8VA0O|~n5-;L3z?F1b8UuJ7kXU}EcdRj8Wy;Wk4(FDx&0aIIgvt%zm+_aE=O+A*yw!PAwDxDz^LLXH z=ff^iRVdf6iqD^i_Pdwe?Gpcp=Af}>&z{ev zK0d@&UH#37t!g^l5YuiY?%?PcC1y^0G3k8qcWa@!rt#d~hN=FKWFF?8BP|DZ3TPd* zu@S;`9r2iFj!`J}UX7G-6(W(5kySeCU27YeG`QB8Yn$$rm|s9vmYQB-(KT^NPp|Gr zeYAF|_Yotym71CwzU+c~bc2c2WC0e$nY4o@ap0!AjPdy*GehmRk-Q#afX3p=K$NYT;Jf%;Bd zPJ#32CDXS@jvR@ZELjf0$7*_Zf|7xOp({17y0%u#K;`Py{SrObdGO05k*qEe$KdnO z{BV1_mV<*sQ0EOQDym=;H#fIR_o&Rw%<}T``wt&}Tz24V@j(YVH zQOca@w+aJMf3@4*=oh-I49l-Sd+}mpYU`QPr%xw}+ifIGj9=8!I_2OXiWPbE=+QP# z&hu?)`q&7mGamfhYMM0cl2Z>x4Ghk6{rEYo5-WQ;K`|IxoxHoi*)g5ssH!SGjuS6G ze_(U7nz4z=ujWLm`X`4S)3>V2@ADn0IK(t)U8>gUl_fDvYVS?rdDWlioWIY9acta^ z_@uM5*V@uJ&|8LseFs$ik__Y&X0HMGmsa$PF7lEZ|JGm^zUBO$+if$F9`__ z9$H_UTn|#PAFK?)XaCBTF1z5?M^pNWnv|FJQv!3FG&9NS)-r%Xo< z?B8$H@z%6*Qsv0p_7iugMZ70lQ|j{d{cs z5>1+#UGnqhJ~~d>t9uG&XJ)QX7B93Hx~9*bI2c_oJKt^+&M@GyFfmlT(3AS^MLBPr z=Ld2+*|Hedo@E}^*cWLqHV3g{?<%j6ZzrG}qd3+ecYcf7(bz&O6nMmmz`%5+sF zYj=o(tMj_q$&;I?n1rri-wMsS&yQ_sAC$}JRdsn4xHp2IkMG{fisx1;s?%rA41_6h zicBcjbq$${N9RvhvMr$&KIL*ht>NWDdvA+Ec?9ZT{i56V>M&086Y_H{7b|bQ#1SoE zpUqic>GPx0GxiG#qF!5DC}m_~(llK!@>%yrts*Vosh=>p>>D4yOEHwQ{M8M9}))V z_HDBV1lGHV{V2iE&3pbSX^ic7-IK$Ccwgmxj9a#BxpnJShGm-&t|$t<<=C-f*s0qx z(xc~qXfCR%9y2o9RqU})X_l3V4RhwqnMJ^gYhPbS+28cU9uCsZC#qaUh5bPJ7FrHz z1sxq$G4qBiKkA|?HClaEM-3}|#nE_f-P*{<$Jd^186hG`wmeF)-1^zI$Bi<>^$7~c z;LoOn7fDGEQOa>{-GF>jiu616fd^|Ngek|!OL>$+?56sTk!%Xb#oZSs#`RX8qc{2j zUQSO><0sj~0_0YIUrac%y1JUFB~bKdB=!67F!_ABZK2D!q{H{kabELL)1DCp&7(w> z#Repx>h0SsS+gh)mAEC$;#SP)v!!cu>5BK8Gfk9;{$XK}6861Bhk=ptQ+0J2R={i7 zg{Nt}$m+DQ@pH|)6Fc}XF~`m2I}QhtS)%T^&3xjGN!>6{N+~LOit{P$GIsS*>1>0H zmcUL{ajR-SI=NE-)2Ot2czGRhJtd0+R1>A^-bv;R^shSEy&e>nl^x~uoI18JaCZK3 z$hki~9+O8NJa|A_)<0@*Z~x-uOIESF1|H*wU#i5>wl6e%0XUs#xzm$z!MIOU4z?2r2V z!4R3Qz|>YBS{Bh;PoJ{$gncV=bHwdAhrjHOo!g)^K{l3^n_9p~)W5~0B~?|`_gJj` z`}fBK!&lndE@yvhpl?yIo;Po;S5;S6XI?%hX_(jj)-*8eJLf?o(%rjvzkmOp;V^Ut zhvNF^o7_e8t6vW9kA7Dp%4*G0%9}x#1W*K4O>$o4NTa8lftB6nJIoL8@fi=*gzwq6 z&sa2yKy<;`yL=W3ds(u)<|lg_`O}MT)|(AR+m>J{ZUD|RpPs-)d#^9|vWeZ;DX3GP zqLEtt>C@%8k=7sL4?lkFL<4*=i?<=2-&MRfnXjJ6r*FpsOaB6>MnCrZTRj^^p1Z_V$nU6ghnDR=Gl zstV&#s;;l!%gy~^aY8{+(Ou86j&WGQH!DrQusKD8f5DjNsAEYCzl20v520(($l5u%cY7NR=`)d zfuQQ@l+h>yf`d(o(!4YacJ<-k;Z#?46zin90i_EwIS?a+EVR(6AYWk}d3Q@%q37^oVkkEY#rAtW>u+v`Z> z4^wOxPVM^zjRzWN{DC@MjTqECw#2LiDbHB#4$u=0{_GcW8L ztXfmTMP>{5LS#bYXOtbx&9b6^VcCYe(bNj`uK#{%SjZrC^GV8^wbunw_fSb6Mnouq z2Lh%Xt_fwAGG37dksG{8(CfwdPFu2NQ5Oxti@XDO8M+vPD!k>1mw=|BC_q^R$yNI!|anLzNom?C1J^5q>u9FRc!X*LqW@6F|!!$b;gP8jr zHk2$+6lxc{A4cQ+=uanRR>%A{D=V1H06aICOt9TBkcVZ&4kg$`(E$wP^tp3~L%Qug z(o{Br(ajYw1_BLAWyVR`-%L;nRRcwcTVF9JN)P(W`0s#}xzV=9Jbf7yYSeJ%th?Bb zl_0E$00qS-^+Ua`TY!JNp@{v*;};4*O2A9Pip! zcH^~v;o}biFzrvB|E3fh`O$og6%4_>`-1+ z_2sSU*@&p?5uzURR-svCao&G^@s(Om6gd4lj@l1x0l>xYHY3rqsc%eC>5=u@=0Ipnp zBvWwQdbHE8=G!=3BK89cgOR74)z?bZzw4Zk_P@gyFLW{pt<7bCZDx181iioN! zrlu@e^<5?#?8eu<7yBtA>fdxPD<-oOx17~hBgrtI+4j#5OAfm0BW>I~JgMP7dx||= z6X!0Fg`T~wjv^|8lMPJZ!!l|n^EGI^BP*$G%bgKVm%q^6Nkv75ZQG7&YqOY|npSeW zrS+qv6aUjU-kEz*N5_KQkN=C0v||YU(+DklO*J*+pzd?~7zK56oTMhsm0r@7x>?W? zr@^a)&Ua-`V|UweF4Xm?s3?Ggi{MvkY7gwq4WK*ZqlNGtQT)5-SuD?wS2l*6|0t5x zc||n8j?q-}{kbbyGM zcfzf|WT1vlwNJEi-1onIy9vZ~exm!VqT(HTg>0*i2WXG>D~tBIO4q9(MZWi=dt{<{r zM%3(YIL3|3l~J^MC zO4#;TJ(AJ;wf04-Ddy?ZI&7#TY3Ifznf$zF!aX=_|2+6sL*FvAMxD~2YSmj3103)~ z!q(t`Il(3-y%%I~CM&REfav<6+JG+G{itJETWa)SK;em#^U~wwbr3n@RD1YxR)fAVwyOl3f!<0yx>oQR77F6P zE$9m`&&P~3KTCZ1vOq7azNSX>{7i_upw7F4AzYGnWs59hlkY_i+S|n)`QaTd1_BOB z5J4kg@jN-XddMPeR^$7(K3V>8$SFdjSMy7UzYVNtTXp3%{oH6R&SvN}7j8eM_Ge*I zWqob6JJ52Eh)7f3hw;eEmts1)H0(Y7-}mJEtu8xbKd>IU+SlA;6sJ0Tbpd_iORA=D znVh5jpWnZp9`SgLDi{_KVczvsm|KlYO4zZ#2b$2*aOJngM!97HD1)NL0gw+Pm^bJx z7viFhpEwcRTYPs*yt_#K&{Ru$%N#8JoiuyerMYo3n}N}!-pnaH+$lb`JG|2(TGU;>#pn3p>1BaDq9?iFl@$&1|=L- ztIC|tD6IV@U)+%tkL|B;@?;pK-piMFQ|%P!15b6zPxeL&z4Th^@`@Z(&B5W3GI{v?`*oC;O0(2(3<&3C;$2RNh$*8 zb-8C<`?3$TTf6AG2)ZxV-o1MT3`@Eq=e}fHYL>-r)X%YENlZ*6lxH^EqA;u>WD_@V z?Q!8dRMBgMjD>$l%PD&b_5cW!c}uctr1HK?X?njz!M&`TpyqQQJ{*n(&9Uk@-do}& z5~cjwuryXhZfT>h;p&K{kl174eLOrL^9HughjhCg2>$%}LMR)veh3aW+o+xoxH5Dt z<{Q2yu0!9%uT*b?Msgmcz1MS=1_nVAlqGCgz0CK&6Mz5u;tx_25#`-l++6H3uES#l z5tUuu`zfd~OBILZ2kCU(A95Gt^YS7)vdqct01{@)8C6L0+9S`NJ*zZoU&?W(4=b4H zcI|!RaOaYhl>k6&uE+G=xyjzRq1uRxmo8Njf&wzUjUYfu3Bl>`#;Nd?tmV0qJOiz3QtF_SAnwrnLsJx52%@2Gc3P8#cM;Cl$ zaW-zf4)3k(Ps<@`KXA*Q@*Z#NxO@y_ORvxRkzc=lVUxe83El^s7b-imIlX9RE5XkO zKrDWbw4&N>78Mn3$9@4k@;xHNBJGqsd-3}CneUs0+J@%Mdw%RkLp-gbQgy|l+xA00 z-uyBI#*GvdGv6%J=~-Crc38P+uXnn2NYUHwZxYlzdFj&Q%!bE>x;FW@mAJfG7K;H5 zsaX#Npd;D!m67c`_vA|57?}s}{O1#NEPjLjobCYx){Ty?Wis@94_OpFUgGO$(7k&D z=JLxdMuz-jpkq>8J}V;m`S~jlF?fM7AlaA<21eTyd>Xpf4=X_hf&jWBv4h()-a@^^ zUP_oHU#|OI#pUxf!oYnCc&N-|(MPx&H>h$Kd#(=#w?5h737mFDtctzPOssTu+&0y# zusIPbLm1jVh>E1wpF``j^6Mu+e4ydkMKxWDMj>&7)!;T9u*0FS^QinEb;G>eqO zo>a|r7oX}KZSlv*(TPl7Gk(pn){W3!>#^G?6ieu)_y7+fnz>ALZMk03+zlQC@_q^* zolV?o7X;;>Kd++rd}?T*7`yRe*?N_m+d0aFG%=$U4*=*1^5DuyP~%@ZeYN;Opfi7+Z|13G&gVMK^j|VQ4WFw zWEr-eOIWuoNI?*8gP7yN6>wMGi;p>5JE~Bt^Tv`-$`Q_&Los|j+1Wa=qPefS5GyaJ zseSk}Hwxvy_-wIFcR|>L2WqcgORt(=x$;8f*e|R|(eLK7Sj6e(v%*sHZvw&o#caAH z3FV}ww)XVdv$K-#`NYK^_pZ(79+pctxXb>2sGw`Du9N-t;0NmnA${42Lg!BF+)R%J zn=@z6F0D@b5Ilg`7O|iXFPdY{aYsCd+T;ud1x^e?L-=sNV5E8Mi1q$+?OV2G6&Nz^ z*g@%cFpFl&$m#OBE-|vQ!VN3>fL&Rh+v{zqck)n_GPwI+fBjlS3Z)o+3ZXl}?&)7y zn)US(tMQn~PiiJ*qTQ^(s^Xd~nxzHnhSGu^14$ar0IQ#{5-%GYTP^Y0MQ*cbCHI@$ zHf`K^(5~-jWhj@A_T66q%TEqlD&pXddzINc44xON5z)eYAc1_Rml?yq7zB zXR74a=%j;I1Ok^#lcih24x-1Rejrwha=T&*Dce;@aTS$PgYT7?SVmvJci-qhQl{g%>5P zQVuVg8i6Lh1?};QfTdjjRF@GIimX zuePYHp0O_2Ieip-6@8N%Pz8D!A@QRuF+*gqEt;kO)7pN63twZ5$hgy@VPSM^t7b?Fd*_*`Q%B398anbZ=&{-vMr5df#kDa-u-mDb5Bh?O4o4iJC~lUzIg&EI zR(CN39-Y2Z>6Q%P-D03TxD%DQ(J*)Y?O$WTgV-d}zA@G-D8G93N<72ouENN3NcwQ3 zPJn>R8foy%F02SG5SF7kVVS? zTiI;#-kb7lHH2`o)bG!A6&*f2*Sqx&v@JAu%64;pDcj~us8Npvv^TWd{+e;>d?>uU zwmd0?)&j9O^_@+O45}GK83mvUw0P(%1y&{d9P-)4w6`-=&-G#RLecsR$PPAh5IXq>49*!~@@#mVEv zBwCMi_yGAU8kk5#Tb-J+)5)=NYx3^UcK*|dGJ}%}202~eL*c=02VWjVki!w zBktAo*FPF(W}wuRm8cFSK34oxUq6IG0k}Y93EoO&2jqgBA>R;Iup5=lJkD!pbiE?> z5`jvwn&2u~#uZzER<_X4486(iafo^*%$yL(*TEYxm=HxV~40;B(AzZrB z9LeDVtU@Rl!~S=xcf43Us-Q4Z05Af(m)rRS955(ZjRg3qsHho_+f0lX)oL}6X?92t8;BYY|+?6_;GlQyM=_(zD1keMf&5^YCQ3B2V!Jg zU&0HVsKCEa3q{I76n=UPZQ$#MLJR!AEBmbYY2!2fP|F*!$|ACCk{{?U9%5nek zV?`aECm#02FLE+2%IL-aFTa=m?l9oYHmrX&E)@4I<4222gwpu1$H=VtCBxpr9@kYh z!(Iu!&V{u9{~4nC-r}Qa9MSbZW^BFGRaN`(pG23uqt=&`T=L>ma){tfsiwxh0siew z2;~fK&OemhJ#>-ntDgQ<85MiKBvI_kSJ97trk!|w$+DQMPI`lGYU_y03vbnbKDk}y zU$3$*)$oe-#XVs)y$fPYGD_7I|G9>dGo1$>BOf)bf5xe8H{|Jds~q;qX(ZxlqxzUnrSn!SU906>Ha}mOF=C1v}4Y z-omMyJ9c+M8g6u5WU+=JWezwA3I2Z}$1B4YTBc;dG5jw1?Zb4s3CTh<3YI1`*3072 znH^U61B;(Jy_mErMyYG@?_`UQ{RS%UJPR9D{)^NJV1%-L-P29g%?B42pMVf{wQ zy1kt)%$<`3Q7~_3NZas8O17`w4+v;EhUy8Zp#~-Ct>Qk_T#at)!fTo!7DmQN2 zsEZWwgO1*vXamO|h~T+uf}+s+ZGZo^ZYGV^ES)#XPbHfIC~Znt zT?h-2phlEjo_%U<`pyHaNb`-}Fmv*F2HvO~EnZ)&g^sWvqAyzWrPNmDr|x1$^#Pp; zWf}32E~hW&6qjJE)DBbx<}dVk5Rm~R6~2Y>&ImA-rsUzfxpQ5JwS}Va!-qTpL7WU= zTo!>5rD-U;8quA%(FGdrOZ_b|JvI3lTb4;WPjj zyAB?_4`_V5L=h9FF(U!8z z8=KSgWjNiw)1$L*ISMJ95G;UDUc!O!J(8z|cLA=0)=7`F27n^7m>D$)aNf=y!e-VYqTw1B~DJjpePbfK*62@N^0glwMItU(R>-ZJ`(8g;Rju`L?8^_ z7hwj%)F&eVGnfTsJ7qbqO01K2wX-0EW`qK=U*dd0X5PvIi;sZU@EKQkW{Z_MQ))z1)M;qDL3pFn9~NjI4v>mXbU=y!ktrx77q2LqOZ z*DPH8TP^(k9W1@urPORiu?&b0W_voJjw;V?x^Z?^h5tUHlTab}KH<>+UoJfV-%tnXZ!t#Gwa>TtuFL zMfA#ML~R~Tzwf~zCN3YQ&QpIb@Am5rKvyEx-wyFS+s46BkD3E%BMDZI;t~Ir7IkD_ zY69qaf{q<3`;WzX;J^XMB(=Zjxw#zttSS;)bX8vpti?C@zs^ zs*=t2Gfogeo**6o){|q^hcl}ah|3@ zQ0*WXksk!wgE&_Ky(mcT&qEctXHYT_Tw%+4i)~sDlUNIN8zS@}o38fj21F@T`=YgB zY_%F0rYK2!Zrtq&f0~}Jj#>!j5jq)y3D0qSSAMDZIHV7J=*&}0dqXI;lRD>097|rJ zUuW39(~0|urEc4&l=da8Ykqdtaj7kAD$VwjP25>03Cpk4AR9QBL|_u+lF$>0Qw6z= z1YnH&z*V|fA*?6&IrfML0~c2#ik==rH|#^#sKaduN_3Bf^mR-bF2k)~TwWG)|9v%L zrf{NwP@W>*qetp_g}gt0jxw1RzSbaOj*MU!gcEBj?yRg#O{g+h06G%!-6x0cLOi?$ zg+Cncd|kisA^J!rWXzY!Q6G>^17Ep9M3Z!Lg5u-jQ$@w%(=6dZKqjy)U487m`lktu zxJ+)j-Z&G&pDpe!q}94p4&*oq2VKUrh?gOjUb{OU1zJH!`0;i4xj&KBLPRhNJq8QA zUqGPTICC32yE0@?B*lI_*0r%uzm%AQ;*rB%`#sO6H)Xka7RY6HX%(7Sjf}k9TN7LXBJpKB;i+YXohU;^NL1Sf6tHH1v&IWqq8A}`StDk+bIIW4wX!Rve zsL#Z7Sc%ImkBJch4^|1AI>Yrpn$oTlR_t8Jp`iLYx^E=nwcuNiw=nJl)j?mhE=n6d z4X2xknGkZX+thnX+;+l4Gp*TfRu|ddT9-bm4;(;9oM#^kTplRD`_7{Eo{)Y4A|Xe? zy~#Y3N%L#H`sh8-d=)t;|FcmCK<2;0!9YFeUA<3bJ1WI?*kU_Dp^!f$>K}3sQIKY$ z@ltu3&i1c}-C9X!WiOnf)R4#2!sy;RSKI2*>lR3nuUGE$`j%=OLyug<&k*obVV@-` zqH`0mNAwdY1Xe~mJJ3*a4sN{qgSscdmIi$<}~!v716IHukYo~ak~H9P3SDBlqjHxw}iqKz84r6 z{&Q_zF_`rvRBpm+g7JjLm;s3xIhFeIyNtnWJs0)1ZQF({QJlzf=P~;m0RfWg5|6J# zsrdy>8M{`j2Gxs1NHljtLVlzbPRtY-7#MH@JqcObQ*PWi1>flj@v5jifk+zirV*eP zEL~5iS=!9AjTZ}%qw@yII-FG{WOzvk{t@X_V*o?~cf!O#7vw}fDkznS7H$Xp%`Xs@ zn!kL}4{_rc6@35)Fiq{gNv75!5FFx-vw56PfbpyWONq0Gc+^2KY(9w~JyanY)i_??t zJ;zVf+TQgw*96X^*RMxgo9 zFbv*Ii}*NV))Sce~DRp(2-T-KYZSBH;6L^=@}vqFv;MLL1A401RL#UT2u zoAUw8qvU&QNIYH~%W5R3K&=lEBO_bhG^J_amZ&p_HLu6Ml=AxXZk2Au2VJ?$BD)zt zFyVDkQPToOVG_`J7eF*qRCOX=hv*veN*j$n z#~(v1@D4s2q2+mc$|kAAnPERYiii+H!OS&(6Z`Ch|65#>Sz~NHLPH4Qpz_^@q}PNX z161&#HPFQTdrv7}v}WR;LGL+(T@Ah4PF@+REx_Uy?5WEzpo^wHP!Yifs9A536vTE_ zLM;hCmss@1JgXxQF);922rcv(3#PNfjl;nbJw{{gnZ%q0?2y^HHbcVEQTK2Q9#uso z8<{I&1i^4+fQhi+u-$6H`BBK6Cc0R%I_eFpU+4C|}C>*EY( zud}rUm{ZbmUIDJhvHA5@_+DUu9u4XX+KiEClvbgOAUu)15W1k+QqZzjgR|-FTYDT4 zK_r(5xCo&OTj6#ULCc6c1IA(x%NG~|T5OOelPck*!rlXf`hg7y`SB+1yqHBxa^QRx z;XV;%8Mlcu;@Rtaje84_pfo_0T3RSwuSe#Lw9IOX_R@!3DcP8%Wy#7+ZPEJLGSN40 zQ!ydS2IX!CL^M(0bZ74x3(PARkF>lh0trIQwXyvvpPXDQZ|wCC?eET@)6fieXfln; z#(??}G6)N4adY^d+l8brxN z0*%6`x7wjRfIh-&nr%B1PHCtG!&$v8NNy^}NQcApoBco~Oqy?dj7%3)KK*MvSNuoH z4-aVnH%5CZ=1Qj4enG(@V0<&|Pe`J-035=eJgGq;K&ndq;!9<+u`NG|jX&zGh2cXJo2RgCr4o$-lIBq&w;fO?`!d&uy+%Q#;p&138YDn&}2G zRS0*M$k4+b`)Ysu)=sZA79OW$KM>;-9Cn|hKrkF{7Sh_umfBYxD$Foe7r9t zUliX8ZFa{D^bRTuIewg%cvsz9_1uxI8w^-<=J9lw#gIzKDJ1e z>A)0f(&9*JdZfIM9Fa_@>Hn|EfZd%+!{?>;t=Y`ND`>FhFe0GIR6XW_KYCH*RSV!*zZMSe(f-?YyH<^c>T2)MdPDsN@ytr2?hjL zMFEBC4DjCN*my*!HXoxgD#YI*rT}t#tusf^waebWwr&oUH^Zt!l)x@Hnr9JBugCT! z7~Qqrz^?&cn#!O#U7FA0>*Sv#&XjBReg z_1q?ziJQ)L=}4)OA+n%*%{d53St5c3XYvy!;PgYJ5Jchd1x~L`Tmcptz|J*CeGF&l z21pP>D4&QnAbgt7K6|HeUqQMO*OAC7w29z~!P?qd{60zuQl$Cy-J@dJA2(T0$>8^p zoU317vtT_Dxx&Fk%@r}5rP#QU+3!oip`$xq(N=6aoG@$pk5HO+vNK9~Uj>64GSUB^ zjFef7K9ozo0bKwFq4`wbdx++5O{!?u{WGIpQJ_)eupNoXA8bEcLTx%LT&#ZJ#vV{X zZ46%}B;+GxOO$iu`<`QStRMnRbP$Lz^o)$;M^Wi8glLBLim>~ABHb|e`ci6DA~VOZ z%tHNx7*lg|Mg|78SGJ*0HVz$ngt3u`8Hj&K@UmfMq7f|+$n30nzx19%hqh<1+K_J8NJ+`KefxLOqpf}Fo?!zw zpENDKB~)k?Yc0pN=i}_BttuFtbzNMktnJT1!|p zK*b1)B&Zc5i2{;ViGemfhOa<5B%#=!LIMJZDi2M-oIij+dCQ|(5#s@1CWzllwZ6t! z*XVs5jSU+%Y^J3J?XAljikG9g%0X2Rf?GF!YW4X)`gvKt;L6Ghv}JVbZGSBr4K;On zZ*MR2(|e1o|6_+rF?8SCJCcLKjS#>RV!4D5oq6jQWDdUyW3sX3C}dO)TD2eK`9w3n zw*mrOErg)<9P4P2R5l}Y4WX><$gsYL6d?s6Q}u_{|0K!*tir0i+-ka*>qC?abD&dj zUolF^2u`PrUMpokuyOS38xx=*#kd^sVIs8a7@6b_YDJ6`Do2UlhDw68#wVDZS_t+4 zS2J}Vd|OmhRI~P_v9WO|Grf486|t!SG$NN24KG60N7I1OZE|ol??}E}_wzC4qPB&( zbFKd+#B-xhvua{ zan$k8G)f23x0pv`QZ!cFa%i)*FM=86HPgDM#H8s%R~DqHj~s zu;wuZ!ZyUjUL~%I$lILSv%I{FIP1!t^pZdKK!Y7I(C`4v9!;lUX_d}Q?sf&?` z03#%Z5lvijmS0+sk2rKLeML7-TMh&L|02Rc|9j>Gtq5(I)6&fVM&b3;FV zFyMSY(4yE(P5lB&60};<{3;y~(uG$(j_IyI-0;P(b{AyVHebM$ckamA=YKvoRA zRyQ=bxLHBNMV2)$kbnRF0E{6Zy%Q`QQY>>R-QXP39^pUdPhxF3&8=FK-djO|)n>oECQ&v4XcdwHdRh5stfT@Q)!@)FlL19@?3rdIe1riRMo z&e~z4jCJKd1QYrKkqxQh4(uGLZW3m^8(!JaCCb{FQVmYCM= zL`Lrukv~cL1}jAoHWT)b8RR#iT0T=VGlxIFuMuKuSxL)9*fr>cL(sThz3m}*EMiZK zoxN+w^B)OvxBU8gH?k)<#0jraQWsg`v1^GDx7P;6Par5U4HABX(Xr&CzY4fk5R7>aa3HMO*>rHv%LgP!}X^CbbOjUfcDuyH9+Ht$V8Xv1ol7Oc9YxC+qbWsr z!ypcs#}F?wyjR^z*8W(=ULV*p_~ALKR*1|**%i@g3^8n&Kj)3@RtE`s%hs*WZF@_I z8*N(qm>$~~%G|hc!OjE3;?bFn@>fypf<$DaG{W@nu41yJsxoTvx{yMavIx8Euw$m< zExrFNU0T{ZV(Ewo9Zak+lssQ_d6ppvGlUt`g<%d7@(VZ^akq%44{V~^nPK$)Cf_JwB|u%pqdLqt%$rtndW?x6%u!VVLsx{*8=;01 zALQmHDzJYd<~bbaQ_?)cm;L@f#7NS?T5_kBtKQ|bMn4@T-Ij&P1enf$Sg0yf7 zpJ3y_db!`2;NblAGdw)OiRH2gy;MLs-mzoIyZUw#;ih0@`vkguYWDWi&WMy=Q*_lI z`01OjpftwMuIZRouEAmWFDyA~y?gF9f!(B@|AXDuLyKiX15czrGIzqVu^#a)~qN_b`hk7h?ZBoxX&VTe$;@mmC!fQgBwTbUi?-)pIJACoL z=?(TwCpT)FMGh@cmO4gCg-BA9Q#%?oR+(^?4?8wQNyT01nQR>PY*@+|uV!&C=5#MM z(D4lP_4U>9>M2xApl4F$;hx#vT=>A#%j;R&==fJbJHRC_?5O4eU7Wa6flptyT0o7U zx|Z1~5(ruEKVKGQ>U`mn)q+BoM`xCVUh2(tIj3CwASO99FL1t7 zUN%2QhMvA@y!x6WOcseR*S3II)KQ5qdTu2VzrOgP4nw!|2e;_hqEq)du1Bfemd#G zc?E?%N)8QF7RQ9gIx#RW{bLyG5@^uO8xWIL!T|OUHrP`vCqj!;2C=l_q<9eI+LjO-Xi;3cL{W! z*u8u9U~P{DE$3wR>TdB{1Ym!_I$1gU!>!QIx`dZwY<^)OH@a2Oil3Kww;Q}%5j#JH zoR(qZ3qP}R`~n~U*R$cBT>AhkXE(G3IGUaBd|Y!;)&JauRQ@ksKQ!y#~#?72+r>FPg9ro`KyZ^oJ>Y?KaO#zLq zk2<;b(9^5#{jo`1jKc4|P5dpl9rR(tO~0I6Lixi!>g%CQlDgK%j8&@eiQ69Cui7FN zGj5{XVsZEoD@}_iw_jr|7>9D_ZH5ey-rZK~mbQCkTu6(PhI8t0AuzZxAR zC0~CWHm<=J|0gSy;A-G}JJIRxTuR+h8?4BK=1)w|4I+nn6_H({#CO3l6ZeoAcA3Pp z7kd2N$POR+V4`Q`$fr5Om(>x3*r73`Dzx^H8;;Eoj^mMhU8V&+iO^G zfL^tD7RH|B!%khwe6oPvDg@X6y?IU3RZP=kthpNA3c2N2Tryb3YR#> zvTUw73mW<7z%AT*djrxw16(g#byjab^j=?e1r1d2Tr7>p!6U-u$o+jT_3@vtl_ zAddw@Dq|t+*zS3a{BDnJ^kJ^X21jYmK_}dPuckvT?Yjn!12VUW&Id{Ee*g8;L*8jD z01pPviIH%?czXyHh-1>m`K(D{RVn|nHukB+20@^p!YKbiA-z0bh@|~K>&sl|I{~12 zpThVx%zF{XGlGSl2hH$vuB{<*wnm@>?YXvGgtTJsf-RD?&CICgvafF6=qOdZ@qNSd ze{H!3wAZP~I~_RscG|^vKGf=XCdkk4hXeiT%1y-t`vcW%)D+MacOdh43Xhgb)djC< zh&>XBv;xn*eH5gF@HsL6P6Z+Mn6WYUlS9{xb3=JFiYZa6bPo#0v*PI{w^2L|TR)}3 zM)1dze|GWnQ$ag#wrGMxi;bQMW@G=O8Bq`sJlFt`iWPP`$rmcdb6_%J+_)m74P!yX zxE`U_Ks4M=>qce1P~X^C1#6`VaYaxF)h?gv`@5MXY}g@wh+O`#G4p9aHDf!iLoME) zjI_A8cJ29_b_ z9DMKThB`}g5DykWAcz@HRbrE{DTiiahdDaP_yf~b-I+$)W!~XJ_dPuAsTei>Mz=vH z&u%xo3XCKz>QX#Yc`A7WA#VHoy2N9OtUBIqLY{+|+tiQwd$|tF)=^cnu~1Xk-^d#I zp@E`9tP0_;~V%W;%jSarts8*Z_arW(7j1J#2Rgr zq?co*ows72VYHLJmJ|=rL(Fmz4$ci5?ioqG@U6bGW)4)3YVK8p-FA$iij`p}P9&1gpD%HH4u_{?rDsIu-*4+sOKk;8_QxFb94#-ss`F-YH3!y628aFq zNqSR7ZawPDHuW1!`;d8(^q3bwnED13RcaEE%^~(Pp1M*6flve%DP(KRERX}+GQ?FZ z!P@PEwTnBqE7t7?%XB0jxbP8fAUo}I=}-;+#+P(3I~09PG?q6TVeHvvSE*&jd= zp=HY0gI@dmj>=>5Zfu^LXA%ipmx$&eX-gs*c+F|}2adJF|K&oD0N1{v*@M3O&Hg4MB=D;a z!c31{BiTw z1u<{m=;jVUk0YKrkf`ATGhGB3AfyzxLrtItP{R-u!HJL@paIow)>mjK`FGpqKhe~v zg8gm(t9dV>pTHg5M1o7f%D7Lt4Dl&{Jldk&dJ;OowJ$HpNZzY+nt1388LTow_V0EH zk<6OJ@YxNBSN%xCyvMpD?n#8(2+IxhELF4(Z2~v(9B$&#in<;IZ@2{oY4FIbDyWi# zdP(?wc)PsutYwU!JZrT`tRPvGJm8ag7tZl^Ni!uLhR36P)K6Cw2Zw|Pll@KQ?j@ghP8yqH9 z9rt$-NlZu#3TSwca>imWvM@3E!&K@=@=L+ZE&rp^Dl;`j()=b8`aR4r$fU#E-|>O07Vz1j?X4KHkLNtc)ojFa+y;>p(W#>@Ge`;?xGrP?8cj|7I+3< z+`FyVMI>K-%`~DCM9O(d6Ei>9XYJNZ3=A9m-uogMV9%wCBXWM6eSWQzzi%gTCea57s~fq zPe08xQ|msyS!^Io>p&G~o}$jTKm3e>l9EhudWG?O_*-{C_xli^W6V8*o{4F@gWfCG zGvOfPMuy@>Vql#Ph6t=6W}rr;D_8cw4w{DGb{sW9NQjnHK5UKtzyxoCXeF3zCn8T! z9}@ENm;v`bV#iKlOe3Jt!zDa_enP?7AN6`#9!D?Jeuc|DpJ1D#C_H1bPGq(K)f#qj}I}1ihg~u-@hr(-h{vz zNZGsxDCq|cLHkUASlN!5A_!1Tmt%7hwfgLUcSR#=uLNF;22?|qV=2R zEA;_X@=73Le>@QK84OS~q$&{nZLF;K!1cAd9{;;G%2fbBe&aUwBd z>n3FGyqStsyyhD3tFSn(*|lJ3W`tLR!aX%N2Q+s>=Z%X8rJ%e#7bq}tB+V)AyerZ7 zM|%?mb53r`Ik7kAenxw}AF5j9)b!zZ84wr`4-g3t(0V z<8;z7wCDp6q(H8n#h3Bft1o`qD{Lo`(6l+;n1)s=nJ>NBBKvbYwToCf@oBkjD{t7) zJ^$bN``G8L9HQZ8HU%q^qnx|cpg~obE8%O2oCkHyo|^Z#M(z2kc9+yC*i zYzaw4TNIi|gN7s}8AYO@iAZ}VBOwiyq>PG^C@CfF(q2Y{QrgR`R8|tc&m*q;zCYvl z`~LIw_&n~<^|&s*JKyK|I$y8jc&?+oNh{h5<&3lFg@WSNlWZ)1dUpLCroHh0DtGhMxB7n*)dll@>PU=$ZF+JFB0$cTT;a*Nj-4jD-C$sNBM9L!9QZ2XTcUJ?Cg z?5Snf(CB%r__Tkm>*|io$qyw(DEJ)*~NEw)Go z$_1b6l}bAzc1~M!X(v6eFn+XWC#GiD_dE-WaDQ}i=B2^*KL7C_l9F-cF*7q`xOk@b zlvVqIDseivM26)F`QYz~_?C->)?{hg!D|s~ zJfclEN@KWKkfCe-^G9xfblv9hf3KmTKZ|$t+VhYBWfy%-4SgQEp}dEDT&9d;T&ayS zBb4K$_(g3(9{BsW1b7`ksJy`b1&>yGjoy5$=9w8yEge>c>J~*)?>efUS*xM{l0Kkd zL2>>0r%UAsy7ID6(jPvbWj?H_;TB9kFN&Y9ltA5t>=6Jw@;PiR>Lwgr!P}DV{a9Kq zTqz`SONYJ*yIgVZb}z40O!5Ae8*O?{_3I|7Hv87_anvtd<-Twzyl3m?LW!J>7UqE7i7$;-p=(o8`S)!Tk6=9U#Onp{@Xmq`*%-9v z1Dcd)B8HaZ-_7%F-06!29C|V4rn<6M=KT2_j(WKhCFUM$O>?H|Xz1@0UtvlQ>Cc~Q zlLKY*RHizt7aKktouH=ShL)p#B7Ql3sB_37EA+)2%UM>lIqE0Ta&g}upez)wAaYCM z5nG}dedol~i1X*w;u3ewF!VG`F`046|NWMjS*}-=z2<-@tAN$}1UPW*dZ z9Wybui*1#H0uOqU(_3z4wC99?Up;_FIL|}W0ku~NN{lquciZxZ!IaK~1;BkT#PlXJ z7{tXW!Febhc@<48fl<)2LzV3dogtz2*ju~gJ+`$z5kXHI-fF$TdD17}W-C)QIlbng z=?vVzB-92zvH(ZJ=F2NfpymjLeoOtZSdRXVDwpyIl(J9CJY{A<5CiP6>tTJ+SC2rh z+Rw+&Xf7n0f?8S7ZT^9Qr3*uqeQ^%%RN_7gcAnG^z`NM7eMJf(36sKg9!GLv>sjVC zyyw7jj{4)PpUnI@HU@7J8(#7QJ7T~BsO#&WAMplv2BOs$_L-=Z_mTBBy~v|d9@}AL zG#%S0&hDTJ*5u658e<5p??Y{gGkQa^{X<*%ZU9OpsAkLWqJQb6<8})`1khazE@ba`M$)h^5`Ho~qvQh|PZM=+819vwE+3_X0Q#pq42G0dgGWb{7f^SsZ2{ zZ_LoSsh+i;8T-C_Ro4UW*gy|S8(P=90 z;!X>ajYxHDa2-*kulIX=MY5$N6p56d5Twy5Xz>n`Y>7#|3WwX+yBpeLaRZ;AjsO-ei{ zODds9!J2Y`4u{Gpimod+oCfNs98B;@xKOwd=a+RleS7$m6>xOiJNRE$XS;qbos9i$ca4A)Ig^ZM1yuU#IjEa(6rP@(dz2XWy!0VyWp z#px_x;;ySAs;Yu`tjlk(DNEpy8fY|Mg3|XsA#WOXy}Iyj9uv82M`jWv(&CK z)L-FQXyLgG^@MM|29TH1alylpAPdzlE5j{gdIplyY1E0}b#wYYycaG)wxY4&aa>@i zfgIF?yP}5A!Md#jI*f=(OLPfSr%zXhM3P~kB|BBIZD`ksdEq}=fIgjOV;!`7(2Z1B z|4P9kS@UaTAw3#&w%srZltD3rOskXF$52bv~=;{-eUTF}|#`_oofd~Nl%HxpX7VaGvt?+HOw zMJz=Vk)3b^@5vA}aSLQ+IVm6<^6XOxQvA(%=b78bHUUavqpl2%NkG*Y^wglM9b#cO zV0`d}`C(?N0zg*5SRX{2MB5qMXxNn&9bLO`?_L5k%Aq>!OKnLt%A5}Cp%!rO($doM zVf3e6_%tnbb>CeE0;v-xh}<%k({3{%{}fQ-wiVlBV`CY-)08?+Cl%0pSX``NP^7ot z)T@^(zrS_uh$P%{;RYPJ!Pz~N=<;Ed8N{BgSbxd+dg^`aY9(y#X#D9@AocXQdG#nS z%3ZJ_>VQuM;TGJe;Gw-6?@9fvO7D-0%41#yu1WoT+`X@nQo{+eAl);;hwsF)35MH; zy$~`6_$qac*kiler!k~t0Eo37?axdh)ibC=EYZ}$2zh4DERkDmTpS64fMH6^mzjfo z!JEjCl2pGjhi;PdY$F-@jSQ``tRP{JFm91+2T`XKx$YD$=O18 z;vgqc`|Suh@nHy!$+iiL;u&m*w3h%?ac_QkzTa9eNgvBOdnmG?*fPBXNt(CxZtnc& zj9g!Ur0x=s8FA0w!RtiX90<`Aq-?!r?}iF*oKjW=-?n7VcVS+Rs-Z1dHgCq@r%z?j zsX8H-2={LU+l3?c%`Qr=zqir#=cwCCSjng~LaRRr1fUB>40YV5A*_vsix+FFWim0fnYW``un_H(sN?)TV*G9=J;|t25btwk%I64)N z{VLcUgPspQ7F<>!$^uq~Y683g9q?@v!hzHi%j~V28?i~h>XGtVYirwQXU(h%LfNQc zSCxzqBP;MCo{+x`AsT6Iia{B|QDF)pGy)|jrANH8uiwUlcmKh#RRfG(3cr`Gsc8r_{=!R_PQ$)Co+F(dV~#y#1a~R@@OS3}5iyXKm>2u7xbMa8 zMFzD&2;>R$1lM&hdGWPZJ3mfn1rkRLkrUD}F}GkMP7ul`Zn$koK5PN3n3E;uJ_gAV z1Jh%>#HDD&MgU9grS+4dEtbuTt=nHd$-!3cz_W=U@!j`^7)(l?i2|56@1sB1(GV<}*?;sQ%FFa@GNu$JgKc!nGx3o!BckNmh6p(%UUL9P?TL5!HBOp7t zlpK_vsvw{oWz0-$FFX$+wqns&PL=y`t>4B3 zb>s(?bGaiS&YDOJaJ7}7Z_tMwhnAJ7cjq6!P*9?6>AMoqFAeBqiMY7)Nc7_PI?spJ zNe9fi?3+YHFhgcN4n;xF4weI4K7maO;i5(=W0O?&M&22dv&C9HMkO@{ur!VXs!eiZ z|HL}HheyWrxD{6#*(tU!Hf@{t}xI*!lm(6u%V_PvrLyeqpPovWc>%z)HS|bZ^P>Y z1(7A>x$b+x3y_!+^)|y$*)n5tnUq8;_uRR{SS*lm=ZFsGu0xG-_QHkJc)^+?toQBf z!Vyu_`{~8`&rN}lGhKL7I1zZ~;b}$r+p*g-E$%mtrzs|U_I`^EtqS`?|5pha8K~TI z9~;!W+ZL;;0Y4ym_rVl};3cvgSWD&BPqeW$#-X~QJpfh$Dk`u!!T%@(2npTGBweSVL;nfE zM*r(3E|-bDoY?RA1#htxG`wUrqG}FWKa&Da4xDJ}07G*2M`iF=NO%pcv0Y!U3aT9HfNg35133-44+|tUkmHy@ zSD@qYlh6i+#OAEiuG%P|k*DSZ(|aFKY;4BsVbvq@9)efM!TAAk5<3DN8N5*buwuNk zusJDUB=W>M>Rzsdg-Z{bAT*wN{R_i@osqC94_p_Q+9SmBp>@t#r?yF>pVS2q@HYYyO8HO z%fm5~J-}|~_RQ9!aw@9bKT}T1Z{E7~!i$wA*axvMtwWeRbo2In-ZrBjr#arArN3*J zKN?n4z}Fu1+gwBKh7U#9t9C@_bEhgV1r22fuNVd0V{fipx@7oGHt){v{K*WmEHfou z?q9j(@dI7)h?zUrq}qu`JV<)7lhedCu=-OHWLdieB5m~y9v!j$TaGNK*^ICP?1pH=fSEEt7&4j=tSR35;$W*Z%Q?QRbqS;U*-ojm z0Fli!0;ItP%n?Am2(%5n!J7Pvi9sb3faDg$+B{-2*)HT1e}9=Nhu*qkPZ=RMudoRJ z>af)UZ|$+=lDq+Ugm&`O2sR7I%}|XX>k5zEP$mBP{*|mG>0Tr^ThL$I`k%k-m^J&mQhAxXbHWxUKR-S&MbJ~tNJAd25@bx!nqiFr5tPiI znNqWdm4W?1`!8?CQ%d{E)JJsDisPxwK=D2M~?wwjTPgp=10QYft zfOXmww;%VnVS`lcg;q9vErtkBlPHJr0@W9qulH`6XdGWvb%|rhFHWTO*-Tr=JTU^}kM((Z<*R&`e!+>f| z0+XRUT{Xk@3U7za2@oHQu&}V&wuLf(zUZ@(2@3)^C(k~4Jvaa$s2G8uq5puO_x)Tg zjCnmgu@aQoiAI<`S6MExe$qGy9pk;qN=g6LlPt&c)lI+lbZKg25|aB~_8%lR8CMcn z$$!e1F2sc{q|tp}@5cB#hQT}iXSMV!wX=w-ZW24Vsl`7rYnhB=@Xhkz(NfR#AY@m* zU~7KH;$XT*6j&;e4M40{Mi(3KVbk<^kabo9{Lj|?Y+Blv<3TTAhwR|p>d*J3LeJJ2 zptHu6GQPjhd;G>WOI&jnb=`96s&j>VVtJOZNG|Ym8x>6=t4@j=w5BwOMJqh1bXF`X6)XV>rVW(-nDCvgZy( zW?2SqI@K@xaqjd<=Qk#_ZjGDps8)u< zi66^QUJuBUGq{eeAZowim`Zf*gpFBM3_EfQR%`aXSi1cNnmL@k+D5&(jd7y4I7?HSvO?v;+J5!T`0qMHP)kUAC`CmP77=j@$0TVg zFcvDU*&cFv6u@^SCitM&K<18~k?mrrYbX;PMwywY-*M&=egb+ptGTubbzjOwp4l~9 zH+L0+^oDC4m|q~ZYG7H>7-^yAaA^8Qk}0B~QHG=8hyx}&h59ybZgHK)})L) z%Ib%{hd>l9L9dCB0N(GuPfNzNSwPIC@NKzaKUH+XM#D|4|OmP)lPtkSr`;&e;YerKo0p&OU|m88fS!}=?GGlphAm71@cN=Psg>S1!YQ@~A`1##c#4oE`jx2I%Ao3` z`XR7c5CttvPZ}s2aclelcw;Jq5NHqpq&AtMi?PH>n1^yd{@Cwd)b-<`klaaR@!}~c z&3s*X=n*#!;}L@#)(%p>Qu-{-AZM{nB4l5X1efo0<90`LE<_C;J{}R_82nw zdI;G(Y$-;WtPF7R$tZR!fSfHqGV02x0h49Sp$S5HH3!3i@KxZ2nrQdxUI|dva_h6u zZ#MBe z%flO#>3s(e^sVb^AZ3AjYYF|seQ?*Aq5w-MDs0S;;dmJRlN!%Wrh_o5&ca7j0o?`l zR)={kqzoFD*W_*=`+BmVLg1?34SkH@KDxAZHaTtV7>yK#ON|Z~uas z&J(yocL#)qYJuW8quDLheq{Xp?Tx&>9|Asd-_`+=BxP37&#!#6x{#x#JXFrfh+hd) zKs*x+;u8R_X`*+a-~)j3fOa~OvhG)JQvs_fwXD!}pm3f?AUm|6z%3{}X{AFOKh&`m z=oNi|paxy-gl235;;YSm4f70nbaL;t4q;;uBt7yrJ`{QZ*j;C--F)5&;FtVA7?WwJ zJY2ny@xkN{0+d&+ntwsYOcVHlWA6hl=m;qqj$}!Ft7~ezq#kIvm1R9QjtP-r5LGS= z4uXL~bMNU1t@tTSqIpBo-JyJhn(_cj@$5KG^HG=BM`6PSbz}uxhw=faGwkYGc6h`Q zuDC}2`YRCM5De*xfeNWDKy8rnNcAxju+c=5IV89g*ULy#FB|d*_7eWXzq4IcV z2Vv9|Ua{g?(n$X_ueG@QFtDY;@kJv+p)Oy8y)E6obu}7^IK;DY3EjGkZM*(V^3X5$ zgL{CRurg38voeGg;U9bi5=S23z%ET8&Ga1M=mVNa zo7Al#H4p47N5_V=u-{bL-)MlGnIw>~6^XzHNF5P?gXKtOh3j!=ODZ@8z*CG5x_J^- zQe+?zEKD)jgyryy(OwCZs2oa{)1;;Y9Oo|Z3hg9H<_`4UoDV0~^7Al6QxfVIvwBB# zgbDytQY1p0v>uKr4t{<~!Eab4^wa@wG5U`_n;?JzISs+kfdn+K3KlTBwi?>PWR?8n z)wpSlzR6r~FoHNmNNSI!4e>9ut8-f0W8?0`PCyE1#4De~@94ySRtfHh%&4fin*@#K z0-guQv%%<$!~O4*0m)kKc2i{wQ&NoLfhTPO!bvck>8>K*a-hK2Lds!)#X#40`eR?u z7j%%^60*kyNB#Z-ci%1ecAu%5zHDmc4}=mL8=XW8W{&hcSn4k+`jcE6AT9imJUGa?>x^tK-#NbWl$4Eu!_;s;L!AO^}8$ zv=YmcctIq$PX%3Fg?x?xbfbaI=uv4Si;QGtc;##+qW#9-CP6xOX-0Q>_}X24o0IFW z;Xr^cem#I8#p-CByVxs-IF@8Zud)ZdfpG;PC@dOP4r#>KnZw9Pido|JoW621W0-5f z-7droG{2;)l*Ks zX;x3~JqnbTN=y3zfyIkXt^q7>%EdTuk3w8yk#X(b9XoOy zJ6S=#1MXOq;tMPZ>NbW!xuuC7mgsJnO)&?98;VoSwQG+zPWuA%9h(@9B_Ihc{368| zLP!Q{=ttKo+e5`lho{-m?~~wJ$Z>r)hkh~U7iqRsM#@$d;$JX|(M|J^TX0H!f&IeS zt1DUKTFF&ISPJ%Jg-y z?{2%zgUCEKf{QR6Vo8egTj(^#!DvjqpiSNrO5ln&z6NhHX6K&B@LCJx2f$z&LL0DH zg|Ssa#eKT8Ewua) z`gYX0$P(LeCf+E88^m&H0Ow*dedZq@P!jmK!v46S#Tq$DG%FGbUXFnVW;umy19~oopVr~W$edWqi$vQL-btP=Ln0ss0+V%0DtNmsYoJ2}R=PsDSm@K!y}7eB<4Yj@ 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 O9csH&)3zKq{eJ)fqfb@< literal 0 HcmV?d00001 diff --git a/vendor/github.com/bytedance/sonic/bench.py b/vendor/github.com/bytedance/sonic/bench.py new file mode 100644 index 00000000000..1d4c35739f3 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/bench.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python3 + +# 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. + +import tempfile +import os +import subprocess +import argparse + +gbench_prefix = "SONIC_NO_ASYNC_GC=1 go test -benchmem -run=none " + +def run(cmd): + print(cmd) + if os.system(cmd): + print ("Failed to run cmd: %s"%(cmd)) + exit(1) + +def run_s(cmd): + print (cmd) + try: + res = os.popen(cmd) + except subprocess.CalledProcessError as e: + if e.returncode: + print (e.output) + exit(1) + return res.read() + +def run_r(cmd): + print (cmd) + try: + cmds = cmd.split(' ') + data = subprocess.check_output(cmds, stderr=subprocess.STDOUT) + except subprocess.CalledProcessError as e: + if e.returncode: + print (e.output) + exit(1) + return data.decode("utf-8") + +def compare(args): + # detech current branch. + # result = run_r("git branch") + current_branch = run_s("git status | head -n1 | sed 's/On branch //'") + # for br in result.split('\n'): + # if br.startswith("* "): + # current_branch = br.lstrip('* ') + # break + + if not current_branch: + print ("Failed to detech current branch") + return None + + # get the current diff + (fd, diff) = tempfile.mkstemp() + run("git diff > %s"%diff) + + # early return if currrent is main branch. + print ("Current branch: %s"%(current_branch)) + if current_branch == "main": + print ("Cannot compare at the main branch.Please build a new branch") + return None + + # benchmark current branch + (fd, target) = tempfile.mkstemp(".target.txt") + run("%s %s ./... 2>&1 | tee %s" %(gbench_prefix, args, target)) + + # trying to switch to the latest main branch + run("git checkout -- .") + if current_branch != "main": + run("git checkout main") + run("git pull --allow-unrelated-histories origin main") + + # benchmark main branch + (fd, main) = tempfile.mkstemp(".main.txt") + run("%s %s ./... 2>&1 | tee %s" %(gbench_prefix, args, main)) + + # diff the result + # benchstat = "go get golang.org/x/perf/cmd/benchstat && go install golang.org/x/perf/cmd/benchstat" + run( "benchstat -sort=delta %s %s"%(main, target)) + run("git checkout -- .") + + # restore branch + if current_branch != "main": + run("git checkout %s"%(current_branch)) + run("patch -p1 < %s" % (diff)) + return target + +def main(): + argparser = argparse.ArgumentParser(description='Tools to test the performance. Example: ./bench.py -b Decoder_Generic_Sonic -c') + argparser.add_argument('-b', '--bench', dest='filter', required=False, + help='Specify the filter for golang benchmark') + argparser.add_argument('-c', '--compare', dest='compare', action='store_true', required=False, + help='Compare with the main benchmarking') + argparser.add_argument('-t', '--times', dest='times', required=False, + help='benchmark the times') + argparser.add_argument('-r', '--repeat_times', dest='count', required=False, + help='benchmark the count') + args = argparser.parse_args() + + if args.filter: + gbench_args = "-bench=%s"%(args.filter) + else: + gbench_args = "-bench=." + + if args.times: + gbench_args += " -benchtime=%s"%(args.times) + + if args.count: + gbench_args += " -count=%s"%(args.count) + else: + gbench_args += " -count=10" + + if args.compare: + target = compare(gbench_args) + else: + target = None + + if not target: + (fd, target) = tempfile.mkstemp(".target.txt") + run("%s %s ./... 2>&1 | tee %s" %(gbench_prefix, gbench_args, target)) + +if __name__ == "__main__": + main() diff --git a/vendor/github.com/bytedance/sonic/bench.sh b/vendor/github.com/bytedance/sonic/bench.sh new file mode 100644 index 00000000000..701986b58a7 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/bench.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +pwd=$(pwd) +export SONIC_NO_ASYNC_GC=1 + +cd $pwd/encoder +go test -benchmem -run=^$ -benchtime=100000x -bench "^(BenchmarkEncoder_.*)$" + +cd $pwd/decoder +go test -benchmem -run=^$ -benchtime=100000x -bench "^(BenchmarkDecoder_.*)$" + +cd $pwd/ast +go test -benchmem -run=^$ -benchtime=1000000x -bench "^(BenchmarkGet.*|BenchmarkSet.*)$" + +go test -benchmem -run=^$ -benchtime=10000x -bench "^(BenchmarkParser_.*|BenchmarkEncode.*)$" + +go test -benchmem -run=^$ -benchtime=10000000x -bench "^(BenchmarkNodeGetByPath|BenchmarkStructGetByPath|BenchmarkNodeIndex|BenchmarkStructIndex|BenchmarkSliceIndex|BenchmarkMapIndex|BenchmarkNodeGet|BenchmarkSliceGet|BenchmarkMapGet|BenchmarkNodeSet|BenchmarkMapSet|BenchmarkNodeSetByIndex|BenchmarkSliceSetByIndex|BenchmarkStructSetByIndex|BenchmarkNodeUnset|BenchmarkMapUnset|BenchmarkNodUnsetByIndex|BenchmarkSliceUnsetByIndex|BenchmarkNodeAdd|BenchmarkSliceAdd|BenchmarkMapAdd)$" + +cd $pwd/external_jsonlib_test/benchmark_test +go test -benchmem -run=^$ -benchtime=100000x -bench "^(BenchmarkEncoder_.*|BenchmarkDecoder_.*)$" + +go test -benchmem -run=^$ -benchtime=1000000x -bench "^(BenchmarkGet.*|BenchmarkSet.*)$" + +go test -benchmem -run=^$ -benchtime=10000x -bench "^(BenchmarkParser_.*)$" + +unset SONIC_NO_ASYNC_GC +cd $pwd \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/check_branch_name.sh b/vendor/github.com/bytedance/sonic/check_branch_name.sh new file mode 100644 index 00000000000..d1905dab132 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/check_branch_name.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +current=$(git status | head -n1 | sed 's/On branch //') +name=${1:-$current} +if [[ ! $name =~ ^(((opt(imize)?|feat(ure)?|doc|(bug|hot)?fix|test|refact(or)?|ci)/.+)|(main|develop)|(release/.+)|(release-v[0-9]+\.[0-9]+)|(release/v[0-9]+\.[0-9]+\.[0-9]+(-[a-z0-9.]+(\+[a-z0-9.]+)?)?)|revert-[a-z0-9]+)$ ]]; then + echo "branch name '$name' is invalid" + exit 1 +else + echo "branch name '$name' is valid" +fi diff --git a/vendor/github.com/bytedance/sonic/compat.go b/vendor/github.com/bytedance/sonic/compat.go new file mode 100644 index 00000000000..015aa62bfb1 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/compat.go @@ -0,0 +1,131 @@ +// +build !amd64 go1.21 + +/* + * 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 sonic + +import ( + `bytes` + `encoding/json` + `io` + `reflect` + + `github.com/bytedance/sonic/option` +) + +type frozenConfig struct { + Config +} + +// Froze convert the Config to API +func (cfg Config) Froze() API { + api := &frozenConfig{Config: cfg} + return api +} + +func (cfg frozenConfig) marshalOptions(val interface{}, prefix, indent string) ([]byte, error) { + w := bytes.NewBuffer([]byte{}) + enc := json.NewEncoder(w) + enc.SetEscapeHTML(cfg.EscapeHTML) + enc.SetIndent(prefix, indent) + err := enc.Encode(val) + out := w.Bytes() + + // json.Encoder always appends '\n' after encoding, + // which is not same with json.Marshal() + if len(out) > 0 && out[len(out)-1] == '\n' { + out = out[:len(out)-1] + } + return out, err +} + +// Marshal is implemented by sonic +func (cfg frozenConfig) Marshal(val interface{}) ([]byte, error) { + if !cfg.EscapeHTML { + return cfg.marshalOptions(val, "", "") + } + return json.Marshal(val) +} + +// MarshalToString is implemented by sonic +func (cfg frozenConfig) MarshalToString(val interface{}) (string, error) { + out, err := cfg.Marshal(val) + return string(out), err +} + +// MarshalIndent is implemented by sonic +func (cfg frozenConfig) MarshalIndent(val interface{}, prefix, indent string) ([]byte, error) { + if !cfg.EscapeHTML { + return cfg.marshalOptions(val, prefix, indent) + } + return json.MarshalIndent(val, prefix, indent) +} + +// UnmarshalFromString is implemented by sonic +func (cfg frozenConfig) UnmarshalFromString(buf string, val interface{}) error { + r := bytes.NewBufferString(buf) + dec := json.NewDecoder(r) + if cfg.UseNumber { + dec.UseNumber() + } + if cfg.DisallowUnknownFields { + dec.DisallowUnknownFields() + } + return dec.Decode(val) +} + +// Unmarshal is implemented by sonic +func (cfg frozenConfig) Unmarshal(buf []byte, val interface{}) error { + return cfg.UnmarshalFromString(string(buf), val) +} + +// NewEncoder is implemented by sonic +func (cfg frozenConfig) NewEncoder(writer io.Writer) Encoder { + enc := json.NewEncoder(writer) + if !cfg.EscapeHTML { + enc.SetEscapeHTML(cfg.EscapeHTML) + } + return enc +} + +// NewDecoder is implemented by sonic +func (cfg frozenConfig) NewDecoder(reader io.Reader) Decoder { + dec := json.NewDecoder(reader) + if cfg.UseNumber { + dec.UseNumber() + } + if cfg.DisallowUnknownFields { + dec.DisallowUnknownFields() + } + return dec +} + +// Valid is implemented by sonic +func (cfg frozenConfig) Valid(data []byte) bool { + return json.Valid(data) +} + +// Pretouch compiles vt ahead-of-time to avoid JIT compilation on-the-fly, in +// order to reduce the first-hit latency at **amd64** Arch. +// 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. +// * This is the none implement for !amd64. +// It will be useful for someone who develop with !amd64 arch,like Mac M1. +func Pretouch(vt reflect.Type, opts ...option.CompileOption) error { + return nil +} + diff --git a/vendor/github.com/bytedance/sonic/decoder/asm.s b/vendor/github.com/bytedance/sonic/decoder/asm.s new file mode 100644 index 00000000000..e69de29bb2d diff --git a/vendor/github.com/bytedance/sonic/decoder/assembler_amd64_go116.go b/vendor/github.com/bytedance/sonic/decoder/assembler_amd64_go116.go new file mode 100644 index 00000000000..9ff1ad248fa --- /dev/null +++ b/vendor/github.com/bytedance/sonic/decoder/assembler_amd64_go116.go @@ -0,0 +1,1943 @@ +// +build go1.15,!go1.17 + +/* + * 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 decoder + +import ( + `encoding/json` + `fmt` + `math` + `reflect` + `strconv` + `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` + `github.com/twitchyliquid64/golang-asm/obj/x86` +) + +/** Register Allocations + * + * State Registers: + * + * %rbx : stack base + * %r12 : input pointer + * %r13 : input length + * %r14 : input cursor + * %r15 : value pointer + * + * Error Registers: + * + * %r10 : error type register + * %r11 : 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 = 96 // 96 bytes to pass arguments and return values for this function + _FP_fargs = 80 // 80 bytes for passing arguments to other Go functions + _FP_saves = 40 // 40 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") + _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") +) + +var ( + _ST = jit.Reg("BX") + _IP = jit.Reg("R12") + _IL = jit.Reg("R13") + _IC = jit.Reg("R14") + _VP = jit.Reg("R15") +) + +var ( + _R10 = jit.Reg("R10") // used for gcWriteBarrier + _DF = jit.Reg("R10") // reuse R10 in generic decoder for flags + _ET = jit.Reg("R10") + _EP = jit.Reg("R11") +) + +var ( + _ARG_s = _ARG_sp + _ARG_sp = jit.Ptr(_SP, _FP_base) + _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 ( + _VAR_sv = _VAR_sv_p + _VAR_sv_p = jit.Ptr(_SP, _FP_base + 48) + _VAR_sv_n = jit.Ptr(_SP, _FP_base + 56) + _VAR_vk = jit.Ptr(_SP, _FP_base + 64) +) + +var ( + _RET_rc = jit.Ptr(_SP, _FP_base + 72) + _RET_et = jit.Ptr(_SP, _FP_base + 80) + _RET_ep = jit.Ptr(_SP, _FP_base + 88) +) + +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 dismatched type + _VAR_ic = jit.Ptr(_SP, _FP_fargs + _FP_saves + 128) // save dismatched position + _VAR_pc = jit.Ptr(_SP, _FP_fargs + _FP_saves + 136) // save skip return pc +) + +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.mismatch_error() + self.type_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_skip : (*_Assembler)._asm_OP_object_skip, + _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_add : (*_Assembler)._asm_OP_add, +} + +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", _IC, _RET_rc) // MOVQ IC, rc<>+40(FP) + self.Emit("MOVQ", _ET, _RET_et) // MOVQ ET, et<>+48(FP) + self.Emit("MOVQ", _EP, _RET_ep) // MOVQ EP, ep<>+56(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", _ARG_sp, _IP) // MOVQ s.p<>+0(FP), IP + self.Emit("MOVQ", _ARG_sl, _IL) // MOVQ s.l<>+8(FP), IL + self.Emit("MOVQ", _ARG_ic, _IC) // MOVQ ic<>+16(FP), IC + self.Emit("MOVQ", _ARG_vp, _VP) // MOVQ vp<>+24(FP), VP + self.Emit("MOVQ", _ARG_sb, _ST) // MOVQ vp<>+32(FP), ST + // 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 + self.Emit("XORL", _AX, _AX) // XORL AX, AX + self.Emit("MOVQ", _AX, _VAR_et) // MOVQ AX, ss.Dp +} + +/** Function Calling Helpers **/ + +var _REG_go = []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, _AX) // MOVQ ${fn}, AX + self.Rjmp("CALL", _AX) // CALL AX +} + +func (self *_Assembler) 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 *_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.call(fn) // CALL ${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.call(fn) // CALL ${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))) +) + +func (self *_Assembler) type_error() { + self.Link(_LB_type_error) // _type_error: + self.Emit("MOVQ", _ET, jit.Ptr(_SP, 0)) // MOVQ ET, (SP) + self.call_go(_F_error_type) // CALL_GO error_type + self.Emit("MOVQ", jit.Ptr(_SP, 8), _ET) // MOVQ 8(SP), ET + self.Emit("MOVQ", jit.Ptr(_SP, 16), _EP) // MOVQ 16(SP), EP + self.Sjmp("JMP" , _LB_error) // JMP _error +} + + +func (self *_Assembler) mismatch_error() { + self.Link(_LB_mismatch_error) // _type_error: + self.Emit("MOVQ", _ARG_sp, _AX) + self.Emit("MOVQ", _AX, jit.Ptr(_SP, 0)) // MOVQ AX, (SP) + self.Emit("MOVQ", _ARG_sl, _CX) + self.Emit("MOVQ", _CX, jit.Ptr(_SP, 8)) // MOVQ CX, 8(SP) + self.Emit("MOVQ", _VAR_ic, _AX) + self.Emit("MOVQ", _AX, jit.Ptr(_SP, 16)) // MOVQ AX, 16(SP) + self.Emit("MOVQ", _VAR_et, _CX) + self.Emit("MOVQ", _CX, jit.Ptr(_SP, 24)) // MOVQ CX, 24(SP) + self.call_go(_F_error_mismatch) // CALL_GO error_type + self.Emit("MOVQ", jit.Ptr(_SP, 32), _ET) // MOVQ 32(SP), ET + self.Emit("MOVQ", jit.Ptr(_SP, 40), _EP) // MOVQ 40(SP), EP + 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.Emit("MOVQ", _R9, _VAR_pc) + self.Sjmp("JMP" , _LB_skip_one) // JMP _skip_one +} + +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) +} + +func (self *_Assembler) field_error() { + self.Link(_LB_field_error) // _field_error: + self.Emit("MOVOU", _VAR_sv, _X0) // MOVOU sv, X0 + self.Emit("MOVOU", _X0, jit.Ptr(_SP, 0)) // MOVOU X0, (SP) + self.call_go(_F_error_field) // CALL_GO error_field + self.Emit("MOVQ" , jit.Ptr(_SP, 16), _ET) // MOVQ 16(SP), ET + self.Emit("MOVQ" , jit.Ptr(_SP, 24), _EP) // MOVQ 24(SP), EP + self.Sjmp("JMP" , _LB_error) // JMP _error +} + +func (self *_Assembler) range_error() { + self.Link(_LB_range_error) // _range_error: + self.slice_from(_VAR_st_Ep, 0) // SLICE st.Ep, $0 + self.Emit("MOVQ", _DI, jit.Ptr(_SP, 0)) // MOVQ DI, (SP) + self.Emit("MOVQ", _SI, jit.Ptr(_SP, 8)) // MOVQ SI, 8(SP) + self.Emit("MOVQ", _ET, jit.Ptr(_SP, 16)) // MOVQ ET, 16(SP) + self.Emit("MOVQ", _EP, jit.Ptr(_SP, 24)) // MOVQ EP, 24(SP) + self.call_go(_F_error_value) // CALL_GO error_value + self.Emit("MOVQ", jit.Ptr(_SP, 32), _ET) // MOVQ 32(SP), ET + self.Emit("MOVQ", jit.Ptr(_SP, 40), _EP) // MOVQ 40(SP), EP + 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.Emit("MOVQ", _AX, jit.Ptr(_SP, 0)) // MOVQ AX, (SP) + self.call_go(_F_convT64) // CALL_GO convT64 + self.Emit("MOVQ", jit.Ptr(_SP, 8), _EP) // MOVQ 8(SP), 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("MOVOU", _ARG_s, _X0) // MOVOU s, X0 + self.Emit("MOVOU", _X0, jit.Ptr(_SP, 0)) // MOVOU X0, (SP) + self.Emit("MOVQ" , _IC, jit.Ptr(_SP, 16)) // MOVQ IC, 16(SP) + self.Emit("MOVQ" , _EP, jit.Ptr(_SP, 24)) // MOVQ EP, 24(SP) + self.call_go(_F_error_wrap) // CALL_GO error_wrap + self.Emit("MOVQ" , jit.Ptr(_SP, 32), _ET) // MOVQ 32(SP), ET + self.Emit("MOVQ" , jit.Ptr(_SP, 40), _EP) // MOVQ 40(SP), EP + self.Sjmp("JMP" , _LB_error) // JMP _error +} + +/** Memory Management Routines **/ + +var ( + _T_byte = jit.Type(byteType) + _F_mallocgc = jit.Func(mallocgc) +) + +func (self *_Assembler) malloc(nb obj.Addr, ret obj.Addr) { + self.Emit("XORL", _AX, _AX) // XORL AX, AX + self.Emit("MOVQ", _T_byte, _CX) // MOVQ ${type(byte)}, CX + self.Emit("MOVQ", nb, jit.Ptr(_SP, 0)) // MOVQ ${nb}, (SP) + self.Emit("MOVQ", _CX, jit.Ptr(_SP, 8)) // MOVQ CX, 8(SP) + self.Emit("MOVQ", _AX, jit.Ptr(_SP, 16)) // MOVQ AX, 16(SP) + self.call_go(_F_mallocgc) // CALL_GO mallocgc + self.Emit("MOVQ", jit.Ptr(_SP, 24), ret) // MOVQ 24(SP), ${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", _AX, jit.Ptr(_SP, 0)) // MOVQ AX, (SP) + self.Emit("MOVQ", jit.Type(vt), _AX) // MOVQ ${vt}, AX + self.Emit("MOVQ", _AX, jit.Ptr(_SP, 8)) // MOVQ AX, 8(SP) + self.Emit("MOVB", jit.Imm(1), jit.Ptr(_SP, 16)) // MOVB $1, 16(SP) + self.call_go(_F_mallocgc) // CALL_GO mallocgc + self.Emit("MOVQ", jit.Ptr(_SP, 24), ret) // MOVQ 24(SP), ${ret} +} + +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(vt, _AX) // VALLOC ${vt}, AX + self.WritePtrAX(1, jit.Ptr(_VP, 0), false) // 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), _BP) + self.Emit("MOVQ", _BP, _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", _BP, _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() { // parse_string has a validate flag params in the last + 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, _BP) + self.call_vf(_F_vnumber) // call vnumber + self.check_err(vt, pin, pin2) +} + +func (self *_Assembler) parse_signed(vt reflect.Type, pin string, pin2 int) { + self.Emit("MOVQ", _IC, _BP) + 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, _BP) + 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(_SI, _AX) + self.Emit("MOVQ", _AX, _VAR_sv_p) + self.Emit("MOVQ", _AX, jit.Ptr(_SP, 0)) + self.Emit("MOVQ", _VAR_bs_p, _DI) + self.Emit("MOVQ", _DI, jit.Ptr(_SP, 8)) + self.Emit("MOVQ", _VAR_bs_n, _SI) + self.Emit("MOVQ", _SI, jit.Ptr(_SP, 16)) + self.call_go(_F_memmove) + self.Emit("MOVQ", _VAR_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(_SI, _DX) // MALLOC SI, DX + self.Emit("MOVQ" , _DX, _VAR_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(_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" , _VAR_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(_SI, _DX) // MALLOC SI, DX + self.Emit("MOVQ" , _DX, _VAR_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(_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" , _VAR_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(float64) + _Vp_min_f32 = new(float64) +) + +func init() { + *_Vp_max_f32 = math.MaxFloat32 + *_Vp_min_f32 = -math.MaxFloat32 +} + +func (self *_Assembler) range_single() { + self.Emit("MOVSD" , _VAR_st_Dv, _X0) // MOVSD st.Dv, X0 + self.Emit("MOVQ" , _V_max_f32, _AX) // MOVQ _max_f32, AX + 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("UCOMISD" , jit.Ptr(_AX, 0), _X0) // UCOMISD (AX), X0 + self.Sjmp("JA" , _LB_range_error) // JA _range_error + self.Emit("MOVQ" , _V_min_f32, _AX) // MOVQ _min_f32, AX + self.Emit("MOVSD" , jit.Ptr(_AX, 0), _X1) // MOVSD (AX), X1 + self.Emit("UCOMISD" , _X0, _X1) // UCOMISD X0, X1 + self.Sjmp("JA" , _LB_range_error) // JA _range_error + self.Emit("CVTSD2SS", _X0, _X0) // CVTSD2SS X0, X0 +} + +func (self *_Assembler) range_signed(i *rt.GoItab, t *rt.GoType, a int64, b int64) { + self.Emit("MOVQ", _VAR_st_Iv, _AX) // MOVQ st.Iv, AX + self.Emit("MOVQ", jit.Gitab(i), _ET) // MOVQ ${i}, ET + self.Emit("MOVQ", jit.Gtype(t), _EP) // MOVQ ${t}, EP + self.Emit("CMPQ", _AX, jit.Imm(a)) // CMPQ AX, ${a} + self.Sjmp("JL" , _LB_range_error) // JL _range_error + self.Emit("CMPQ", _AX, jit.Imm(b)) // CMPQ AX, ${B} + self.Sjmp("JG" , _LB_range_error) // JG _range_error +} + +func (self *_Assembler) range_unsigned(i *rt.GoItab, t *rt.GoType, v uint64) { + self.Emit("MOVQ" , _VAR_st_Iv, _AX) // MOVQ st.Iv, AX + self.Emit("MOVQ" , jit.Gitab(i), _ET) // MOVQ ${i}, ET + self.Emit("MOVQ" , jit.Gtype(t), _EP) // MOVQ ${t}, EP + self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX + self.Sjmp("JS" , _LB_range_error) // JS _range_error + self.Emit("CMPQ" , _AX, jit.Imm(int64(v))) // CMPQ AX, ${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 _noescape_{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}") // _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) + } +} + +/** 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), _CX) // MOVQ ${size}, CX + 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, _CX) // ADDQ AX, CX + self.Emit("MOVQ", _VP, jit.Ptr(_SP, 0)) // MOVQ VP, (SP) + self.Emit("MOVQ", _CX, jit.Ptr(_SP, 8)) // MOVQ CX, 8(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_decodeTextUnmarshaler obj.Addr +) + +func init() { + _F_decodeJsonUnmarshaler = jit.Func(decodeJsonUnmarshaler) + _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(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", _AX, jit.Ptr(_SP, 0)) // MOVQ AX, (SP) + self.Emit("MOVQ", _VP, jit.Ptr(_SP, 8)) // MOVQ VP, 8(SP) + self.Emit("MOVQ", p, jit.Ptr(_SP, 16)) // MOVQ ${p}, 16(SP) + self.Emit("MOVQ", n, jit.Ptr(_SP, 24)) // MOVQ ${n}, 24(SP) + self.call_go(_F_mapassign_faststr) // CALL_GO ${fn} + self.Emit("MOVQ", jit.Ptr(_SP, 32), _VP) // MOVQ 32(SP), VP + self.mapaccess_ptr(t) +} + +func (self *_Assembler) mapassign_call(t reflect.Type, fn obj.Addr) { + self.Emit("MOVQ", jit.Type(t), _SI) // MOVQ ${t}, SI + self.Emit("MOVQ", _SI, jit.Ptr(_SP, 0)) // MOVQ SI, (SP) + self.Emit("MOVQ", _VP, jit.Ptr(_SP, 8)) // MOVQ VP, 8(SP) + self.Emit("MOVQ", _AX, jit.Ptr(_SP, 16)) // MOVQ AX, 16(SP) + self.call_go(fn) // CALL_GO ${fn} + self.Emit("MOVQ", jit.Ptr(_SP, 24), _VP) // MOVQ 24(SP), VP +} + +func (self *_Assembler) mapassign_fastx(t reflect.Type, fn obj.Addr) { + self.mapassign_call(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, _DI) // VALLOC ${vk}, DI + // must spill vk pointer since next call_go may invoke GC + self.Emit("MOVQ" , _DI, _VAR_vk) + self.Emit("MOVQ" , jit.Type(tk), _AX) // MOVQ ${tk}, AX + self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 0)) // MOVQ AX, (SP) + self.Emit("MOVQ" , _DI, jit.Ptr(_SP, 8)) // MOVQ DI, 8(SP) + self.Emit("MOVOU", _VAR_sv, _X0) // MOVOU sv, X0 + self.Emit("MOVOU", _X0, jit.Ptr(_SP, 16)) // MOVOU X0, 16(SP) + self.call_go(_F_decodeTextUnmarshaler) // CALL_GO decodeTextUnmarshaler + self.Emit("MOVQ" , jit.Ptr(_SP, 32), _ET) // MOVQ 32(SP), ET + self.Emit("MOVQ" , jit.Ptr(_SP, 40), _EP) // MOVQ 40(SP), EP + self.Emit("TESTQ", _ET, _ET) // TESTQ ET, ET + self.Sjmp("JNZ" , _LB_error) // JNZ _error + self.Emit("MOVQ" , _VAR_vk, _AX) + + /* select the correct assignment function */ + if !pv { + self.mapassign_call(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_number = jit.Imm(int64(native.S_skip_number)) +) + +func (self *_Assembler) unmarshal_json(t reflect.Type, deref bool) { + 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.slice_from_r(_AX, 0) // SLICE_R AX, $0 + self.Emit("MOVQ" , _DI, _VAR_sv_p) // MOVQ DI, sv.p + self.Emit("MOVQ" , _SI, _VAR_sv_n) // MOVQ SI, sv.n + self.unmarshal_func(t, _F_decodeJsonUnmarshaler, deref) // UNMARSHAL json, ${t}, ${deref} +} + +func (self *_Assembler) unmarshal_text(t reflect.Type, deref bool) { + self.parse_string() // PARSE STRING + self.unquote_once(_VAR_sv_p, _VAR_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, _AX) // MOVQ VP, AX + self.Emit("MOVQ" , jit.Ptr(_AX, 0), _AX) // MOVQ (AX), AX + self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX + self.Sjmp("JNZ" , "_deref_{n}") // JNZ _deref_{n} + self.valloc(t.Elem(), _AX) // VALLOC ${t.Elem()}, AX + self.WritePtrAX(3, jit.Ptr(_VP, 0), false) // MOVQ AX, (VP) + self.Link("_deref_{n}") // _deref_{n}: + } + + /* set value type */ + self.Emit("MOVQ", jit.Type(pt), _CX) // MOVQ ${pt}, CX + self.Emit("MOVQ", _CX, jit.Ptr(_SP, 0)) // MOVQ CX, (SP) + + /* set value pointer */ + if deref && vk == reflect.Ptr { + self.Emit("MOVQ", _AX, jit.Ptr(_SP, 8)) // MOVQ AX, 8(SP) + } else { + self.Emit("MOVQ", _VP, jit.Ptr(_SP, 8)) // MOVQ VP, 8(SP) + } + + /* set the source string and call the unmarshaler */ + self.Emit("MOVOU", _VAR_sv, _X0) // MOVOU sv, X0 + self.Emit("MOVOU", _X0, jit.Ptr(_SP, 16)) // MOVOU X0, 16(SP) + self.call_go(fn) // CALL_GO ${fn} + self.Emit("MOVQ" , jit.Ptr(_SP, 32), _ET) // MOVQ 32(SP), ET + self.Emit("MOVQ" , jit.Ptr(_SP, 40), _EP) // MOVQ 40(SP), EP + self.Emit("TESTQ", _ET, _ET) // TESTQ ET, ET + self.Sjmp("JNZ" , _LB_error) // JNZ _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" , _ARG_fv, _CX) // MOVQ fv, CX + self.Emit("MOVOU", _ARG_sp, _X0) // MOVOU sp, X0 + self.Emit("MOVOU", _X0, jit.Ptr(_SP, 0)) // MOVOU X0, (SP) + self.Emit("MOVQ" , _IC, jit.Ptr(_SP, 16)) // MOVQ IC, 16(SP) + self.Emit("MOVQ" , vt, jit.Ptr(_SP, 24)) // MOVQ ${vt}, 24(SP) + self.Emit("MOVQ" , vp, jit.Ptr(_SP, 32)) // MOVQ ${vp}, 32(SP) + self.Emit("MOVQ" , _ST, jit.Ptr(_SP, 40)) // MOVQ ST, 40(SP) + self.Emit("MOVQ" , _CX, jit.Ptr(_SP, 48)) // MOVQ CX, 48(SP) + self.call_go(_F_decodeTypedPointer) // CALL_GO decodeTypedPointer + self.Emit("MOVQ" , jit.Ptr(_SP, 64), _ET) // MOVQ 64(SP), ET + self.Emit("MOVQ" , jit.Ptr(_SP, 72), _EP) // MOVQ 72(SP), EP + self.Emit("TESTQ", _ET, _ET) // TESTQ ET, ET + self.Sjmp("JNZ" , _LB_error) // JNZ _error + self.Emit("MOVQ" , jit.Ptr(_SP, 56), _IC) // MOVQ 56(SP), IC +} + +/** OpCode Assembler Functions **/ + +var ( + _F_memequal = jit.Func(memequal) + _F_memmove = jit.Func(memmove) + _F_growslice = jit.Func(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_skip_array = jit.Imm(int64(native.S_skip_array)) + _F_skip_object = jit.Imm(int64(native.S_skip_object)) +) + +var ( + _F_FieldMap_GetCaseInsensitive obj.Addr +) + +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("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), _AX) // MOVQ (VP), AX + self.Emit("MOVQ" , jit.Ptr(_AX, 8), _AX) // MOVQ 8(AX), 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" , _LB_type_error) // JNE _type_error + self.Emit("LEAQ" , jit.Ptr(_VP, 8), _DI) // LEAQ 8(VP), DI + self.decode_dynamic(_AX, _DI) // DECODE AX, 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(_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), _R9) // MOVQ SI, (VP) + self.WriteRecNotAX(4, _SI, jit.Ptr(_VP, 0), true, false) // XCHGQ SI, (VP) + self.Emit("MOVQ" , _R9, _SI) + + self.Emit("XCHGQ", _DX, jit.Ptr(_VP, 8)) // XCHGQ DX, 8(VP) + self.call(_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, _BP) + 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.call_sf(_F_skip_number) // CALL_SF skip_one + self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX + self.Sjmp("JNS" , "_num_next_{n}") + + /* call skip one */ + self.Emit("MOVQ", _BP, _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) + + /* assgin 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) + + /* check if quoted */ + 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(ins *_Instr) { + var pin = "_i8_end_{n}" + self.parse_signed(int8Type, pin, -1) // PARSE int8 + self.range_signed(_I_int8, _T_int8, math.MinInt8, math.MaxInt8) // RANGE int8 + self.Emit("MOVB", _AX, jit.Ptr(_VP, 0)) // MOVB AX, (VP) + self.Link(pin) +} + +func (self *_Assembler) _asm_OP_i16(ins *_Instr) { + var pin = "_i16_end_{n}" + self.parse_signed(int16Type, pin, -1) // PARSE int16 + self.range_signed(_I_int16, _T_int16, math.MinInt16, math.MaxInt16) // RANGE int16 + self.Emit("MOVW", _AX, jit.Ptr(_VP, 0)) // MOVW AX, (VP) + self.Link(pin) +} + +func (self *_Assembler) _asm_OP_i32(ins *_Instr) { + var pin = "_i32_end_{n}" + self.parse_signed(int32Type, pin, -1) // PARSE int32 + self.range_signed(_I_int32, _T_int32, math.MinInt32, math.MaxInt32) // RANGE int32 + self.Emit("MOVL", _AX, jit.Ptr(_VP, 0)) // MOVL AX, (VP) + self.Link(pin) +} + +func (self *_Assembler) _asm_OP_i64(ins *_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(ins *_Instr) { + var pin = "_u8_end_{n}" + self.parse_unsigned(uint8Type, pin, -1) // PARSE uint8 + self.range_unsigned(_I_uint8, _T_uint8, math.MaxUint8) // RANGE uint8 + self.Emit("MOVB", _AX, jit.Ptr(_VP, 0)) // MOVB AX, (VP) + self.Link(pin) +} + +func (self *_Assembler) _asm_OP_u16(ins *_Instr) { + var pin = "_u16_end_{n}" + self.parse_unsigned(uint16Type, pin, -1) // PARSE uint16 + self.range_unsigned(_I_uint16, _T_uint16, math.MaxUint16) // RANGE uint16 + self.Emit("MOVW", _AX, jit.Ptr(_VP, 0)) // MOVW AX, (VP) + self.Link(pin) +} + +func (self *_Assembler) _asm_OP_u32(ins *_Instr) { + var pin = "_u32_end_{n}" + self.parse_unsigned(uint32Type, pin, -1) // PARSE uint32 + self.range_unsigned(_I_uint32, _T_uint32, math.MaxUint32) // RANGE uint32 + self.Emit("MOVL", _AX, jit.Ptr(_VP, 0)) // MOVL AX, (VP) + self.Link(pin) +} + +func (self *_Assembler) _asm_OP_u64(ins *_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(ins *_Instr) { + var pin = "_f32_end_{n}" + self.parse_number(float32Type, pin, -1) // PARSE NUMBER + self.range_single() // RANGE float32 + self.Emit("MOVSS", _X0, jit.Ptr(_VP, 0)) // MOVSS X0, (VP) + self.Link(pin) +} + +func (self *_Assembler) _asm_OP_f64(ins *_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(ins *_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 X0, 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.Emit("MOVQ" , jit.Ptr(_SP, 0), _AX) // MOVQ (SP), AX + 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(_I_int8, _T_int8, math.MinInt8, math.MaxInt8) // RANGE int8 + 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(_I_int16, _T_int16, math.MinInt16, math.MaxInt16) // RANGE int16 + 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(_I_int32, _T_int32, math.MinInt32, math.MaxInt32) // RANGE int32 + if vt := p.vt(); !mapfast(vt) { + self.mapassign_std(vt, _VAR_st_Iv) // MAPASSIGN int32, mapassign, st.Iv + } else { + 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 + 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(_I_uint8, _T_uint8, math.MaxUint8) // RANGE uint8 + 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(_I_uint16, _T_uint16, math.MaxUint16) // RANGE uint16 + 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(_I_uint32, _T_uint32, math.MaxUint32) // RANGE uint32 + if vt := p.vt(); !mapfast(vt) { + self.mapassign_std(vt, _VAR_st_Iv) // MAPASSIGN uint32, vt.Iv + } else { + 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 + 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() // RANGE float32 + self.Emit("MOVSS", _X0, _VAR_st_Dv) // MOVSS X0, st.Dv + 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.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(_VAR_sv_p, _VAR_sv_n, true, true) // UNQUOTE once, sv.p, sv.n + if vt := p.vt(); !mapfast(vt) { + self.valloc(vt.Key(), _DI) + self.Emit("MOVOU", _VAR_sv, _X0) + self.Emit("MOVOU", _X0, jit.Ptr(_DI, 0)) + self.mapassign_std(vt, jit.Ptr(_DI, 0)) + } else { + self.Emit("MOVQ", _VAR_sv_p, _DI) // MOVQ sv.p, DI + self.Emit("MOVQ", _VAR_sv_n, _SI) // MOVQ sv.n, SI + self.mapassign_str_fast(vt, _DI, _SI) // MAPASSIGN string, DI, SI + } +} + +func (self *_Assembler) _asm_OP_map_key_utext(p *_Instr) { + self.parse_string() // PARSE STRING + self.unquote_once(_VAR_sv_p, _VAR_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(_VAR_sv_p, _VAR_sv_n, true, false) // 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), _AX) // MOVQ 16(VP), AX + self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX + 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()), _DX) // MOVQ ${p.vt()}, DX + self.Emit("MOVQ" , _DX, jit.Ptr(_SP, 0)) // MOVQ DX, (SP) + self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 8)) // MOVQ AX, 8(SP) + self.Emit("MOVQ" , _CX, jit.Ptr(_SP, 16)) // MOVQ CX, 16(SP) + self.call_go(_F_makeslice) // CALL_GO makeslice + self.Emit("MOVQ" , jit.Ptr(_SP, 24), _AX) // MOVQ 24(SP), AX + self.WritePtrAX(7, jit.Ptr(_VP, 0), false) // MOVQ AX, (VP) + self.Link("_done_{n}") // _done_{n}: + self.Emit("XORL" , _AX, _AX) // XORL AX, AX + self.Emit("MOVQ" , _AX, jit.Ptr(_VP, 8)) // MOVQ AX, 8(VP) +} + +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" , jit.Type(p.vt()), _AX) // MOVQ ${p.vt()}, AX + self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 0)) // MOVQ AX, (SP) + self.Emit("MOVOU", jit.Ptr(_VP, 0), _X0) // MOVOU (VP), X0 + self.Emit("MOVOU", _X0, jit.Ptr(_SP, 8)) // MOVOU X0, 8(SP) + self.Emit("MOVQ" , jit.Ptr(_VP, 16), _AX) // MOVQ 16(VP), AX + self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 24)) // MOVQ AX, 24(SP) + self.Emit("SHLQ" , jit.Imm(1), _AX) // SHLQ $1, AX + self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 32)) // MOVQ AX, 32(SP) + self.call_go(_F_growslice) // CALL_GO growslice + self.Emit("MOVQ" , jit.Ptr(_SP, 40), _DI) // MOVQ 40(SP), DI + self.Emit("MOVQ" , jit.Ptr(_SP, 48), _AX) // MOVQ 48(SP), AX + self.Emit("MOVQ" , jit.Ptr(_SP, 56), _SI) // MOVQ 56(SP), SI + self.WriteRecNotAX(8, _DI, jit.Ptr(_VP, 0), true, true)// MOVQ DI, (VP) + self.Emit("MOVQ" , _AX, jit.Ptr(_VP, 8)) // MOVQ AX, 8(VP) + self.Emit("MOVQ" , _SI, jit.Ptr(_VP, 16)) // MOVQ SI, 16(VP) + 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 +} + +func (self *_Assembler) _asm_OP_object_skip(_ *_Instr) { + self.call_sf(_F_skip_object) // CALL_SF skip_object + self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX + self.Sjmp("JS" , _LB_parsing_error_v) // JS _parse_error_v +} + +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(_VAR_sv_p, _VAR_sv_n, true, false) // UNQUOTE once, sv.p, sv.n + self.Emit("LEAQ" , _VAR_sv, _AX) // LEAQ sv, AX + self.Emit("XORL" , _CX, _CX) // XORL CX, CX + self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 0)) // MOVQ AX, (SP) + self.Emit("MOVQ" , _CX, jit.Ptr(_SP, 8)) // MOVQ CX, 8(SP) + self.call_go(_F_strhash) // CALL_GO strhash + self.Emit("MOVQ" , jit.Ptr(_SP, 16), _AX) // MOVQ 16(SP), AX + 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, _VAR_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" , _VAR_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" , _AX, jit.Ptr(_SP, 0)) // MOVQ AX, (SP) + self.Emit("MOVQ" , _CX, jit.Ptr(_SP, 8)) // MOVQ CX, 8(SP) + self.Emit("MOVQ" , _DX, jit.Ptr(_SP, 16)) // MOVQ DX, 16(SP) + self.call_go(_F_memequal) // CALL_GO memequal + 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("MOVB" , jit.Ptr(_SP, 24), _DX) // MOVB 24(SP), DX + 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("MOVOU", _VAR_sv, _X0) // MOVOU sv, X0 + self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 0)) // MOVQ AX, (SP) + self.Emit("MOVOU", _X0, jit.Ptr(_SP, 8)) // MOVOU X0, 8(SP) + self.call_go(_F_FieldMap_GetCaseInsensitive) // CALL_GO FieldMap::GetCaseInsensitive + self.Emit("MOVQ" , jit.Ptr(_SP, 24), _AX) // MOVQ 24(SP), AX + 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) { + self.unmarshal_json(p.vt(), true) +} + +func (self *_Assembler) _asm_OP_unmarshal_p(p *_Instr) { + self.unmarshal_json(p.vt(), false) +} + +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.call(_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.check_eof(1) + self.Emit("CMPB", jit.Sib(_IP, _IC, 1, 0), jit.Imm(int64(p.vb()))) // 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", _ET, _ET) // XORL ET, ET + self.Emit("MOVQ", _ET, jit.Sib(_ST, _AX, 1, 8)) // MOVQ ET, 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())), jit.Ptr(_SP, 16))// MOVQ $(p2.op()), 16(SP) + self.Emit("MOVQ", jit.Imm(int64(p1.op())), jit.Ptr(_SP, 8)) // MOVQ $(p1.op()), 8(SP) + self.Emit("MOVQ", jit.Imm(int64(i)), jit.Ptr(_SP, 0)) // MOVQ $(i), (SP) + self.call_go(_F_println) +} + +var _runtime_writeBarrier uintptr = rt.GcwbAddr() + +//go:linkname gcWriteBarrierAX runtime.gcWriteBarrier +func gcWriteBarrierAX() + +var ( + _V_writeBarrier = jit.Imm(int64(_runtime_writeBarrier)) + + _F_gcWriteBarrierAX = jit.Func(gcWriteBarrierAX) +) + +func (self *_Assembler) WritePtrAX(i int, rec obj.Addr, saveDI bool) { + self.Emit("MOVQ", _V_writeBarrier, _R10) + self.Emit("CMPL", jit.Ptr(_R10, 0), jit.Imm(0)) + self.Sjmp("JE", "_no_writeBarrier" + strconv.Itoa(i) + "_{n}") + if saveDI { + self.save(_DI) + } + self.Emit("LEAQ", rec, _DI) + self.Emit("MOVQ", _F_gcWriteBarrierAX, _R10) // MOVQ ${fn}, AX + self.Rjmp("CALL", _R10) + 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, _R10) + self.Emit("CMPL", jit.Ptr(_R10, 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.Emit("MOVQ", _F_gcWriteBarrierAX, _R10) // MOVQ ${fn}, AX + self.Rjmp("CALL", _R10) + 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}") +} \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/decoder/assembler_amd64_go117.go b/vendor/github.com/bytedance/sonic/decoder/assembler_amd64_go117.go new file mode 100644 index 00000000000..8a70cfff612 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/decoder/assembler_amd64_go117.go @@ -0,0 +1,1922 @@ +//go:build go1.17 && !go1.21 +// +build go1.17,!go1.21 + +/* + * 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 decoder + +import ( + `encoding/json` + `fmt` + `math` + `reflect` + `strconv` + `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` + `github.com/twitchyliquid64/golang-asm/obj/x86` +) + +/** 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 arguements + _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") +) + +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 dismatched 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 dismatched 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_skip : (*_Assembler)._asm_OP_object_skip, + _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_add : (*_Assembler)._asm_OP_add, + _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, _IL } +) + +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.Emit("XCHGQ", _IP, _BP) + self.call(fn) + self.Emit("XCHGQ", _IP, _BP) +} + +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))) +) + +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", _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 +} + +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.Byte(0xcc) + 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(float64) + _Vp_min_f32 = new(float64) +) + +func init() { + *_Vp_max_f32 = math.MaxFloat32 + *_Vp_min_f32 = -math.MaxFloat32 +} + +func (self *_Assembler) range_single_X0() { + self.Emit("MOVSD" , _VAR_st_Dv, _X0) // MOVSD 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("UCOMISD" , jit.Ptr(_CX, 0), _X0) // UCOMISD (CX), X0 + self.Sjmp("JA" , _LB_range_error) // JA _range_error + self.Emit("MOVQ" , _V_min_f32, _CX) // MOVQ _min_f32, CX + self.Emit("MOVSD" , jit.Ptr(_CX, 0), _X1) // MOVSD (CX), X1 + self.Emit("UCOMISD" , _X0, _X1) // UCOMISD X0, X1 + self.Sjmp("JA" , _LB_range_error) // JA _range_error + self.Emit("CVTSD2SS", _X0, _X0) // CVTSD2SS X0, X0 +} + +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_decodeTextUnmarshaler obj.Addr +) + +func init() { + _F_decodeJsonUnmarshaler = jit.Func(decodeJsonUnmarshaler) + _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_object = jit.Imm(int64(native.S_skip_object)) + _F_skip_number = jit.Imm(int64(native.S_skip_number)) +) + +func (self *_Assembler) unmarshal_json(t reflect.Type, deref bool) { + 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.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_decodeJsonUnmarshaler, 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 + self.Sjmp("JNZ" , _LB_error) // JNZ _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("JNZ" , _LB_error) // JNZ _error +} + +/** OpCode Assembler Functions **/ + +var ( + _F_memequal = jit.Func(memequal) + _F_memmove = jit.Func(memmove) + _F_growslice = jit.Func(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 +) + +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) + + /* assgin 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.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.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 + 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 + 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.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.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 + 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 + 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.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.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_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) + 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 +} + +func (self *_Assembler) _asm_OP_object_skip(_ *_Instr) { + self.call_sf(_F_skip_object) // CALL_SF skip_object + self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX + self.Sjmp("JS" , _LB_parsing_error_v) // JS _parse_error_v +} + +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) { + self.unmarshal_json(p.vt(), true) +} + +func (self *_Assembler) _asm_OP_unmarshal_p(p *_Instr) { + self.unmarshal_json(p.vt(), false) +} + +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.check_eof(1) + self.Emit("CMPB", jit.Sib(_IP, _IC, 1, 0), jit.Imm(int64(p.vb()))) // 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) +} + +//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}") +} \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/decoder/compiler.go b/vendor/github.com/bytedance/sonic/decoder/compiler.go new file mode 100644 index 00000000000..b4fc2fed2c1 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/decoder/compiler.go @@ -0,0 +1,1136 @@ +/* + * 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 decoder + +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_skip + _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_add + _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_skip : "object_skip", + _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", +} + +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 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) 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 +} + +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 + } + + pt := reflect.PtrTo(vt) + + /* check for `json.Unmarshaler` with pointer receiver */ + if pt.Implements(jsonUnmarshalerType) { + p.rtt(_OP_unmarshal_p, pt) + return + } + + /* check for `json.Unmarshaler` */ + if vt.Implements(jsonUnmarshalerType) { + p.add(_OP_lspace) + self.compileUnmarshalJson(p, vt) + return + } + + /* check for `encoding.TextMarshaler` with pointer receiver */ + if pt.Implements(encodingTextUnmarshalerType) { + p.add(_OP_lspace) + self.compileUnmarshalTextPtr(p, pt) + return + } + + /* check for `encoding.TextUnmarshaler` */ + if vt.Implements(encodingTextUnmarshalerType) { + p.add(_OP_lspace) + self.compileUnmarshalText(p, vt) + 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 closing quote if needed */ + if op != _OP_map_key_str && op != _OP_map_key_utext && op != _OP_map_key_utext_p { + p.chr(_OP_match_char, '"') + } + + /* 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 closing quote if needed */ + if op != _OP_map_key_str && op != _OP_map_key_utext && op != _OP_map_key_utext_p { + p.chr(_OP_match_char, '"') + } + + /* 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 { + et = et.Elem() + p.rtt(_OP_deref, et) + } + + /* compile the element type */ + self.compileOne(p, sp + 1, et) + j := p.pc() + p.add(_OP_goto) + p.pin(i) + p.add(_OP_nil_1) + 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.rtt(_OP_slice_init, et) + p.add(_OP_save) + p.add(_OP_lspace) + j := p.pc() + p.chr(_OP_check_char, ']') + 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(j) + p.pin(k1) + p.add(_OP_drop) +} + +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) + + skip := self.checkIfSkip(p, vt, '{') + + 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, ',') + + /* special case of an empty struct */ + if len(fv) == 0 { + p.add(_OP_object_skip) + goto end_of_object + } + + /* 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) + } + +end_of_object: + p.pin(x) + p.pin(y1) + p.add(_OP_drop) + p.pin(n) + p.pin(skip) +} + +func (self *_Compiler) compileStructFieldStr(p *_Program, sp int, vt reflect.Type) { + 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) { + 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.rtt(v, vt) + self.compileUnmarshalEnd(p, vt, i) +} + +func (self *_Compiler) compileUnmarshalText(p *_Program, vt reflect.Type) { + 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.rtt(v, vt) + self.compileUnmarshalEnd(p, vt, i) +} + +func (self *_Compiler) compileUnmarshalTextPtr(p *_Program, vt reflect.Type) { + i := p.pc() + p.add(_OP_is_null) + p.chr(_OP_match_char, '"') + p.rtt(_OP_unmarshal_text_p, vt) + 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 +} \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/decoder/debug.go b/vendor/github.com/bytedance/sonic/decoder/debug.go new file mode 100644 index 00000000000..9cf3a6a0021 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/decoder/debug.go @@ -0,0 +1,70 @@ +/* + * 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 decoder + +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() + } +} \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/decoder/decoder.go b/vendor/github.com/bytedance/sonic/decoder/decoder.go new file mode 100644 index 00000000000..5326f9728f6 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/decoder/decoder.go @@ -0,0 +1,245 @@ +/* + * 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 decoder + +import ( + `encoding/json` + `reflect` + `runtime` + + `github.com/bytedance/sonic/internal/native` + `github.com/bytedance/sonic/internal/native/types` + `github.com/bytedance/sonic/internal/rt` + `github.com/bytedance/sonic/option` + `github.com/bytedance/sonic/utf8` +) + +const ( + _F_use_int64 = iota + _F_use_number + _F_disable_urc + _F_disable_unknown + _F_copy_string + _F_validate_string + + _F_allow_control = 31 +) + +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 +) + +func (self *Decoder) SetOptions(opts Options) { + if (opts & OptionUseNumber != 0) && (opts & 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 { + /* validate json if needed */ + if (self.f & (1 << _F_validate_string)) != 0 && !utf8.ValidateString(self.s){ + dbuf := utf8.CorrectWith(nil, rt.Str2Mem(self.s), "\ufffd") + self.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()} + } + + /* create a new stack, and call the decoder */ + sb, etp := newStack(), rt.PtrElem(vv.Type) + nb, err := decodeTypedPointer(self.s, self.i, etp, vp, sb, self.f) + /* return the stack back */ + self.i = nb + freeStack(sb) + + /* avoid GC ahead */ + runtime.KeepAlive(vv) + return err +} + +// 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 { + 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) +} + +// 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 +} \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/decoder/errors.go b/vendor/github.com/bytedance/sonic/decoder/errors.go new file mode 100644 index 00000000000..c905fdfb0c6 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/decoder/errors.go @@ -0,0 +1,181 @@ +/* + * 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 decoder + +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 { + i := 16 + p := self.Pos - i + q := self.Pos + i + + /* check for empty source */ + if self.Src == "" { + return fmt.Sprintf("no sources available: %#v", self) + } + + /* prevent slicing before the beginning */ + if p < 0 { + p, q, i = 0, q - p, i + p + } + + /* prevent slicing beyond the end */ + if n := len(self.Src); q > n { + n = q - n + q = len(self.Src) + + /* move the left bound if possible */ + if p > n { + i += n + p -= n + } + } + + /* left and right length */ + x := clamp_zero(i) + y := clamp_zero(q - p - i - 1) + + /* 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 (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("..."), +} + +//go:nosplit +func error_wrap(src string, pos int, code types.ParsingError) error { + return SyntaxError { + Pos : pos, + Src : src, + Code : code, + } +} + +//go:nosplit +func error_type(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()) +} + +//go:nosplit +func error_mismatch(src string, pos int, vt *rt.GoType) error { + return &MismatchTypeError { + Pos : pos, + Src : src, + Type : vt.Pack(), + } +} + +//go:nosplit +func error_field(name string) error { + return errors.New("json: unknown field " + strconv.Quote(name)) +} + +//go:nosplit +func error_value(value string, vtype reflect.Type) error { + return &json.UnmarshalTypeError { + Type : vtype, + Value : value, + } +} diff --git a/vendor/github.com/bytedance/sonic/decoder/generic_amd64_go116.go b/vendor/github.com/bytedance/sonic/decoder/generic_amd64_go116.go new file mode 100644 index 00000000000..b597043f9d4 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/decoder/generic_amd64_go116.go @@ -0,0 +1,776 @@ +// +build go1.15,!go1.17 + +/* + * 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 decoder + +import ( + `encoding/json` + `fmt` + `reflect` + `strconv` + + `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` + `github.com/twitchyliquid64/golang-asm/obj/x86` +) + +/** Crucial Registers: + * + * ST(BX) : ro, decoder stack + * DF(R10) : ro, decoder flags + * EP(R11) : wo, error pointer + * IP(R12) : ro, input pointer + * IL(R13) : ro, input length + * IC(R14) : 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 = 40 // 40 bytes for saving the registers before CALL instructions + _VD_locals = 88 // 88 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_cs_LR = jit.Ptr(_SP, _VD_fargs + _VD_saves + 56) + _VAR_cs_p = jit.Ptr(_SP, _VD_fargs + _VD_saves + 64) + _VAR_cs_n = jit.Ptr(_SP, _VD_fargs + _VD_saves + 72) + _VAR_cs_d = jit.Ptr(_SP, _VD_fargs + _VD_saves + 80) +) + +type _ValueDecoder struct { + jit.BaseAssembler +} + +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, _AX) // MOVQ ${fn}, AX + self.Rjmp("CALL", _AX) // 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 +} + +/** 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.call(_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", _AX, jit.Ptr(_SP, 0)) // MOVQ AX, (SP) + self.Emit("MOVQ", jit.Imm(_A_init_len), jit.Ptr(_SP, 8)) // MOVQ _A_init_len, 8(SP) + self.Emit("MOVQ", jit.Imm(_A_init_cap), jit.Ptr(_SP, 16)) // MOVQ _A_init_cap, 16(SP) + self.call_go(_F_makeslice) // CALL_GO runtime.makeslice + self.Emit("MOVQ", jit.Ptr(_SP, 24), _DX) // MOVQ 24(SP), DX + + /* pack into an interface */ + self.Emit("MOVQ", _DX, jit.Ptr(_SP, 0)) // MOVQ DX, (SP) + self.Emit("MOVQ", jit.Imm(_A_init_len), jit.Ptr(_SP, 8)) // MOVQ _A_init_len, 8(SP) + self.Emit("MOVQ", jit.Imm(_A_init_cap), jit.Ptr(_SP, 16)) // MOVQ _A_init_cap, 16(SP) + self.call_go(_F_convTslice) // CALL_GO runtime.convTslice + self.Emit("MOVQ", jit.Ptr(_SP, 24), _R8) // MOVQ 24(SP), 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(_SP, 0), _AX) // MOVQ (SP), AX + 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, 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) // 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" , _R8, jit.Ptr(_SP, 0)) // MOVQ R8, (SP) + self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 8)) // MOVQ AX, 8(SP) + self.call_go(_F_convTstring) // CALL_GO runtime.convTstring + self.Emit("MOVQ" , jit.Ptr(_SP, 16), _R9) // MOVQ 16(SP), 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", _T_map, _DX) // MOVQ _T_map, DX + self.Emit("MOVQ", _DX, jit.Ptr(_SP, 0)) // MOVQ DX, (SP) + self.Emit("MOVQ", _SI, jit.Ptr(_SP, 8)) // MOVQ SI, 8(SP) + self.Emit("MOVQ", _R8, jit.Ptr(_SP, 16)) // MOVQ R9, 16(SP) + self.Emit("MOVQ", _AX, jit.Ptr(_SP, 24)) // MOVQ AX, 24(SP) + self.call_go(_F_mapassign_faststr) // CALL_GO runtime.mapassign_faststr + self.Emit("MOVQ", jit.Ptr(_SP, 32), _AX) // MOVQ 32(SP), AX + + /* 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, _CX) // MOVQ _T_byte, CX + self.Emit("MOVQ", _AX, jit.Ptr(_SP, 0)) // MOVQ AX, (SP) + self.Emit("MOVQ", _CX, jit.Ptr(_SP, 8)) // MOVQ CX, 8(SP) + self.Emit("MOVB", jit.Imm(0), jit.Ptr(_SP, 16)) // MOVB $0, 16(SP) + self.call_go(_F_mallocgc) // CALL_GO runtime.mallocgc + self.Emit("MOVQ", jit.Ptr(_SP, 24), _R9) // MOVQ 24(SP), 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.save(_R9) // SAVE R9 + self.call(_F_unquote) // CALL unquote + self.load(_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 + self.Emit("MOVQ" , _VAR_ss_Iv, _AX) // MOVQ ss.Iv, AX + self.Emit("CVTSQ2SD", _AX, _X0) // CVTSQ2SD AX, X0 + + /* represent numbers as `float64` */ + self.Link("_use_float64") // _use_float64: + self.Emit("MOVSD", _X0, jit.Ptr(_SP, 0)) // MOVSD X0, (SP) + self.call_go(_F_convT64) // CALL_GO runtime.convT64 + self.Emit("MOVQ" , _T_float64, _R8) // MOVQ _T_float64, R8 + self.Emit("MOVQ" , jit.Ptr(_SP, 8), _R9) // MOVQ 8(SP), 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, jit.Ptr(_SP, 0)) // MOVQ SI, (SP) + self.Emit("MOVQ", _CX, jit.Ptr(_SP, 8)) // MOVQ CX, 8(SP) + self.call_go(_F_convTstring) // CALL_GO runtime.convTstring + self.Emit("MOVQ", _T_number, _R8) // MOVQ _T_number, R8 + self.Emit("MOVQ", jit.Ptr(_SP, 16), _R9) // MOVQ 16(SP), 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.Emit("MOVQ", _AX, jit.Ptr(_SP, 0)) // MOVQ AX, (SP) + self.call_go(_F_convT64) // CALL_GO runtime.convT64 + self.Emit("MOVQ", _T_int64, _R8) // MOVQ _T_int64, R8 + self.Emit("MOVQ", jit.Ptr(_SP, 8), _R9) // MOVQ 8(SP), 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.Byte(0xcc) + 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)) // CMPQ _AX, _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") + 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), _DX) // 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, _DX) + 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("MOVOU", jit.Ptr(_SI, 0), _X0) // MOVOU (SI), X0 + self.Emit("MOVQ" , jit.Ptr(_SI, 16), _DX) // MOVQ 16(SI), DX + self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 0)) // MOVQ AX, (SP) + self.Emit("MOVOU", _X0, jit.Ptr(_SP, 8)) // MOVOU X0, 8(SP) + self.Emit("MOVQ" , _DX, jit.Ptr(_SP, 24)) // MOVQ DX, 24(SP) + self.Emit("SHLQ" , jit.Imm(1), _DX) // SHLQ $1, DX + self.Emit("MOVQ" , _DX, jit.Ptr(_SP, 32)) // MOVQ DX, 32(SP) + self.call_go(_F_growslice) // CALL_GO runtime.growslice + self.Emit("MOVQ" , jit.Ptr(_SP, 40), _DI) // MOVOU 40(SP), DI + self.Emit("MOVQ" , jit.Ptr(_SP, 48), _DX) // MOVOU 48(SP), DX + self.Emit("MOVQ" , jit.Ptr(_SP, 56), _AX) // MOVQ 56(SP), 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.Byte(0xcc) + self.Emit("MOVQ", _R8, _VAR_cs_p) + self.Emit("MOVQ", _AX, _VAR_cs_n) + self.Emit("MOVQ", _DI, _VAR_cs_LR) + self.Emit("MOVQ", _T_byte, jit.Ptr(_SP, 0)) + self.Emit("MOVQ", _AX, jit.Ptr(_SP, 8)) + self.Emit("MOVQ", _AX, jit.Ptr(_SP, 16)) + self.call_go(_F_makeslice) + self.Emit("MOVQ", jit.Ptr(_SP, 24), _R8) + self.Emit("MOVQ", _R8, _VAR_cs_d) + self.Emit("MOVQ", _R8, jit.Ptr(_SP, 0)) + self.Emit("MOVQ", _VAR_cs_p, _R8) + self.Emit("MOVQ", _R8, jit.Ptr(_SP, 8)) + self.Emit("MOVQ", _VAR_cs_n, _AX) + self.Emit("MOVQ", _AX, jit.Ptr(_SP, 16)) + 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.Byte(0xcc) + 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.Emit("MOVQ", _AX, jit.Ptr(_SP, 0)) // MOVQ AX, (SP) + self.call(_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) + } + } +} + +func (self *_ValueDecoder) WritePtrAX(i int, rec obj.Addr, saveDI bool) { + self.Emit("MOVQ", _V_writeBarrier, _R10) + self.Emit("CMPL", jit.Ptr(_R10, 0), jit.Imm(0)) + self.Sjmp("JE", "_no_writeBarrier" + strconv.Itoa(i) + "_{n}") + if saveDI { + self.save(_DI) + } + self.Emit("LEAQ", rec, _DI) + self.Emit("MOVQ", _F_gcWriteBarrierAX, _R10) // MOVQ ${fn}, AX + self.Rjmp("CALL", _R10) + 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, _R10) + self.Emit("CMPL", jit.Ptr(_R10, 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.Emit("MOVQ", _F_gcWriteBarrierAX, _R10) // MOVQ ${fn}, AX + self.Rjmp("CALL", _R10) + 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}") +} + +/** 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/decoder/generic_amd64_go117.go b/vendor/github.com/bytedance/sonic/decoder/generic_amd64_go117.go new file mode 100644 index 00000000000..df1cd9f5bb7 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/decoder/generic_amd64_go117.go @@ -0,0 +1,772 @@ +//go:build go1.17 && !go1.21 +// +build go1.17,!go1.21 + +/* + * 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 decoder + +import ( + `encoding/json` + `fmt` + `reflect` + `strconv` + + `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` + `github.com/twitchyliquid64/golang-asm/obj/x86` +) + +/** 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.Emit("XCHGQ", _IP, _BP) + self.call(fn) + self.Emit("XCHGQ", _IP, _BP) +} + +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) + } + } +} + +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}") +} + +/** 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/decoder/generic_amd64_go117_test.s b/vendor/github.com/bytedance/sonic/decoder/generic_amd64_go117_test.s new file mode 100644 index 00000000000..6c2686de9ae --- /dev/null +++ b/vendor/github.com/bytedance/sonic/decoder/generic_amd64_go117_test.s @@ -0,0 +1,37 @@ +// +build go1.17,!go1.21 + +// +// 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/decoder/generic_amd64_test.s b/vendor/github.com/bytedance/sonic/decoder/generic_amd64_test.s new file mode 100644 index 00000000000..36cb1f5f399 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/decoder/generic_amd64_test.s @@ -0,0 +1,37 @@ +// +build go1.15,!go1.17 + +// +// 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), BX + MOVQ sp+8(FP), R12 + MOVQ sn+16(FP), R13 + MOVQ ic+24(FP), R14 + MOVQ vp+32(FP), R15 + MOVQ df+40(FP), R10 + MOVQ ·_subr_decode_value(SB), AX + CALL AX + MOVQ R14, rp+48(FP) + MOVQ R11, ex+56(FP) + RET diff --git a/vendor/github.com/bytedance/sonic/decoder/pools.go b/vendor/github.com/bytedance/sonic/decoder/pools.go new file mode 100644 index 00000000000..ab1e5f23c44 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/decoder/pools.go @@ -0,0 +1,143 @@ +/* + * 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 decoder + +import ( + `sync` + `unsafe` + + `github.com/bytedance/sonic/internal/caching` + `github.com/bytedance/sonic/internal/native/types` + `github.com/bytedance/sonic/internal/rt` +) + +const ( + _MinSlice = 16 + _MaxStack = 4096 // 4k slots + _MaxStackBytes = _MaxStack * _PtrBytes + _MaxDigitNums = 800 // 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 + _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 +} + +type _Decoder func( + s string, + i int, + vp unsafe.Pointer, + sb *_Stack, + fv uint64, + sv string, // DO NOT pass value to this arguement, since it is only used for local _VAR_sv + vk unsafe.Pointer, // DO NOT pass value to this arguement, 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 + } +} \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/decoder/primitives.go b/vendor/github.com/bytedance/sonic/decoder/primitives.go new file mode 100644 index 00000000000..d6053e2cb4d --- /dev/null +++ b/vendor/github.com/bytedance/sonic/decoder/primitives.go @@ -0,0 +1,46 @@ +/* + * 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 decoder + +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) + rt.StopProf() + ret, err := fn(s, i, vp, sb, fv, "", nil) + rt.StartProf() + return ret, err + } +} + +func decodeJsonUnmarshaler(vv interface{}, s string) error { + return vv.(json.Unmarshaler).UnmarshalJSON(rt.Str2Mem(s)) +} + +func decodeTextUnmarshaler(vv interface{}, s string) error { + return vv.(encoding.TextUnmarshaler).UnmarshalText(rt.Str2Mem(s)) +} diff --git a/vendor/github.com/bytedance/sonic/decoder/stream.go b/vendor/github.com/bytedance/sonic/decoder/stream.go new file mode 100644 index 00000000000..06dc8185b50 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/decoder/stream.go @@ -0,0 +1,217 @@ +/* + * 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 decoder + +import ( + `bytes` + `io` + `sync` + + `github.com/bytedance/sonic/internal/native/types` +) + +var ( + defaultBufferSize uint = 4096 + growSliceFactorShift uint = 1 + minLeftBufferShift uint = 2 +) + +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, defaultBufferSize) + }, +} + +// 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) { + if self.err != nil { + return self.err + } + + var buf = self.buf[self.scanp:] + var p = 0 + var recycle bool + if cap(buf) == 0 { + buf = bufPool.Get().([]byte) + recycle = true + } + + var first = true + var repeat = true +read_more: + for { + l := len(buf) + realloc(&buf) + n, err := self.r.Read(buf[l:cap(buf)]) + buf = buf[:l+n] + if err != nil { + repeat = false + if err == io.EOF { + if len(buf) == 0 { + return err + } + break + } + self.err = err + return err + } + if n > 0 || first { + break + } + } + first = false + + l := len(buf) + if l > 0 { + self.Decoder.Reset(string(buf)) + err = self.Decoder.Decode(val) + if err != nil { + if repeat && self.repeatable(err) { + goto read_more + } + self.err = err + } + + p = self.Decoder.Pos() + self.scanned += int64(p) + self.scanp = 0 + } + + if l > p { + // remain undecoded bytes, so copy them into self.buf + self.buf = append(self.buf[:0], buf[p:]...) + } else { + self.buf = nil + recycle = true + } + + if recycle { + buf = buf[:0] + bufPool.Put(buf) + } + return err +} + +func (self StreamDecoder) repeatable(err error) bool { + if ee, ok := err.(SyntaxError); ok && + (ee.Code == types.ERR_EOF || (ee.Code == types.ERR_INVALID_CHAR && self.i >= len(self.s)-1)) { + return true + } + return false +} + +// 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 != '}' +} + +func (self *StreamDecoder) peek() (byte, error) { + var err error + for { + for i := self.scanp; i < len(self.buf); i++ { + c := self.buf[i] + if isSpace(c) { + continue + } + self.scanp = i + return c, nil + } + // buffer has been scanned, now report any error + if err != nil { + if err != io.EOF { + self.err = err + } + return 0, err + } + err = self.refill() + } +} + +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) { + l := uint(len(*buf)) + c := uint(cap(*buf)) + if c - l <= c >> minLeftBufferShift { + e := l+(l>>minLeftBufferShift) + if e < defaultBufferSize { + e = defaultBufferSize + } + tmp := make([]byte, l, e) + copy(tmp, *buf) + *buf = tmp + } +} + diff --git a/vendor/github.com/bytedance/sonic/decoder/stubs_go115.go b/vendor/github.com/bytedance/sonic/decoder/stubs_go115.go new file mode 100644 index 00000000000..1a0917c3c3d --- /dev/null +++ b/vendor/github.com/bytedance/sonic/decoder/stubs_go115.go @@ -0,0 +1,111 @@ +// +build go1.15,!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 decoder + +import ( + `unsafe` + `reflect` + + _ `github.com/chenzhuoyu/base64x` + + `github.com/bytedance/sonic/internal/rt` +) + +//go:linkname _subr__b64decode github.com/chenzhuoyu/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:noescape +//go:linkname growslice runtime.growslice +//goland:noinspection GoUnusedParameter +func growslice(et *rt.GoType, old rt.GoSlice, cap int) rt.GoSlice + +//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/decoder/stubs_go120.go b/vendor/github.com/bytedance/sonic/decoder/stubs_go120.go new file mode 100644 index 00000000000..cde6a19728c --- /dev/null +++ b/vendor/github.com/bytedance/sonic/decoder/stubs_go120.go @@ -0,0 +1,111 @@ +// +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 decoder + +import ( + `unsafe` + `reflect` + + _ `github.com/chenzhuoyu/base64x` + + `github.com/bytedance/sonic/internal/rt` +) + +//go:linkname _subr__b64decode github.com/chenzhuoyu/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:noescape +//go:linkname growslice reflect.growslice +//goland:noinspection GoUnusedParameter +func growslice(et *rt.GoType, old rt.GoSlice, cap int) rt.GoSlice + +//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/decoder/types.go b/vendor/github.com/bytedance/sonic/decoder/types.go new file mode 100644 index 00000000000..6fc0e706cef --- /dev/null +++ b/vendor/github.com/bytedance/sonic/decoder/types.go @@ -0,0 +1,58 @@ +/* + * 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 decoder + +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/decoder/utils.go b/vendor/github.com/bytedance/sonic/decoder/utils.go new file mode 100644 index 00000000000..23ee5d5018c --- /dev/null +++ b/vendor/github.com/bytedance/sonic/decoder/utils.go @@ -0,0 +1,39 @@ +/* + * 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 decoder + +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/encoder/asm.s b/vendor/github.com/bytedance/sonic/encoder/asm.s new file mode 100644 index 00000000000..e69de29bb2d diff --git a/vendor/github.com/bytedance/sonic/encoder/assembler_amd64_go116.go b/vendor/github.com/bytedance/sonic/encoder/assembler_amd64_go116.go new file mode 100644 index 00000000000..9b5978431b6 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/encoder/assembler_amd64_go116.go @@ -0,0 +1,1198 @@ +// +build go1.15,!go1.17 + +/* + * 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 ( + `fmt` + `reflect` + `strconv` + `unsafe` + + `github.com/bytedance/sonic/internal/cpu` + `github.com/bytedance/sonic/internal/jit` + `github.com/bytedance/sonic/internal/native/types` + `github.com/twitchyliquid64/golang-asm/obj` + `github.com/twitchyliquid64/golang-asm/obj/x86` + + `github.com/bytedance/sonic/internal/native` + `github.com/bytedance/sonic/internal/rt` +) + +/** Register Allocations + * + * State Registers: + * + * %rbx : stack base + * %rdi : result pointer + * %rsi : result length + * %rdx : result capacity + * %r12 : sp->p + * %r13 : sp->q + * %r14 : sp->x + * %r15 : sp->f + * + * Error Registers: + * + * %r10 : error type register + * %r11 : error pointer register + */ + +/** Function Prototype & Stack Map + * + * func (buf *[]byte, p unsafe.Pointer, sb *_Stack, fv uint64) (err error) + * + * buf : (FP) + * p : 8(FP) + * sb : 16(FP) + * fv : 24(FP) + * err.vt : 32(FP) + * err.vp : 40(FP) + */ + +const ( + _S_cond = iota + _S_init +) + +const ( + _FP_args = 48 // 48 bytes for passing arguments to this function + _FP_fargs = 64 // 64 bytes for passing arguments to other Go functions + _FP_saves = 64 // 64 bytes for saving the registers before CALL instructions + _FP_locals = 24 // 24 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 ( + _FM_exp32 = 0x7f800000 + _FM_exp64 = 0x7ff0000000000000 +) + +const ( + _IM_null = 0x6c6c756e // 'null' + _IM_true = 0x65757274 // 'true' + _IM_fals = 0x736c6166 // 'fals' ('false' without the 'e') + _IM_open = 0x00225c22 // '"\"∅' + _IM_array = 0x5d5b // '[]' + _IM_object = 0x7d7b // '{}' + _IM_mulv = -0x5555555555555555 +) + +const ( + _LB_more_space = "_more_space" + _LB_more_space_return = "_more_space_return_" +) + +const ( + _LB_error = "_error" + _LB_error_too_deep = "_error_too_deep" + _LB_error_invalid_number = "_error_invalid_number" + _LB_error_nan_or_infinite = "_error_nan_or_infinite" + _LB_panic = "_panic" +) + +var ( + _AX = jit.Reg("AX") + _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") +) + +var ( + _X0 = jit.Reg("X0") + _Y0 = jit.Reg("Y0") +) + +var ( + _ST = jit.Reg("BX") + _RP = jit.Reg("DI") + _RL = jit.Reg("SI") + _RC = jit.Reg("DX") +) + +var ( + _LR = jit.Reg("R9") + _R10 = jit.Reg("R10") // used for gcWriterBarrier + _ET = jit.Reg("R10") + _EP = jit.Reg("R11") +) + +var ( + _SP_p = jit.Reg("R12") + _SP_q = jit.Reg("R13") + _SP_x = jit.Reg("R14") + _SP_f = jit.Reg("R15") +) + +var ( + _ARG_rb = jit.Ptr(_SP, _FP_base) + _ARG_vp = jit.Ptr(_SP, _FP_base + 8) + _ARG_sb = jit.Ptr(_SP, _FP_base + 16) + _ARG_fv = jit.Ptr(_SP, _FP_base + 24) +) + +var ( + _RET_et = jit.Ptr(_SP, _FP_base + 32) + _RET_ep = jit.Ptr(_SP, _FP_base + 40) +) + +var ( + _VAR_sp = jit.Ptr(_SP, _FP_fargs + _FP_saves) + _VAR_dn = jit.Ptr(_SP, _FP_fargs + _FP_saves + 8) + _VAR_vp = jit.Ptr(_SP, _FP_fargs + _FP_saves + 16) +) + +var ( + _REG_ffi = []obj.Addr{_RP, _RL, _RC} + _REG_enc = []obj.Addr{_ST, _SP_x, _SP_f, _SP_p, _SP_q, _RL} + _REG_jsr = []obj.Addr{_ST, _SP_x, _SP_f, _SP_p, _SP_q, _LR} + _REG_all = []obj.Addr{_ST, _SP_x, _SP_f, _SP_p, _SP_q, _RP, _RL, _RC} +) + +type _Assembler struct { + jit.BaseAssembler + p _Program + x int + name string +} + +func newAssembler(p _Program) *_Assembler { + return new(_Assembler).Init(p) +} + +/** Assembler Interface **/ +func (self *_Assembler) Load() _Encoder { + return ptoenc(self.BaseAssembler.Load("encode_"+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.builtins() +} + +/** Assembler Stages **/ + +var _OpFuncTab = [256]func(*_Assembler, *_Instr) { + _OP_null : (*_Assembler)._asm_OP_null, + _OP_empty_arr : (*_Assembler)._asm_OP_empty_arr, + _OP_empty_obj : (*_Assembler)._asm_OP_empty_obj, + _OP_bool : (*_Assembler)._asm_OP_bool, + _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_str : (*_Assembler)._asm_OP_str, + _OP_bin : (*_Assembler)._asm_OP_bin, + _OP_quote : (*_Assembler)._asm_OP_quote, + _OP_number : (*_Assembler)._asm_OP_number, + _OP_eface : (*_Assembler)._asm_OP_eface, + _OP_iface : (*_Assembler)._asm_OP_iface, + _OP_byte : (*_Assembler)._asm_OP_byte, + _OP_text : (*_Assembler)._asm_OP_text, + _OP_deref : (*_Assembler)._asm_OP_deref, + _OP_index : (*_Assembler)._asm_OP_index, + _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_is_nil : (*_Assembler)._asm_OP_is_nil, + _OP_is_nil_p1 : (*_Assembler)._asm_OP_is_nil_p1, + _OP_is_zero_1 : (*_Assembler)._asm_OP_is_zero_1, + _OP_is_zero_2 : (*_Assembler)._asm_OP_is_zero_2, + _OP_is_zero_4 : (*_Assembler)._asm_OP_is_zero_4, + _OP_is_zero_8 : (*_Assembler)._asm_OP_is_zero_8, + _OP_is_zero_map : (*_Assembler)._asm_OP_is_zero_map, + _OP_goto : (*_Assembler)._asm_OP_goto, + _OP_map_iter : (*_Assembler)._asm_OP_map_iter, + _OP_map_stop : (*_Assembler)._asm_OP_map_stop, + _OP_map_check_key : (*_Assembler)._asm_OP_map_check_key, + _OP_map_write_key : (*_Assembler)._asm_OP_map_write_key, + _OP_map_value_next : (*_Assembler)._asm_OP_map_value_next, + _OP_slice_len : (*_Assembler)._asm_OP_slice_len, + _OP_slice_next : (*_Assembler)._asm_OP_slice_next, + _OP_marshal : (*_Assembler)._asm_OP_marshal, + _OP_marshal_p : (*_Assembler)._asm_OP_marshal_p, + _OP_marshal_text : (*_Assembler)._asm_OP_marshal_text, + _OP_marshal_text_p : (*_Assembler)._asm_OP_marshal_text_p, + _OP_cond_set : (*_Assembler)._asm_OP_cond_set, + _OP_cond_testc : (*_Assembler)._asm_OP_cond_testc, +} + +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) builtins() { + self.more_space() + self.error_too_deep() + self.error_invalid_number() + self.error_nan_or_infinite() + self.go_panic() +} + +func (self *_Assembler) epilogue() { + self.Mark(len(self.p)) + self.Emit("XORL", _ET, _ET) + self.Emit("XORL", _EP, _EP) + self.Link(_LB_error) + self.Emit("MOVQ", _ARG_rb, _AX) // MOVQ rb<>+0(FP), AX + self.Emit("MOVQ", _RL, jit.Ptr(_AX, 8)) // MOVQ RL, 8(AX) + self.Emit("MOVQ", _ET, _RET_et) // MOVQ ET, et<>+24(FP) + self.Emit("MOVQ", _EP, _RET_ep) // MOVQ EP, ep<>+32(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.load_buffer() // LOAD {buf} + self.Emit("MOVQ", _ARG_vp, _SP_p) // MOVQ vp<>+8(FP), SP.p + self.Emit("MOVQ", _ARG_sb, _ST) // MOVQ sb<>+16(FP), ST + self.Emit("XORL", _SP_x, _SP_x) // XORL SP.x, SP.x + self.Emit("XORL", _SP_f, _SP_f) // XORL SP.f, SP.f + self.Emit("XORL", _SP_q, _SP_q) // XORL SP.q, SP.q +} + +/** Assembler Inline Functions **/ + +func (self *_Assembler) xsave(reg ...obj.Addr) { + for i, v := range reg { + 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) xload(reg ...obj.Addr) { + for i, v := range reg { + 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) rbuf_di() { + if _RP.Reg != x86.REG_DI { + panic("register allocation messed up: RP != DI") + } else { + self.Emit("ADDQ", _RL, _RP) + } +} + +func (self *_Assembler) store_int(nd int, fn obj.Addr, ins string) { + self.check_size(nd) + self.save_c() // SAVE $C_regs + self.rbuf_di() // MOVQ RP, DI + self.Emit(ins, jit.Ptr(_SP_p, 0), _SI) // $ins (SP.p), SI + self.call_c(fn) // CALL_C $fn + self.Emit("ADDQ", _AX, _RL) // ADDQ AX, RL +} + +func (self *_Assembler) store_str(s string) { + i := 0 + m := rt.Str2Mem(s) + + /* 8-byte stores */ + for i <= len(m) - 8 { + self.Emit("MOVQ", jit.Imm(rt.Get64(m[i:])), _AX) // MOVQ $s[i:], AX + self.Emit("MOVQ", _AX, jit.Sib(_RP, _RL, 1, int64(i))) // MOVQ AX, i(RP)(RL) + i += 8 + } + + /* 4-byte stores */ + if i <= len(m) - 4 { + self.Emit("MOVL", jit.Imm(int64(rt.Get32(m[i:]))), jit.Sib(_RP, _RL, 1, int64(i))) // MOVL $s[i:], i(RP)(RL) + i += 4 + } + + /* 2-byte stores */ + if i <= len(m) - 2 { + self.Emit("MOVW", jit.Imm(int64(rt.Get16(m[i:]))), jit.Sib(_RP, _RL, 1, int64(i))) // MOVW $s[i:], i(RP)(RL) + i += 2 + } + + /* last byte */ + if i < len(m) { + self.Emit("MOVB", jit.Imm(int64(m[i])), jit.Sib(_RP, _RL, 1, int64(i))) // MOVB $s[i:], i(RP)(RL) + } +} + +func (self *_Assembler) check_size(n int) { + self.check_size_rl(jit.Ptr(_RL, int64(n))) +} + +func (self *_Assembler) check_size_r(r obj.Addr, d int) { + self.check_size_rl(jit.Sib(_RL, r, 1, int64(d))) +} + +func (self *_Assembler) check_size_rl(v obj.Addr) { + idx := self.x + key := _LB_more_space_return + strconv.Itoa(idx) + + /* the following code relies on LR == R9 to work */ + if _LR.Reg != x86.REG_R9 { + panic("register allocation messed up: LR != R9") + } + + /* check for buffer capacity */ + self.x++ + self.Emit("LEAQ", v, _AX) // LEAQ $v, AX + self.Emit("CMPQ", _AX, _RC) // CMPQ AX, RC + self.Sjmp("JBE" , key) // JBE _more_space_return_{n} + self.slice_grow_ax(key) // GROW $key + self.Link(key) // _more_space_return_{n}: +} + +func (self *_Assembler) slice_grow_ax(ret string) { + self.Byte(0x4c, 0x8d, 0x0d) // LEAQ ?(PC), R9 + self.Sref(ret, 4) // .... &ret + self.Sjmp("JMP" , _LB_more_space) // JMP _more_space +} + +/** State Stack Helpers **/ + +const ( + _StateSize = int64(unsafe.Sizeof(_State{})) + _StackLimit = _MaxStack * _StateSize +) + +func (self *_Assembler) save_state() { + self.Emit("MOVQ", jit.Ptr(_ST, 0), _CX) // MOVQ (ST), CX + self.Emit("LEAQ", jit.Ptr(_CX, _StateSize), _R8) // LEAQ _StateSize(CX), R8 + self.Emit("CMPQ", _R8, jit.Imm(_StackLimit)) // CMPQ R8, $_StackLimit + self.Sjmp("JAE" , _LB_error_too_deep) // JA _error_too_deep + self.Emit("MOVQ", _SP_x, jit.Sib(_ST, _CX, 1, 8)) // MOVQ SP.x, 8(ST)(CX) + self.Emit("MOVQ", _SP_f, jit.Sib(_ST, _CX, 1, 16)) // MOVQ SP.f, 16(ST)(CX) + self.WriteRecNotAX(0, _SP_p, jit.Sib(_ST, _CX, 1, 24)) // MOVQ SP.p, 24(ST)(CX) + self.WriteRecNotAX(1, _SP_q, jit.Sib(_ST, _CX, 1, 32)) // MOVQ SP.q, 32(ST)(CX) + self.Emit("MOVQ", _R8, jit.Ptr(_ST, 0)) // MOVQ R8, (ST) +} + +func (self *_Assembler) drop_state(decr int64) { + self.Emit("MOVQ" , jit.Ptr(_ST, 0), _AX) // MOVQ (ST), AX + self.Emit("SUBQ" , jit.Imm(decr), _AX) // SUBQ $decr, AX + self.Emit("MOVQ" , _AX, jit.Ptr(_ST, 0)) // MOVQ AX, (ST) + self.Emit("MOVQ" , jit.Sib(_ST, _AX, 1, 8), _SP_x) // MOVQ 8(ST)(AX), SP.x + self.Emit("MOVQ" , jit.Sib(_ST, _AX, 1, 16), _SP_f) // MOVQ 16(ST)(AX), SP.f + self.Emit("MOVQ" , jit.Sib(_ST, _AX, 1, 24), _SP_p) // MOVQ 24(ST)(AX), SP.p + self.Emit("MOVQ" , jit.Sib(_ST, _AX, 1, 32), _SP_q) // MOVQ 32(ST)(AX), SP.q + self.Emit("PXOR" , _X0, _X0) // PXOR X0, X0 + self.Emit("MOVOU", _X0, jit.Sib(_ST, _AX, 1, 8)) // MOVOU X0, 8(ST)(AX) + self.Emit("MOVOU", _X0, jit.Sib(_ST, _AX, 1, 24)) // MOVOU X0, 24(ST)(AX) +} + +/** Buffer Helpers **/ + +func (self *_Assembler) add_char(ch byte) { + self.Emit("MOVB", jit.Imm(int64(ch)), jit.Sib(_RP, _RL, 1, 0)) // MOVB $ch, (RP)(RL) + self.Emit("ADDQ", jit.Imm(1), _RL) // ADDQ $1, RL +} + +func (self *_Assembler) add_long(ch uint32, n int64) { + self.Emit("MOVL", jit.Imm(int64(ch)), jit.Sib(_RP, _RL, 1, 0)) // MOVL $ch, (RP)(RL) + self.Emit("ADDQ", jit.Imm(n), _RL) // ADDQ $n, RL +} + +func (self *_Assembler) add_text(ss string) { + self.store_str(ss) // TEXT $ss + self.Emit("ADDQ", jit.Imm(int64(len(ss))), _RL) // ADDQ ${len(ss)}, RL +} + +func (self *_Assembler) prep_buffer() { + self.Emit("MOVQ", _ARG_rb, _AX) // MOVQ rb<>+0(FP), AX + self.Emit("MOVQ", _RL, jit.Ptr(_AX, 8)) // MOVQ RL, 8(AX) + self.Emit("MOVQ", _AX, jit.Ptr(_SP, 0)) // MOVQ AX, (SP) +} + +func (self *_Assembler) prep_buffer_c() { + self.Emit("MOVQ", _ARG_rb, _DI) // MOVQ rb<>+0(FP), DI + self.Emit("MOVQ", _RL, jit.Ptr(_DI, 8)) // MOVQ RL, 8(DI) +} + +func (self *_Assembler) save_buffer() { + self.Emit("MOVQ", _ARG_rb, _CX) // MOVQ rb<>+0(FP), CX + self.Emit("MOVQ", _RP, jit.Ptr(_CX, 0)) // MOVQ RP, (CX) + self.Emit("MOVQ", _RL, jit.Ptr(_CX, 8)) // MOVQ RL, 8(CX) + self.Emit("MOVQ", _RC, jit.Ptr(_CX, 16)) // MOVQ RC, 16(CX) +} + +func (self *_Assembler) load_buffer() { + self.Emit("MOVQ", _ARG_rb, _AX) // MOVQ rb<>+0(FP), AX + self.Emit("MOVQ", jit.Ptr(_AX, 0), _RP) // MOVQ (AX), RP + self.Emit("MOVQ", jit.Ptr(_AX, 8), _RL) // MOVQ 8(AX), RL + self.Emit("MOVQ", jit.Ptr(_AX, 16), _RC) // MOVQ 16(AX), RC +} + +/** Function Interface Helpers **/ + +func (self *_Assembler) call(pc obj.Addr) { + self.Emit("MOVQ", pc, _AX) // MOVQ $pc, AX + self.Rjmp("CALL", _AX) // CALL AX +} + +func (self *_Assembler) save_c() { + self.xsave(_REG_ffi...) // SAVE $REG_ffi +} + +func (self *_Assembler) call_c(pc obj.Addr) { + self.call(pc) // CALL $pc + self.xload(_REG_ffi...) // LOAD $REG_ffi +} + +func (self *_Assembler) call_go(pc obj.Addr) { + self.xsave(_REG_all...) // SAVE $REG_all + self.call(pc) // CALL $pc + self.xload(_REG_all...) // LOAD $REG_all +} + +func (self *_Assembler) call_encoder(pc obj.Addr) { + self.xsave(_REG_enc...) // SAVE $REG_enc + self.call(pc) // CALL $pc + self.xload(_REG_enc...) // LOAD $REG_enc + self.load_buffer() // LOAD {buf} +} + +func (self *_Assembler) call_marshaler(fn obj.Addr, it *rt.GoType, vt reflect.Type) { + switch vt.Kind() { + case reflect.Interface : self.call_marshaler_i(fn, it) + case reflect.Ptr, reflect.Map: self.call_marshaler_v(fn, it, vt, true) + default : self.call_marshaler_v(fn, it, vt, false) + } +} + +func (self *_Assembler) call_marshaler_i(fn obj.Addr, it *rt.GoType) { + self.Emit("MOVQ" , jit.Gtype(it), _AX) // MOVQ $it, AX + self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 0)) // MOVQ AX, (SP) + self.Emit("MOVQ" , jit.Ptr(_SP_p, 0), _AX) // MOVQ (SP.p), AX + self.Emit("MOVQ" , jit.Ptr(_SP_p, 8), _CX) // MOVQ 8(SP.p), CX + self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX + self.Sjmp("JZ" , "_null_{n}") // JZ _null_{n} + self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 8)) // MOVQ AX, 8(SP) + self.Emit("MOVQ" , _CX, jit.Ptr(_SP, 16)) // MOVQ CX, 16(SP) + self.call_go(_F_assertI2I) // CALL_GO assertI2I + self.prep_buffer() // MOVE {buf}, (SP) + self.Emit("MOVOU", jit.Ptr(_SP, 24), _X0) // MOVOU 24(SP), X0 + self.Emit("MOVOU", _X0, jit.Ptr(_SP, 8)) // MOVOU X0, 8(SP) + self.Emit("MOVQ", _ARG_fv, _CX) // MOVQ ARG.fv, CX + self.Emit("MOVQ", _CX, jit.Ptr(_SP, 24)) // MOVQ CX, 24(SP) + self.call_encoder(fn) // CALL $fn + self.Emit("MOVQ" , jit.Ptr(_SP, 32), _ET) // MOVQ 32(SP), ET + self.Emit("MOVQ" , jit.Ptr(_SP, 40), _EP) // MOVQ 40(SP), EP + self.Emit("TESTQ", _ET, _ET) // TESTQ ET, ET + self.Sjmp("JNZ" , _LB_error) // JNZ _error + self.Sjmp("JMP" , "_done_{n}") // JMP _done_{n} + self.Link("_null_{n}") // _null_{n}: + self.check_size(4) // SIZE $4 + self.Emit("MOVL", jit.Imm(_IM_null), jit.Sib(_RP, _RL, 1, 0)) // MOVL $'null', (RP)(RL*1) + self.Emit("ADDQ", jit.Imm(4), _RL) // ADDQ $4, RL + self.Link("_done_{n}") // _done_{n}: +} + +func (self *_Assembler) call_marshaler_v(fn obj.Addr, it *rt.GoType, vt reflect.Type, deref bool) { + self.prep_buffer() // MOVE {buf}, (SP) + self.Emit("MOVQ", jit.Itab(it, vt), _AX) // MOVQ $(itab(it, vt)), AX + self.Emit("MOVQ", _AX, jit.Ptr(_SP, 8)) // MOVQ AX, 8(SP) + + /* dereference the pointer if needed */ + if !deref { + self.Emit("MOVQ", _SP_p, jit.Ptr(_SP, 16)) // MOVQ SP.p, 16(SP) + } else { + self.Emit("MOVQ", jit.Ptr(_SP_p, 0), _AX) // MOVQ (SP.p), AX + self.Emit("MOVQ", _AX, jit.Ptr(_SP, 16)) // MOVQ AX, 16(SP) + } + + /* call the encoder, and perform error checks */ + self.Emit("MOVQ", _ARG_fv, _CX) // MOVQ ARG.fv, CX + self.Emit("MOVQ", _CX, jit.Ptr(_SP, 24)) // MOVQ CX, 24(SP) + self.call_encoder(fn) // CALL $fn + self.Emit("MOVQ" , jit.Ptr(_SP, 32), _ET) // MOVQ 32(SP), ET + self.Emit("MOVQ" , jit.Ptr(_SP, 40), _EP) // MOVQ 40(SP), EP + self.Emit("TESTQ", _ET, _ET) // TESTQ ET, ET + self.Sjmp("JNZ" , _LB_error) // JNZ _error +} + +/** Builtin: _more_space **/ + +var ( + _T_byte = jit.Type(byteType) + _F_growslice = jit.Func(growslice) +) + +func (self *_Assembler) more_space() { + self.Link(_LB_more_space) + self.Emit("MOVQ", _T_byte, jit.Ptr(_SP, 0)) // MOVQ $_T_byte, (SP) + self.Emit("MOVQ", _RP, jit.Ptr(_SP, 8)) // MOVQ RP, 8(SP) + self.Emit("MOVQ", _RL, jit.Ptr(_SP, 16)) // MOVQ RL, 16(SP) + self.Emit("MOVQ", _RC, jit.Ptr(_SP, 24)) // MOVQ RC, 24(SP) + self.Emit("MOVQ", _AX, jit.Ptr(_SP, 32)) // MOVQ AX, 32(SP) + self.xsave(_REG_jsr...) // SAVE $REG_jsr + self.call(_F_growslice) // CALL $pc + self.xload(_REG_jsr...) // LOAD $REG_jsr + self.Emit("MOVQ", jit.Ptr(_SP, 40), _RP) // MOVQ 40(SP), RP + self.Emit("MOVQ", jit.Ptr(_SP, 48), _RL) // MOVQ 48(SP), RL + self.Emit("MOVQ", jit.Ptr(_SP, 56), _RC) // MOVQ 56(SP), RC + self.save_buffer() // SAVE {buf} + self.Rjmp("JMP" , _LR) // JMP LR +} + +/** Builtin Errors **/ + +var ( + _V_ERR_too_deep = jit.Imm(int64(uintptr(unsafe.Pointer(_ERR_too_deep)))) + _V_ERR_nan_or_infinite = jit.Imm(int64(uintptr(unsafe.Pointer(_ERR_nan_or_infinite)))) + _I_json_UnsupportedValueError = jit.Itab(rt.UnpackType(errorType), jsonUnsupportedValueType) +) + +func (self *_Assembler) error_too_deep() { + self.Link(_LB_error_too_deep) + self.Emit("MOVQ", _V_ERR_too_deep, _EP) // MOVQ $_V_ERR_too_deep, EP + self.Emit("MOVQ", _I_json_UnsupportedValueError, _ET) // MOVQ $_I_json_UnsupportedValuError, ET + self.Sjmp("JMP" , _LB_error) // JMP _error +} + +func (self *_Assembler) error_invalid_number() { + self.Link(_LB_error_invalid_number) + self.call_go(_F_error_number) // CALL_GO error_number + self.Emit("MOVQ", jit.Ptr(_SP, 16), _ET) // MOVQ 16(SP), ET + self.Emit("MOVQ", jit.Ptr(_SP, 24), _EP) // MOVQ 24(SP), EP + self.Sjmp("JMP" , _LB_error) // JMP _error +} + +func (self *_Assembler) error_nan_or_infinite() { + self.Link(_LB_error_nan_or_infinite) + self.Emit("MOVQ", _V_ERR_nan_or_infinite, _EP) // MOVQ $_V_ERR_nan_or_infinite, EP + self.Emit("MOVQ", _I_json_UnsupportedValueError, _ET) // MOVQ $_I_json_UnsupportedValuError, ET + self.Sjmp("JMP" , _LB_error) // JMP _error +} + +/** String Encoding Routine **/ + +var ( + _F_quote = jit.Imm(int64(native.S_quote)) + _F_panic = jit.Func(goPanic) +) + +func (self *_Assembler) go_panic() { + self.Link(_LB_panic) + self.Emit("MOVQ", _SP_p, jit.Ptr(_SP, 8)) + self.call_go(_F_panic) +} + +func (self *_Assembler) encode_string(doubleQuote bool) { + self.Emit("MOVQ" , jit.Ptr(_SP_p, 8), _AX) // MOVQ 8(SP.p), AX + self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX + self.Sjmp("JZ" , "_str_empty_{n}") // JZ _str_empty_{n} + self.Emit("CMPQ", jit.Ptr(_SP_p, 0), jit.Imm(0)) + self.Sjmp("JNE" , "_str_next_{n}") + self.Emit("MOVQ", jit.Imm(int64(panicNilPointerOfNonEmptyString)), jit.Ptr(_SP, 0)) + self.Sjmp("JMP", _LB_panic) + self.Link("_str_next_{n}") + + /* openning quote, check for double quote */ + if !doubleQuote { + self.check_size_r(_AX, 2) // SIZE $2 + self.add_char('"') // CHAR $'"' + } else { + self.check_size_r(_AX, 6) // SIZE $6 + self.add_long(_IM_open, 3) // TEXT $`"\"` + } + + /* quoting loop */ + self.Emit("XORL", _AX, _AX) // XORL AX, AX + self.Emit("MOVQ", _AX, _VAR_sp) // MOVQ AX, sp + self.Link("_str_loop_{n}") // _str_loop_{n}: + self.save_c() // SAVE $REG_ffi + + /* load the output buffer first, and then input buffer, + * because the parameter registers collide with RP / RL / RC */ + self.Emit("MOVQ", _RC, _CX) // MOVQ RC, CX + self.Emit("SUBQ", _RL, _CX) // SUBQ RL, CX + self.Emit("MOVQ", _CX, _VAR_dn) // MOVQ CX, dn + self.Emit("LEAQ", jit.Sib(_RP, _RL, 1, 0), _DX) // LEAQ (RP)(RL), DX + self.Emit("LEAQ", _VAR_dn, _CX) // LEAQ dn, CX + self.Emit("MOVQ", _VAR_sp, _AX) // MOVQ sp, AX + self.Emit("MOVQ", jit.Ptr(_SP_p, 0), _DI) // MOVQ (SP.p), DI + self.Emit("MOVQ", jit.Ptr(_SP_p, 8), _SI) // MOVQ 8(SP.p), SI + self.Emit("ADDQ", _AX, _DI) // ADDQ AX, DI + self.Emit("SUBQ", _AX, _SI) // SUBQ AX, SI + + /* set the flags based on `doubleQuote` */ + if !doubleQuote { + self.Emit("XORL", _R8, _R8) // XORL R8, R8 + } else { + self.Emit("MOVL", jit.Imm(types.F_DOUBLE_UNQUOTE), _R8) // MOVL ${types.F_DOUBLE_UNQUOTE}, R8 + } + + /* call the native quoter */ + self.call_c(_F_quote) // CALL quote + self.Emit("ADDQ" , _VAR_dn, _RL) // ADDQ dn, RL + self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX + self.Sjmp("JS" , "_str_space_{n}") // JS _str_space_{n} + + /* close the string, check for double quote */ + if !doubleQuote { + self.check_size(1) // SIZE $1 + self.add_char('"') // CHAR $'"' + self.Sjmp("JMP", "_str_end_{n}") // JMP _str_end_{n} + } else { + self.check_size(3) // SIZE $3 + self.add_text("\\\"\"") // TEXT $'\""' + self.Sjmp("JMP", "_str_end_{n}") // JMP _str_end_{n} + } + + /* not enough space to contain the quoted string */ + self.Link("_str_space_{n}") // _str_space_{n}: + self.Emit("NOTQ", _AX) // NOTQ AX + self.Emit("ADDQ", _AX, _VAR_sp) // ADDQ AX, sp + self.Emit("LEAQ", jit.Sib(_RC, _RC, 1, 0), _AX) // LEAQ (RC)(RC), AX + self.slice_grow_ax("_str_loop_{n}") // GROW _str_loop_{n} + + /* empty string, check for double quote */ + if !doubleQuote { + self.Link("_str_empty_{n}") // _str_empty_{n}: + self.check_size(2) // SIZE $2 + self.add_text("\"\"") // TEXT $'""' + self.Link("_str_end_{n}") // _str_end_{n}: + } else { + self.Link("_str_empty_{n}") // _str_empty_{n}: + self.check_size(6) // SIZE $6 + self.add_text("\"\\\"\\\"\"") // TEXT $'"\"\""' + self.Link("_str_end_{n}") // _str_end_{n}: + } +} + +/** OpCode Assembler Functions **/ + +var ( + _T_json_Marshaler = rt.UnpackType(jsonMarshalerType) + _T_encoding_TextMarshaler = rt.UnpackType(encodingTextMarshalerType) +) + +var ( + _F_f64toa = jit.Imm(int64(native.S_f64toa)) + _F_f32toa = jit.Imm(int64(native.S_f32toa)) + _F_i64toa = jit.Imm(int64(native.S_i64toa)) + _F_u64toa = jit.Imm(int64(native.S_u64toa)) + _F_b64encode = jit.Imm(int64(_subr__b64encode)) +) + +var ( + _F_memmove = jit.Func(memmove) + _F_error_number = jit.Func(error_number) + _F_isValidNumber = jit.Func(isValidNumber) +) + +var ( + _F_iteratorStop = jit.Func(iteratorStop) + _F_iteratorNext = jit.Func(iteratorNext) + _F_iteratorStart = jit.Func(iteratorStart) +) + +var ( + _F_encodeTypedPointer obj.Addr + _F_encodeJsonMarshaler obj.Addr + _F_encodeTextMarshaler obj.Addr +) + +const ( + _MODE_AVX2 = 1 << 2 +) + +func init() { + _F_encodeTypedPointer = jit.Func(encodeTypedPointer) + _F_encodeJsonMarshaler = jit.Func(encodeJsonMarshaler) + _F_encodeTextMarshaler = jit.Func(encodeTextMarshaler) +} + +func (self *_Assembler) _asm_OP_null(_ *_Instr) { + self.check_size(4) + self.Emit("MOVL", jit.Imm(_IM_null), jit.Sib(_RP, _RL, 1, 0)) // MOVL $'null', (RP)(RL*1) + self.Emit("ADDQ", jit.Imm(4), _RL) // ADDQ $4, RL +} + +func (self *_Assembler) _asm_OP_empty_arr(_ *_Instr) { + self.Emit("BTQ", jit.Imm(int64(bitNoNullSliceOrMap)), _ARG_fv) + self.Sjmp("JC", "_empty_arr_{n}") + self._asm_OP_null(nil) + self.Sjmp("JMP", "_empty_arr_end_{n}") + self.Link("_empty_arr_{n}") + self.check_size(2) + self.Emit("MOVW", jit.Imm(_IM_array), jit.Sib(_RP, _RL, 1, 0)) + self.Emit("ADDQ", jit.Imm(2), _RL) + self.Link("_empty_arr_end_{n}") +} + +func (self *_Assembler) _asm_OP_empty_obj(_ *_Instr) { + self.Emit("BTQ", jit.Imm(int64(bitNoNullSliceOrMap)), _ARG_fv) + self.Sjmp("JC", "_empty_obj_{n}") + self._asm_OP_null(nil) + self.Sjmp("JMP", "_empty_obj_end_{n}") + self.Link("_empty_obj_{n}") + self.check_size(2) + self.Emit("MOVW", jit.Imm(_IM_object), jit.Sib(_RP, _RL, 1, 0)) + self.Emit("ADDQ", jit.Imm(2), _RL) + self.Link("_empty_obj_end_{n}") +} + +func (self *_Assembler) _asm_OP_bool(_ *_Instr) { + self.Emit("CMPB", jit.Ptr(_SP_p, 0), jit.Imm(0)) // CMPB (SP.p), $0 + self.Sjmp("JE" , "_false_{n}") // JE _false_{n} + self.check_size(4) // SIZE $4 + self.Emit("MOVL", jit.Imm(_IM_true), jit.Sib(_RP, _RL, 1, 0)) // MOVL $'true', (RP)(RL*1) + self.Emit("ADDQ", jit.Imm(4), _RL) // ADDQ $4, RL + self.Sjmp("JMP" , "_end_{n}") // JMP _end_{n} + self.Link("_false_{n}") // _false_{n}: + self.check_size(5) // SIZE $5 + self.Emit("MOVL", jit.Imm(_IM_fals), jit.Sib(_RP, _RL, 1, 0)) // MOVL $'fals', (RP)(RL*1) + self.Emit("MOVB", jit.Imm('e'), jit.Sib(_RP, _RL, 1, 4)) // MOVB $'e', 4(RP)(RL*1) + self.Emit("ADDQ", jit.Imm(5), _RL) // ADDQ $5, RL + self.Link("_end_{n}") // _end_{n}: +} + +func (self *_Assembler) _asm_OP_i8(_ *_Instr) { + self.store_int(4, _F_i64toa, "MOVBQSX") +} + +func (self *_Assembler) _asm_OP_i16(_ *_Instr) { + self.store_int(6, _F_i64toa, "MOVWQSX") +} + +func (self *_Assembler) _asm_OP_i32(_ *_Instr) { + self.store_int(17, _F_i64toa, "MOVLQSX") +} + +func (self *_Assembler) _asm_OP_i64(_ *_Instr) { + self.store_int(21, _F_i64toa, "MOVQ") +} + +func (self *_Assembler) _asm_OP_u8(_ *_Instr) { + self.store_int(3, _F_u64toa, "MOVBQZX") +} + +func (self *_Assembler) _asm_OP_u16(_ *_Instr) { + self.store_int(5, _F_u64toa, "MOVWQZX") +} + +func (self *_Assembler) _asm_OP_u32(_ *_Instr) { + self.store_int(16, _F_u64toa, "MOVLQZX") +} + +func (self *_Assembler) _asm_OP_u64(_ *_Instr) { + self.store_int(20, _F_u64toa, "MOVQ") +} + +func (self *_Assembler) _asm_OP_f32(_ *_Instr) { + self.check_size(32) + self.Emit("MOVL" , jit.Ptr(_SP_p, 0), _AX) // MOVL (SP.p), AX + self.Emit("ANDL" , jit.Imm(_FM_exp32), _AX) // ANDL $_FM_exp32, AX + self.Emit("XORL" , jit.Imm(_FM_exp32), _AX) // XORL $_FM_exp32, AX + self.Sjmp("JZ" , _LB_error_nan_or_infinite) // JZ _error_nan_or_infinite + self.save_c() // SAVE $C_regs + self.rbuf_di() // MOVQ RP, DI + self.Emit("MOVSS" , jit.Ptr(_SP_p, 0), _X0) // MOVSS (SP.p), X0 + self.call_c(_F_f32toa) // CALL_C f64toa + self.Emit("ADDQ" , _AX, _RL) // ADDQ AX, RL +} + +func (self *_Assembler) _asm_OP_f64(_ *_Instr) { + self.check_size(32) + self.Emit("MOVQ" , jit.Ptr(_SP_p, 0), _AX) // MOVQ (SP.p), AX + self.Emit("MOVQ" , jit.Imm(_FM_exp64), _CX) // MOVQ $_FM_exp64, CX + self.Emit("ANDQ" , _CX, _AX) // ANDQ CX, AX + self.Emit("XORQ" , _CX, _AX) // XORQ CX, AX + self.Sjmp("JZ" , _LB_error_nan_or_infinite) // JZ _error_nan_or_infinite + self.save_c() // SAVE $C_regs + self.rbuf_di() // MOVQ RP, DI + self.Emit("MOVSD" , jit.Ptr(_SP_p, 0), _X0) // MOVSD (SP.p), X0 + self.call_c(_F_f64toa) // CALL_C f64toa + self.Emit("ADDQ" , _AX, _RL) // ADDQ AX, RL +} + +func (self *_Assembler) _asm_OP_str(_ *_Instr) { + self.encode_string(false) +} + +func (self *_Assembler) _asm_OP_bin(_ *_Instr) { + self.Emit("MOVQ", jit.Ptr(_SP_p, 8), _AX) // MOVQ 8(SP.p), AX + self.Emit("ADDQ", jit.Imm(2), _AX) // ADDQ $2, AX + self.Emit("MOVQ", jit.Imm(_IM_mulv), _CX) // MOVQ $_MF_mulv, CX + self.Emit("MOVQ", _DX, _R8) // MOVQ DX, R8 + self.From("MULQ", _CX) // MULQ CX + self.Emit("LEAQ", jit.Sib(_DX, _DX, 1, 1), _AX) // LEAQ 1(DX)(DX), AX + self.Emit("ORQ" , jit.Imm(2), _AX) // ORQ $2, AX + self.Emit("MOVQ", _R8, _DX) // MOVQ R8, DX + self.check_size_r(_AX, 0) // SIZE AX + self.add_char('"') // CHAR $'"' + self.save_c() // SAVE $REG_ffi + self.prep_buffer_c() // MOVE {buf}, DI + self.Emit("MOVQ", _SP_p, _SI) // MOVQ SP.p, SI + + /* check for AVX2 support */ + if !cpu.HasAVX2 { + self.Emit("XORL", _DX, _DX) // XORL DX, DX + } else { + self.Emit("MOVL", jit.Imm(_MODE_AVX2), _DX) // MOVL $_MODE_AVX2, DX + } + + /* call the encoder */ + self.call_c(_F_b64encode) // CALL b64encode + self.load_buffer() // LOAD {buf} + self.add_char('"') // CHAR $'"' +} + +func (self *_Assembler) _asm_OP_quote(_ *_Instr) { + self.encode_string(true) +} + +func (self *_Assembler) _asm_OP_number(_ *_Instr) { + self.Emit("MOVQ" , jit.Ptr(_SP_p, 8), _CX) // MOVQ (SP.p), CX + self.Emit("TESTQ", _CX, _CX) // TESTQ CX, CX + self.Sjmp("JZ" , "_empty_{n}") // JZ _empty_{n} + self.Emit("MOVQ" , jit.Ptr(_SP_p, 0), _AX) // MOVQ (SP.p), AX + self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX + self.Sjmp("JNZ" , "_number_next_{n}") + self.Emit("MOVQ", jit.Imm(int64(panicNilPointerOfNonEmptyString)), jit.Ptr(_SP, 0)) + self.Sjmp("JMP", _LB_panic) + self.Link("_number_next_{n}") + self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 0)) // MOVQ AX, (SP) + self.Emit("MOVQ" , _CX, jit.Ptr(_SP, 8)) // MOVQ CX, 8(SP) + self.call_go(_F_isValidNumber) // CALL_GO isValidNumber + self.Emit("CMPB" , jit.Ptr(_SP, 16), jit.Imm(0)) // CMPB 16(SP), $0 + self.Sjmp("JE" , _LB_error_invalid_number) // JE _error_invalid_number + self.Emit("MOVQ" , jit.Ptr(_SP_p, 8), _AX) // MOVQ 8(SP.p), AX + self.check_size_r(_AX, 0) // SIZE AX + self.Emit("LEAQ" , jit.Sib(_RP, _RL, 1, 0), _AX) // LEAQ (RP)(RL), AX + self.Emit("ADDQ" , jit.Ptr(_SP_p, 8), _RL) // ADDQ 8(SP.p), RL + self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 0)) // MOVQ AX, (SP) + self.Emit("MOVOU", jit.Ptr(_SP_p, 0), _X0) // MOVOU (SP.p), X0 + self.Emit("MOVOU", _X0, jit.Ptr(_SP, 8)) // MOVOU X0, 8(SP) + self.call_go(_F_memmove) // CALL_GO memmove + self.Sjmp("JMP" , "_done_{n}") // JMP _done_{n} + self.Link("_empty_{n}") // _empty_{n}: + self.check_size(1) // SIZE $1 + self.add_char('0') // CHAR $'0' + self.Link("_done_{n}") // _done_{n}: +} + +func (self *_Assembler) _asm_OP_eface(_ *_Instr) { + self.prep_buffer() // MOVE {buf}, (SP)s + self.Emit("MOVQ" , jit.Ptr(_SP_p, 0), _AX) // MOVQ (SP.p), AX + self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 8)) // MOVQ AX, 8(SP) + self.Emit("LEAQ" , jit.Ptr(_SP_p, 8), _AX) // LEAQ 8(SP.p), AX + self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 16)) // MOVQ AX, 16(SP) + self.Emit("MOVQ" , _ST, jit.Ptr(_SP, 24)) // MOVQ ST, 24(SP) + self.Emit("MOVQ" , _ARG_fv, _AX) // MOVQ fv, AX + self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 32)) // MOVQ AX, 32(SP) + self.call_encoder(_F_encodeTypedPointer) // CALL encodeTypedPointer + self.Emit("MOVQ" , jit.Ptr(_SP, 40), _ET) // MOVQ 40(SP), ET + self.Emit("MOVQ" , jit.Ptr(_SP, 48), _EP) // MOVQ 48(SP), EP + self.Emit("TESTQ", _ET, _ET) // TESTQ ET, ET + self.Sjmp("JNZ" , _LB_error) // JNZ _error +} + +func (self *_Assembler) _asm_OP_iface(_ *_Instr) { + self.prep_buffer() // MOVE {buf}, (SP) + self.Emit("MOVQ" , jit.Ptr(_SP_p, 0), _AX) // MOVQ (SP.p), AX + self.Emit("MOVQ" , jit.Ptr(_AX, 8), _AX) // MOVQ 8(AX), AX + self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 8)) // MOVQ AX, 8(SP) + self.Emit("LEAQ" , jit.Ptr(_SP_p, 8), _AX) // LEAQ 8(SP.p), AX + self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 16)) // MOVQ AX, 16(SP) + self.Emit("MOVQ" , _ST, jit.Ptr(_SP, 24)) // MOVQ ST, 24(SP) + self.Emit("MOVQ" , _ARG_fv, _AX) // MOVQ fv, AX + self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 32)) // MOVQ AX, 32(SP) + self.call_encoder(_F_encodeTypedPointer) // CALL encodeTypedPointer + self.Emit("MOVQ" , jit.Ptr(_SP, 40), _ET) // MOVQ 40(SP), ET + self.Emit("MOVQ" , jit.Ptr(_SP, 48), _EP) // MOVQ 48(SP), EP + self.Emit("TESTQ", _ET, _ET) // TESTQ ET, ET + self.Sjmp("JNZ" , _LB_error) // JNZ _error +} + +func (self *_Assembler) _asm_OP_byte(p *_Instr) { + self.check_size(1) + self.Emit("MOVB", jit.Imm(p.i64()), jit.Sib(_RP, _RL, 1, 0)) // MOVL p.vi(), (RP)(RL*1) + self.Emit("ADDQ", jit.Imm(1), _RL) // ADDQ $1, RL +} + +func (self *_Assembler) _asm_OP_text(p *_Instr) { + self.check_size(len(p.vs())) // SIZE ${len(p.vs())} + self.add_text(p.vs()) // TEXT ${p.vs()} +} + +func (self *_Assembler) _asm_OP_deref(_ *_Instr) { + self.Emit("MOVQ", jit.Ptr(_SP_p, 0), _SP_p) // MOVQ (SP.p), SP.p +} + +func (self *_Assembler) _asm_OP_index(p *_Instr) { + self.Emit("MOVQ", jit.Imm(p.i64()), _AX) // MOVQ $p.vi(), AX + self.Emit("ADDQ", _AX, _SP_p) // ADDQ AX, SP.p +} + +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, -24), _SP_x) // MOVQ -24(ST)(AX), SP.x + self.Emit("MOVQ", jit.Sib(_ST, _AX, 1, -8), _SP_p) // MOVQ -8(ST)(AX), SP.p + self.Emit("MOVQ", jit.Sib(_ST, _AX, 1, 0), _SP_q) // MOVQ (ST)(AX), SP.q +} + +func (self *_Assembler) _asm_OP_save(_ *_Instr) { + self.save_state() +} + +func (self *_Assembler) _asm_OP_drop(_ *_Instr) { + self.drop_state(_StateSize) +} + +func (self *_Assembler) _asm_OP_drop_2(_ *_Instr) { + self.drop_state(_StateSize * 2) // DROP $(_StateSize * 2) + self.Emit("MOVOU", _X0, jit.Sib(_ST, _AX, 1, 56)) // MOVOU X0, 56(ST)(AX) +} + +func (self *_Assembler) _asm_OP_recurse(p *_Instr) { + self.prep_buffer() // MOVE {buf}, (SP) + vt, pv := p.vp() + self.Emit("MOVQ", jit.Type(vt), _AX) // MOVQ $(type(p.vt())), AX + self.Emit("MOVQ", _AX, jit.Ptr(_SP, 8)) // MOVQ AX, 8(SP) + + /* check for indirection */ + if !rt.UnpackType(vt).Indirect() { + self.Emit("MOVQ", _SP_p, _AX) // MOVQ SP.p, AX + } else { + self.Emit("MOVQ", _SP_p, _VAR_vp) // MOVQ SP.p, 48(SP) + self.Emit("LEAQ", _VAR_vp, _AX) // LEAQ 48(SP), AX + } + + /* call the encoder */ + self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 16)) // MOVQ AX, 16(SP) + self.Emit("MOVQ" , _ST, jit.Ptr(_SP, 24)) // MOVQ ST, 24(SP) + self.Emit("MOVQ" , _ARG_fv, _AX) // MOVQ fv, AX + if pv { + self.Emit("BTCQ", jit.Imm(bitPointerValue), _AX) // BTCQ $1, AX + } + self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 32)) // MOVQ AX, 32(SP) + self.call_encoder(_F_encodeTypedPointer) // CALL encodeTypedPointer + self.Emit("MOVQ" , jit.Ptr(_SP, 40), _ET) // MOVQ 40(SP), ET + self.Emit("MOVQ" , jit.Ptr(_SP, 48), _EP) // MOVQ 48(SP), EP + self.Emit("TESTQ", _ET, _ET) // TESTQ ET, ET + self.Sjmp("JNZ" , _LB_error) // JNZ _error +} + +func (self *_Assembler) _asm_OP_is_nil(p *_Instr) { + self.Emit("CMPQ", jit.Ptr(_SP_p, 0), jit.Imm(0)) // CMPQ (SP.p), $0 + self.Xjmp("JE" , p.vi()) // JE p.vi() +} + +func (self *_Assembler) _asm_OP_is_nil_p1(p *_Instr) { + self.Emit("CMPQ", jit.Ptr(_SP_p, 8), jit.Imm(0)) // CMPQ 8(SP.p), $0 + self.Xjmp("JE" , p.vi()) // JE p.vi() +} + +func (self *_Assembler) _asm_OP_is_zero_1(p *_Instr) { + self.Emit("CMPB", jit.Ptr(_SP_p, 0), jit.Imm(0)) // CMPB (SP.p), $0 + self.Xjmp("JE" , p.vi()) // JE p.vi() +} + +func (self *_Assembler) _asm_OP_is_zero_2(p *_Instr) { + self.Emit("CMPW", jit.Ptr(_SP_p, 0), jit.Imm(0)) // CMPW (SP.p), $0 + self.Xjmp("JE" , p.vi()) // JE p.vi() +} + +func (self *_Assembler) _asm_OP_is_zero_4(p *_Instr) { + self.Emit("CMPL", jit.Ptr(_SP_p, 0), jit.Imm(0)) // CMPL (SP.p), $0 + self.Xjmp("JE" , p.vi()) // JE p.vi() +} + +func (self *_Assembler) _asm_OP_is_zero_8(p *_Instr) { + self.Emit("CMPQ", jit.Ptr(_SP_p, 0), jit.Imm(0)) // CMPQ (SP.p), $0 + self.Xjmp("JE" , p.vi()) // JE p.vi() +} + +func (self *_Assembler) _asm_OP_is_zero_map(p *_Instr) { + self.Emit("MOVQ" , jit.Ptr(_SP_p, 0), _AX) // MOVQ (SP.p), AX + self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX + self.Xjmp("JZ" , p.vi()) // JZ p.vi() + self.Emit("CMPQ" , jit.Ptr(_AX, 0), jit.Imm(0)) // CMPQ (AX), $0 + self.Xjmp("JE" , p.vi()) // JE p.vi() +} + +func (self *_Assembler) _asm_OP_goto(p *_Instr) { + self.Xjmp("JMP", p.vi()) +} + +func (self *_Assembler) _asm_OP_map_iter(p *_Instr) { + self.Emit("MOVQ" , jit.Type(p.vt()), _AX) // MOVQ $p.vt(), AX + self.Emit("MOVQ" , jit.Ptr(_SP_p, 0), _CX) // MOVQ (SP.p), CX + self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 0)) // MOVQ AX, (SP) + self.Emit("MOVQ" , _CX, jit.Ptr(_SP, 8)) // MOVQ CX, 8(SP) + self.Emit("MOVQ" , _ARG_fv, _AX) // MOVQ fv, AX + self.Emit("MOVQ" , _AX, jit.Ptr(_SP, 16)) // MOVQ AX, 16(SP) + self.call_go(_F_iteratorStart) // CALL_GO iteratorStart + self.Emit("MOVQ" , jit.Ptr(_SP, 24), _SP_q) // MOVQ 24(SP), SP.q + self.Emit("MOVQ" , jit.Ptr(_SP, 32), _ET) // MOVQ 32(SP), ET + self.Emit("MOVQ" , jit.Ptr(_SP, 40), _EP) // MOVQ 40(SP), EP + self.Emit("TESTQ", _ET, _ET) // TESTQ ET, ET + self.Sjmp("JNZ" , _LB_error) // JNZ _error +} + +func (self *_Assembler) _asm_OP_map_stop(_ *_Instr) { + self.Emit("MOVQ", _SP_q, jit.Ptr(_SP, 0)) // MOVQ SP.q, 0(SP) + self.call_go(_F_iteratorStop) // CALL_GO iteratorStop + self.Emit("XORL", _SP_q, _SP_q) // XORL SP.q, SP.q +} + +func (self *_Assembler) _asm_OP_map_check_key(p *_Instr) { + self.Emit("MOVQ" , jit.Ptr(_SP_q, 0), _SP_p) // MOVQ (SP.q), SP.p + self.Emit("TESTQ", _SP_p, _SP_p) // TESTQ SP.p, SP.p + self.Xjmp("JZ" , p.vi()) // JNZ p.vi() +} + +func (self *_Assembler) _asm_OP_map_write_key(p *_Instr) { + self.Emit("BTQ", jit.Imm(bitSortMapKeys), _ARG_fv) // BTQ ${SortMapKeys}, fv + self.Sjmp("JNC", "_unordered_key_{n}") // JNC _unordered_key_{n} + self.encode_string(false) // STR $false + self.Xjmp("JMP", p.vi()) // JMP ${p.vi()} + self.Link("_unordered_key_{n}") // _unordered_key_{n}: +} + +func (self *_Assembler) _asm_OP_map_value_next(_ *_Instr) { + self.Emit("MOVQ", jit.Ptr(_SP_q, 8), _SP_p) // MOVQ 8(SP.q), SP.p + self.Emit("MOVQ", _SP_q, jit.Ptr(_SP, 0)) // MOVQ SP.q, (SP) + self.call_go(_F_iteratorNext) // CALL_GO iteratorNext +} + +func (self *_Assembler) _asm_OP_slice_len(_ *_Instr) { + self.Emit("MOVQ" , jit.Ptr(_SP_p, 8), _SP_x) // MOVQ 8(SP.p), SP.x + self.Emit("MOVQ" , jit.Ptr(_SP_p, 0), _SP_p) // MOVQ (SP.p), SP.p + self.Emit("ORQ" , jit.Imm(1 << _S_init), _SP_f) // ORQ $(1<<_S_init), SP.f +} + +func (self *_Assembler) _asm_OP_slice_next(p *_Instr) { + self.Emit("TESTQ" , _SP_x, _SP_x) // TESTQ SP.x, SP.x + self.Xjmp("JZ" , p.vi()) // JZ p.vi() + self.Emit("SUBQ" , jit.Imm(1), _SP_x) // SUBQ $1, SP.x + self.Emit("BTRQ" , jit.Imm(_S_init), _SP_f) // BTRQ $_S_init, SP.f + self.Emit("LEAQ" , jit.Ptr(_SP_p, int64(p.vlen())), _AX) // LEAQ $(p.vlen())(SP.p), AX + self.Emit("CMOVQCC", _AX, _SP_p) // CMOVQNC AX, SP.p +} + +func (self *_Assembler) _asm_OP_marshal(p *_Instr) { + self.call_marshaler(_F_encodeJsonMarshaler, _T_json_Marshaler, p.vt()) +} + +func (self *_Assembler) _asm_OP_marshal_p(p *_Instr) { + if p.vk() != reflect.Ptr { + panic("marshal_p: invalid type") + } else { + self.call_marshaler_v(_F_encodeJsonMarshaler, _T_json_Marshaler, p.vt(), false) + } +} + +func (self *_Assembler) _asm_OP_marshal_text(p *_Instr) { + self.call_marshaler(_F_encodeTextMarshaler, _T_encoding_TextMarshaler, p.vt()) +} + +func (self *_Assembler) _asm_OP_marshal_text_p(p *_Instr) { + if p.vk() != reflect.Ptr { + panic("marshal_text_p: invalid type") + } else { + self.call_marshaler_v(_F_encodeTextMarshaler, _T_encoding_TextMarshaler, p.vt(), false) + } +} + +func (self *_Assembler) _asm_OP_cond_set(_ *_Instr) { + self.Emit("ORQ", jit.Imm(1 << _S_cond), _SP_f) // ORQ $(1<<_S_cond), SP.f +} + +func (self *_Assembler) _asm_OP_cond_testc(p *_Instr) { + self.Emit("BTRQ", jit.Imm(_S_cond), _SP_f) // BTRQ $_S_cond, SP.f + self.Xjmp("JC" , p.vi()) +} + +func (self *_Assembler) print_gc(i int, p1 *_Instr, p2 *_Instr) { + self.Emit("MOVQ", jit.Imm(int64(p2.op())), jit.Ptr(_SP, 16))// MOVQ $(p2.op()), 16(SP) + self.Emit("MOVQ", jit.Imm(int64(p1.op())), jit.Ptr(_SP, 8)) // MOVQ $(p1.op()), 8(SP) + self.Emit("MOVQ", jit.Imm(int64(i)), jit.Ptr(_SP, 0)) // MOVQ $(i), (SP) + self.call_go(_F_println) +} + +var ( + _V_writeBarrier = jit.Imm(int64(_runtime_writeBarrier)) + + _F_gcWriteBarrierAX = jit.Func(gcWriteBarrierAX) +) + +func (self *_Assembler) WriteRecNotAX(i int, ptr obj.Addr, rec obj.Addr) { + if rec.Reg == x86.REG_AX || rec.Index == x86.REG_AX { + panic("rec contains AX!") + } + self.Emit("MOVQ", _V_writeBarrier, _R10) + self.Emit("CMPL", jit.Ptr(_R10, 0), jit.Imm(0)) + self.Sjmp("JE", "_no_writeBarrier" + strconv.Itoa(i) + "_{n}") + self.Emit("MOVQ", ptr, _AX) + self.xsave(_DI) + self.Emit("LEAQ", rec, _DI) + self.Emit("MOVQ", _F_gcWriteBarrierAX, _R10) // MOVQ ${fn}, AX + self.Rjmp("CALL", _R10) + self.xload(_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}") +} \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/encoder/assembler_amd64_go117.go b/vendor/github.com/bytedance/sonic/encoder/assembler_amd64_go117.go new file mode 100644 index 00000000000..8cd83e86802 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/encoder/assembler_amd64_go117.go @@ -0,0 +1,1201 @@ +//go:build go1.17 && !go1.21 +// +build go1.17,!go1.21 + +/* + * 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 ( + `fmt` + `reflect` + `strconv` + `unsafe` + + `github.com/bytedance/sonic/internal/cpu` + `github.com/bytedance/sonic/internal/jit` + `github.com/bytedance/sonic/internal/native/types` + `github.com/twitchyliquid64/golang-asm/obj` + `github.com/twitchyliquid64/golang-asm/obj/x86` + + `github.com/bytedance/sonic/internal/native` + `github.com/bytedance/sonic/internal/rt` +) + +/** Register Allocations + * + * State Registers: + * + * %rbx : stack base + * %rdi : result pointer + * %rsi : result length + * %rdx : result capacity + * %r12 : sp->p + * %r13 : sp->q + * %r14 : sp->x + * %r15 : sp->f + * + * Error Registers: + * + * %r10 : error type register + * %r11 : error pointer register + */ + +/** Function Prototype & Stack Map + * + * func (buf *[]byte, p unsafe.Pointer, sb *_Stack, fv uint64) (err error) + * + * buf : (FP) + * p : 8(FP) + * sb : 16(FP) + * fv : 24(FP) + * err.vt : 32(FP) + * err.vp : 40(FP) + */ + +const ( + _S_cond = iota + _S_init +) + +const ( + _FP_args = 32 // 32 bytes for spill registers of arguments + _FP_fargs = 40 // 40 bytes for passing arguments to other Go functions + _FP_saves = 64 // 64 bytes for saving the registers before CALL instructions + _FP_locals = 24 // 24 bytes for local variables +) + +const ( + _FP_loffs = _FP_fargs + _FP_saves + _FP_offs = _FP_loffs + _FP_locals + // _FP_offs = _FP_loffs + _FP_locals + _FP_debug + _FP_size = _FP_offs + 8 // 8 bytes for the parent frame pointer + _FP_base = _FP_size + 8 // 8 bytes for the return address +) + +const ( + _FM_exp32 = 0x7f800000 + _FM_exp64 = 0x7ff0000000000000 +) + +const ( + _IM_null = 0x6c6c756e // 'null' + _IM_true = 0x65757274 // 'true' + _IM_fals = 0x736c6166 // 'fals' ('false' without the 'e') + _IM_open = 0x00225c22 // '"\"∅' + _IM_array = 0x5d5b // '[]' + _IM_object = 0x7d7b // '{}' + _IM_mulv = -0x5555555555555555 +) + +const ( + _LB_more_space = "_more_space" + _LB_more_space_return = "_more_space_return_" +) + +const ( + _LB_error = "_error" + _LB_error_too_deep = "_error_too_deep" + _LB_error_invalid_number = "_error_invalid_number" + _LB_error_nan_or_infinite = "_error_nan_or_infinite" + _LB_panic = "_panic" +) + +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") +) + +var ( + _X0 = jit.Reg("X0") + _Y0 = jit.Reg("Y0") +) + +var ( + _ST = jit.Reg("R15") // can't use R14 since it's always scratched by Go... + _RP = jit.Reg("DI") + _RL = jit.Reg("SI") + _RC = jit.Reg("DX") +) + +var ( + _LR = jit.Reg("R9") + _ET = jit.Reg("AX") + _EP = jit.Reg("BX") +) + +var ( + _SP_p = jit.Reg("R10") // saved on BX when call_c + _SP_q = jit.Reg("R11") // saved on BP when call_c + _SP_x = jit.Reg("R12") + _SP_f = jit.Reg("R13") +) + +var ( + _ARG_rb = jit.Ptr(_SP, _FP_base) + _ARG_vp = jit.Ptr(_SP, _FP_base + 8) + _ARG_sb = jit.Ptr(_SP, _FP_base + 16) + _ARG_fv = jit.Ptr(_SP, _FP_base + 24) +) + +var ( + _RET_et = _ET + _RET_ep = _EP +) + +var ( + _VAR_sp = jit.Ptr(_SP, _FP_fargs + _FP_saves) + _VAR_dn = jit.Ptr(_SP, _FP_fargs + _FP_saves + 8) + _VAR_vp = jit.Ptr(_SP, _FP_fargs + _FP_saves + 16) +) + +var ( + _REG_ffi = []obj.Addr{ _RP, _RL, _RC} + _REG_b64 = []obj.Addr{_SP_p, _SP_q} + + _REG_all = []obj.Addr{_ST, _SP_x, _SP_f, _SP_p, _SP_q, _RP, _RL, _RC} + _REG_ms = []obj.Addr{_ST, _SP_x, _SP_f, _SP_p, _SP_q, _LR} + _REG_enc = []obj.Addr{_ST, _SP_x, _SP_f, _SP_p, _SP_q, _RL} +) + +type _Assembler struct { + jit.BaseAssembler + p _Program + x int + name string +} + +func newAssembler(p _Program) *_Assembler { + return new(_Assembler).Init(p) +} + +/** Assembler Interface **/ + +func (self *_Assembler) Load() _Encoder { + return ptoenc(self.BaseAssembler.Load("encode_"+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.builtins() +} + +/** Assembler Stages **/ + +var _OpFuncTab = [256]func(*_Assembler, *_Instr) { + _OP_null : (*_Assembler)._asm_OP_null, + _OP_empty_arr : (*_Assembler)._asm_OP_empty_arr, + _OP_empty_obj : (*_Assembler)._asm_OP_empty_obj, + _OP_bool : (*_Assembler)._asm_OP_bool, + _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_str : (*_Assembler)._asm_OP_str, + _OP_bin : (*_Assembler)._asm_OP_bin, + _OP_quote : (*_Assembler)._asm_OP_quote, + _OP_number : (*_Assembler)._asm_OP_number, + _OP_eface : (*_Assembler)._asm_OP_eface, + _OP_iface : (*_Assembler)._asm_OP_iface, + _OP_byte : (*_Assembler)._asm_OP_byte, + _OP_text : (*_Assembler)._asm_OP_text, + _OP_deref : (*_Assembler)._asm_OP_deref, + _OP_index : (*_Assembler)._asm_OP_index, + _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_is_nil : (*_Assembler)._asm_OP_is_nil, + _OP_is_nil_p1 : (*_Assembler)._asm_OP_is_nil_p1, + _OP_is_zero_1 : (*_Assembler)._asm_OP_is_zero_1, + _OP_is_zero_2 : (*_Assembler)._asm_OP_is_zero_2, + _OP_is_zero_4 : (*_Assembler)._asm_OP_is_zero_4, + _OP_is_zero_8 : (*_Assembler)._asm_OP_is_zero_8, + _OP_is_zero_map : (*_Assembler)._asm_OP_is_zero_map, + _OP_goto : (*_Assembler)._asm_OP_goto, + _OP_map_iter : (*_Assembler)._asm_OP_map_iter, + _OP_map_stop : (*_Assembler)._asm_OP_map_stop, + _OP_map_check_key : (*_Assembler)._asm_OP_map_check_key, + _OP_map_write_key : (*_Assembler)._asm_OP_map_write_key, + _OP_map_value_next : (*_Assembler)._asm_OP_map_value_next, + _OP_slice_len : (*_Assembler)._asm_OP_slice_len, + _OP_slice_next : (*_Assembler)._asm_OP_slice_next, + _OP_marshal : (*_Assembler)._asm_OP_marshal, + _OP_marshal_p : (*_Assembler)._asm_OP_marshal_p, + _OP_marshal_text : (*_Assembler)._asm_OP_marshal_text, + _OP_marshal_text_p : (*_Assembler)._asm_OP_marshal_text_p, + _OP_cond_set : (*_Assembler)._asm_OP_cond_set, + _OP_cond_testc : (*_Assembler)._asm_OP_cond_testc, +} + +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) builtins() { + self.more_space() + self.error_too_deep() + self.error_invalid_number() + self.error_nan_or_infinite() + self.go_panic() +} + +func (self *_Assembler) epilogue() { + self.Mark(len(self.p)) + self.Emit("XORL", _ET, _ET) + self.Emit("XORL", _EP, _EP) + self.Link(_LB_error) + self.Emit("MOVQ", _ARG_rb, _CX) // MOVQ rb<>+0(FP), CX + self.Emit("MOVQ", _RL, jit.Ptr(_CX, 8)) // MOVQ RL, 8(CX) + self.Emit("MOVQ", jit.Imm(0), _ARG_rb) // MOVQ AX, rb<>+0(FP) + self.Emit("MOVQ", jit.Imm(0), _ARG_vp) // MOVQ BX, vp<>+8(FP) + self.Emit("MOVQ", jit.Imm(0), _ARG_sb) // MOVQ CX, sb<>+16(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_rb) // MOVQ AX, rb<>+0(FP) + self.Emit("MOVQ", _BX, _ARG_vp) // MOVQ BX, vp<>+8(FP) + self.Emit("MOVQ", _CX, _ARG_sb) // MOVQ CX, sb<>+16(FP) + self.Emit("MOVQ", _DI, _ARG_fv) // MOVQ DI, rb<>+24(FP) + self.Emit("MOVQ", jit.Ptr(_AX, 0), _RP) // MOVQ (AX) , DI + self.Emit("MOVQ", jit.Ptr(_AX, 8), _RL) // MOVQ 8(AX) , SI + self.Emit("MOVQ", jit.Ptr(_AX, 16), _RC) // MOVQ 16(AX), DX + self.Emit("MOVQ", _BX, _SP_p) // MOVQ BX, R10 + self.Emit("MOVQ", _CX, _ST) // MOVQ CX, R8 + self.Emit("XORL", _SP_x, _SP_x) // XORL R10, R12 + self.Emit("XORL", _SP_f, _SP_f) // XORL R11, R13 + self.Emit("XORL", _SP_q, _SP_q) // XORL R13, R11 +} + +/** Assembler Inline Functions **/ + +func (self *_Assembler) xsave(reg ...obj.Addr) { + for i, v := range reg { + 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) xload(reg ...obj.Addr) { + for i, v := range reg { + 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) rbuf_di() { + if _RP.Reg != x86.REG_DI { + panic("register allocation messed up: RP != DI") + } else { + self.Emit("ADDQ", _RL, _RP) + } +} + +func (self *_Assembler) store_int(nd int, fn obj.Addr, ins string) { + self.check_size(nd) + self.save_c() // SAVE $C_regs + self.rbuf_di() // MOVQ RP, DI + self.Emit(ins, jit.Ptr(_SP_p, 0), _SI) // $ins (SP.p), SI + self.call_c(fn) // CALL_C $fn + self.Emit("ADDQ", _AX, _RL) // ADDQ AX, RL +} + +func (self *_Assembler) store_str(s string) { + i := 0 + m := rt.Str2Mem(s) + + /* 8-byte stores */ + for i <= len(m) - 8 { + self.Emit("MOVQ", jit.Imm(rt.Get64(m[i:])), _AX) // MOVQ $s[i:], AX + self.Emit("MOVQ", _AX, jit.Sib(_RP, _RL, 1, int64(i))) // MOVQ AX, i(RP)(RL) + i += 8 + } + + /* 4-byte stores */ + if i <= len(m) - 4 { + self.Emit("MOVL", jit.Imm(int64(rt.Get32(m[i:]))), jit.Sib(_RP, _RL, 1, int64(i))) // MOVL $s[i:], i(RP)(RL) + i += 4 + } + + /* 2-byte stores */ + if i <= len(m) - 2 { + self.Emit("MOVW", jit.Imm(int64(rt.Get16(m[i:]))), jit.Sib(_RP, _RL, 1, int64(i))) // MOVW $s[i:], i(RP)(RL) + i += 2 + } + + /* last byte */ + if i < len(m) { + self.Emit("MOVB", jit.Imm(int64(m[i])), jit.Sib(_RP, _RL, 1, int64(i))) // MOVB $s[i:], i(RP)(RL) + } +} + +func (self *_Assembler) check_size(n int) { + self.check_size_rl(jit.Ptr(_RL, int64(n))) +} + +func (self *_Assembler) check_size_r(r obj.Addr, d int) { + self.check_size_rl(jit.Sib(_RL, r, 1, int64(d))) +} + +func (self *_Assembler) check_size_rl(v obj.Addr) { + idx := self.x + key := _LB_more_space_return + strconv.Itoa(idx) + + /* the following code relies on LR == R9 to work */ + if _LR.Reg != x86.REG_R9 { + panic("register allocation messed up: LR != R9") + } + + /* check for buffer capacity */ + self.x++ + self.Emit("LEAQ", v, _AX) // LEAQ $v, AX + self.Emit("CMPQ", _AX, _RC) // CMPQ AX, RC + self.Sjmp("JBE" , key) // JBE _more_space_return_{n} + self.slice_grow_ax(key) // GROW $key + self.Link(key) // _more_space_return_{n}: +} + +func (self *_Assembler) slice_grow_ax(ret string) { + self.Byte(0x4c, 0x8d, 0x0d) // LEAQ ?(PC), R9 + self.Sref(ret, 4) // .... &ret + self.Sjmp("JMP" , _LB_more_space) // JMP _more_space +} + +/** State Stack Helpers **/ + +const ( + _StateSize = int64(unsafe.Sizeof(_State{})) + _StackLimit = _MaxStack * _StateSize +) + +func (self *_Assembler) save_state() { + self.Emit("MOVQ", jit.Ptr(_ST, 0), _CX) // MOVQ (ST), CX + self.Emit("LEAQ", jit.Ptr(_CX, _StateSize), _R9) // LEAQ _StateSize(CX), R9 + self.Emit("CMPQ", _R9, jit.Imm(_StackLimit)) // CMPQ R9, $_StackLimit + self.Sjmp("JAE" , _LB_error_too_deep) // JA _error_too_deep + self.Emit("MOVQ", _SP_x, jit.Sib(_ST, _CX, 1, 8)) // MOVQ SP.x, 8(ST)(CX) + self.Emit("MOVQ", _SP_f, jit.Sib(_ST, _CX, 1, 16)) // MOVQ SP.f, 16(ST)(CX) + self.WriteRecNotAX(0, _SP_p, jit.Sib(_ST, _CX, 1, 24)) // MOVQ SP.p, 24(ST)(CX) + self.WriteRecNotAX(1, _SP_q, jit.Sib(_ST, _CX, 1, 32)) // MOVQ SP.q, 32(ST)(CX) + self.Emit("MOVQ", _R9, jit.Ptr(_ST, 0)) // MOVQ R9, (ST) +} + +func (self *_Assembler) drop_state(decr int64) { + self.Emit("MOVQ" , jit.Ptr(_ST, 0), _AX) // MOVQ (ST), AX + self.Emit("SUBQ" , jit.Imm(decr), _AX) // SUBQ $decr, AX + self.Emit("MOVQ" , _AX, jit.Ptr(_ST, 0)) // MOVQ AX, (ST) + self.Emit("MOVQ" , jit.Sib(_ST, _AX, 1, 8), _SP_x) // MOVQ 8(ST)(AX), SP.x + self.Emit("MOVQ" , jit.Sib(_ST, _AX, 1, 16), _SP_f) // MOVQ 16(ST)(AX), SP.f + self.Emit("MOVQ" , jit.Sib(_ST, _AX, 1, 24), _SP_p) // MOVQ 24(ST)(AX), SP.p + self.Emit("MOVQ" , jit.Sib(_ST, _AX, 1, 32), _SP_q) // MOVQ 32(ST)(AX), SP.q + self.Emit("PXOR" , _X0, _X0) // PXOR X0, X0 + self.Emit("MOVOU", _X0, jit.Sib(_ST, _AX, 1, 8)) // MOVOU X0, 8(ST)(AX) + self.Emit("MOVOU", _X0, jit.Sib(_ST, _AX, 1, 24)) // MOVOU X0, 24(ST)(AX) +} + +/** Buffer Helpers **/ + +func (self *_Assembler) add_char(ch byte) { + self.Emit("MOVB", jit.Imm(int64(ch)), jit.Sib(_RP, _RL, 1, 0)) // MOVB $ch, (RP)(RL) + self.Emit("ADDQ", jit.Imm(1), _RL) // ADDQ $1, RL +} + +func (self *_Assembler) add_long(ch uint32, n int64) { + self.Emit("MOVL", jit.Imm(int64(ch)), jit.Sib(_RP, _RL, 1, 0)) // MOVL $ch, (RP)(RL) + self.Emit("ADDQ", jit.Imm(n), _RL) // ADDQ $n, RL +} + +func (self *_Assembler) add_text(ss string) { + self.store_str(ss) // TEXT $ss + self.Emit("ADDQ", jit.Imm(int64(len(ss))), _RL) // ADDQ ${len(ss)}, RL +} + +// get *buf at AX +func (self *_Assembler) prep_buffer_AX() { + self.Emit("MOVQ", _ARG_rb, _AX) // MOVQ rb<>+0(FP), AX + self.Emit("MOVQ", _RL, jit.Ptr(_AX, 8)) // MOVQ RL, 8(AX) +} + +func (self *_Assembler) save_buffer() { + self.Emit("MOVQ", _ARG_rb, _CX) // MOVQ rb<>+0(FP), CX + self.Emit("MOVQ", _RP, jit.Ptr(_CX, 0)) // MOVQ RP, (CX) + self.Emit("MOVQ", _RL, jit.Ptr(_CX, 8)) // MOVQ RL, 8(CX) + self.Emit("MOVQ", _RC, jit.Ptr(_CX, 16)) // MOVQ RC, 16(CX) +} + +// get *buf at AX +func (self *_Assembler) load_buffer_AX() { + self.Emit("MOVQ", _ARG_rb, _AX) // MOVQ rb<>+0(FP), AX + self.Emit("MOVQ", jit.Ptr(_AX, 0), _RP) // MOVQ (AX), RP + self.Emit("MOVQ", jit.Ptr(_AX, 8), _RL) // MOVQ 8(AX), RL + self.Emit("MOVQ", jit.Ptr(_AX, 16), _RC) // MOVQ 16(AX), RC +} + +/** Function Interface Helpers **/ + +func (self *_Assembler) call(pc obj.Addr) { + self.Emit("MOVQ", pc, _LR) // MOVQ $pc, AX + self.Rjmp("CALL", _LR) // CALL AX +} + +func (self *_Assembler) save_c() { + self.xsave(_REG_ffi...) // SAVE $REG_ffi +} + +func (self *_Assembler) call_b64(pc obj.Addr) { + self.xsave(_REG_b64...) // SAVE $REG_all + self.call(pc) // CALL $pc + self.xload(_REG_b64...) // LOAD $REG_ffi +} + +func (self *_Assembler) call_c(pc obj.Addr) { + self.Emit("XCHGQ", _SP_p, _BX) + self.Emit("XCHGQ", _SP_q, _BP) + self.call(pc) // CALL $pc + self.xload(_REG_ffi...) // LOAD $REG_ffi + self.Emit("XCHGQ", _SP_p, _BX) + self.Emit("XCHGQ", _SP_q, _BP) +} + +func (self *_Assembler) call_go(pc obj.Addr) { + self.xsave(_REG_all...) // SAVE $REG_all + self.call(pc) // CALL $pc + self.xload(_REG_all...) // LOAD $REG_all +} + +func (self *_Assembler) call_more_space(pc obj.Addr) { + self.xsave(_REG_ms...) // SAVE $REG_all + self.call(pc) // CALL $pc + self.xload(_REG_ms...) // LOAD $REG_all +} + +func (self *_Assembler) call_encoder(pc obj.Addr) { + self.xsave(_REG_enc...) // SAVE $REG_all + self.call(pc) // CALL $pc + self.xload(_REG_enc...) // LOAD $REG_all +} + +func (self *_Assembler) call_marshaler(fn obj.Addr, it *rt.GoType, vt reflect.Type) { + switch vt.Kind() { + case reflect.Interface : self.call_marshaler_i(fn, it) + case reflect.Ptr, reflect.Map : self.call_marshaler_v(fn, it, vt, true) + default : self.call_marshaler_v(fn, it, vt, false) + } +} + +func (self *_Assembler) call_marshaler_i(fn obj.Addr, it *rt.GoType) { + self.Emit("MOVQ" , jit.Ptr(_SP_p, 0), _AX) // MOVQ (SP.p), AX + self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX + self.Sjmp("JZ" , "_null_{n}") // JZ _null_{n} + self.Emit("MOVQ" , _AX, _BX) // MOVQ AX, BX + self.Emit("MOVQ" , jit.Ptr(_SP_p, 8), _CX) // MOVQ 8(SP.p), CX + self.Emit("MOVQ" , jit.Gtype(it), _AX) // MOVQ $it, AX + self.call_go(_F_assertI2I) // CALL_GO assertI2I + self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX + self.Sjmp("JZ" , "_null_{n}") // JZ _null_{n} + self.Emit("MOVQ", _BX, _CX) // MOVQ BX, CX + self.Emit("MOVQ", _AX, _BX) // MOVQ AX, BX + self.prep_buffer_AX() + self.Emit("MOVQ", _ARG_fv, _DI) // MOVQ ARG.fv, DI + self.call_go(fn) // CALL $fn + self.Emit("TESTQ", _ET, _ET) // TESTQ ET, ET + self.Sjmp("JNZ" , _LB_error) // JNZ _error + self.load_buffer_AX() + self.Sjmp("JMP" , "_done_{n}") // JMP _done_{n} + self.Link("_null_{n}") // _null_{n}: + self.check_size(4) // SIZE $4 + self.Emit("MOVL", jit.Imm(_IM_null), jit.Sib(_RP, _RL, 1, 0)) // MOVL $'null', (RP)(RL*1) + self.Emit("ADDQ", jit.Imm(4), _RL) // ADDQ $4, RL + self.Link("_done_{n}") // _done_{n}: +} + +func (self *_Assembler) call_marshaler_v(fn obj.Addr, it *rt.GoType, vt reflect.Type, deref bool) { + self.prep_buffer_AX() // MOVE {buf}, (SP) + self.Emit("MOVQ", jit.Itab(it, vt), _BX) // MOVQ $(itab(it, vt)), BX + + /* dereference the pointer if needed */ + if !deref { + self.Emit("MOVQ", _SP_p, _CX) // MOVQ SP.p, CX + } else { + self.Emit("MOVQ", jit.Ptr(_SP_p, 0), _CX) // MOVQ 0(SP.p), CX + } + + /* call the encoder, and perform error checks */ + self.Emit("MOVQ", _ARG_fv, _DI) // MOVQ ARG.fv, DI + self.call_go(fn) // CALL $fn + self.Emit("TESTQ", _ET, _ET) // TESTQ ET, ET + self.Sjmp("JNZ" , _LB_error) // JNZ _error + self.load_buffer_AX() +} + +/** Builtin: _more_space **/ + +var ( + _T_byte = jit.Type(byteType) + _F_growslice = jit.Func(growslice) +) + +// AX must saving n +func (self *_Assembler) more_space() { + self.Link(_LB_more_space) + self.Emit("MOVQ", _RP, _BX) // MOVQ DI, BX + self.Emit("MOVQ", _RL, _CX) // MOVQ SI, CX + self.Emit("MOVQ", _RC, _DI) // MOVQ DX, DI + self.Emit("MOVQ", _AX, _SI) // MOVQ AX, SI + self.Emit("MOVQ", _T_byte, _AX) // MOVQ $_T_byte, AX + self.call_more_space(_F_growslice) // CALL $pc + self.Emit("MOVQ", _AX, _RP) // MOVQ AX, DI + self.Emit("MOVQ", _BX, _RL) // MOVQ BX, SI + self.Emit("MOVQ", _CX, _RC) // MOVQ CX, DX + self.save_buffer() // SAVE {buf} + self.Rjmp("JMP" , _LR) // JMP LR +} + +/** Builtin Errors **/ + +var ( + _V_ERR_too_deep = jit.Imm(int64(uintptr(unsafe.Pointer(_ERR_too_deep)))) + _V_ERR_nan_or_infinite = jit.Imm(int64(uintptr(unsafe.Pointer(_ERR_nan_or_infinite)))) + _I_json_UnsupportedValueError = jit.Itab(rt.UnpackType(errorType), jsonUnsupportedValueType) +) + +func (self *_Assembler) error_too_deep() { + self.Link(_LB_error_too_deep) + self.Emit("MOVQ", _V_ERR_too_deep, _EP) // MOVQ $_V_ERR_too_deep, EP + self.Emit("MOVQ", _I_json_UnsupportedValueError, _ET) // MOVQ $_I_json_UnsupportedValuError, ET + self.Sjmp("JMP" , _LB_error) // JMP _error +} + +func (self *_Assembler) error_invalid_number() { + self.Link(_LB_error_invalid_number) + self.Emit("MOVQ", jit.Ptr(_SP_p, 0), _AX) // MOVQ 0(SP), AX + self.Emit("MOVQ", jit.Ptr(_SP_p, 8), _BX) // MOVQ 8(SP), BX + self.call_go(_F_error_number) // CALL_GO error_number + self.Sjmp("JMP" , _LB_error) // JMP _error +} + +func (self *_Assembler) error_nan_or_infinite() { + self.Link(_LB_error_nan_or_infinite) + self.Emit("MOVQ", _V_ERR_nan_or_infinite, _EP) // MOVQ $_V_ERR_nan_or_infinite, EP + self.Emit("MOVQ", _I_json_UnsupportedValueError, _ET) // MOVQ $_I_json_UnsupportedValuError, ET + self.Sjmp("JMP" , _LB_error) // JMP _error +} + +/** String Encoding Routine **/ + +var ( + _F_quote = jit.Imm(int64(native.S_quote)) + _F_panic = jit.Func(goPanic) +) + +func (self *_Assembler) go_panic() { + self.Link(_LB_panic) + self.Emit("MOVQ", _SP_p, _BX) + self.call_go(_F_panic) +} + +func (self *_Assembler) encode_string(doubleQuote bool) { + self.Emit("MOVQ" , jit.Ptr(_SP_p, 8), _AX) // MOVQ 8(SP.p), AX + self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX + self.Sjmp("JZ" , "_str_empty_{n}") // JZ _str_empty_{n} + self.Emit("CMPQ", jit.Ptr(_SP_p, 0), jit.Imm(0)) + self.Sjmp("JNE" , "_str_next_{n}") + self.Emit("MOVQ", jit.Imm(int64(panicNilPointerOfNonEmptyString)), _AX) + self.Sjmp("JMP", _LB_panic) + self.Link("_str_next_{n}") + + /* openning quote, check for double quote */ + if !doubleQuote { + self.check_size_r(_AX, 2) // SIZE $2 + self.add_char('"') // CHAR $'"' + } else { + self.check_size_r(_AX, 6) // SIZE $6 + self.add_long(_IM_open, 3) // TEXT $`"\"` + } + + /* quoting loop */ + self.Emit("XORL", _AX, _AX) // XORL AX, AX + self.Emit("MOVQ", _AX, _VAR_sp) // MOVQ AX, sp + self.Link("_str_loop_{n}") // _str_loop_{n}: + self.save_c() // SAVE $REG_ffi + + /* load the output buffer first, and then input buffer, + * because the parameter registers collide with RP / RL / RC */ + self.Emit("MOVQ", _RC, _CX) // MOVQ RC, CX + self.Emit("SUBQ", _RL, _CX) // SUBQ RL, CX + self.Emit("MOVQ", _CX, _VAR_dn) // MOVQ CX, dn + self.Emit("LEAQ", jit.Sib(_RP, _RL, 1, 0), _DX) // LEAQ (RP)(RL), DX + self.Emit("LEAQ", _VAR_dn, _CX) // LEAQ dn, CX + self.Emit("MOVQ", _VAR_sp, _AX) // MOVQ sp, AX + self.Emit("MOVQ", jit.Ptr(_SP_p, 0), _DI) // MOVQ (SP.p), DI + self.Emit("MOVQ", jit.Ptr(_SP_p, 8), _SI) // MOVQ 8(SP.p), SI + self.Emit("ADDQ", _AX, _DI) // ADDQ AX, DI + self.Emit("SUBQ", _AX, _SI) // SUBQ AX, SI + + /* set the flags based on `doubleQuote` */ + if !doubleQuote { + self.Emit("XORL", _R8, _R8) // XORL R8, R8 + } else { + self.Emit("MOVL", jit.Imm(types.F_DOUBLE_UNQUOTE), _R8) // MOVL ${types.F_DOUBLE_UNQUOTE}, R8 + } + + /* call the native quoter */ + self.call_c(_F_quote) // CALL quote + self.Emit("ADDQ" , _VAR_dn, _RL) // ADDQ dn, RL + + self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX + self.Sjmp("JS" , "_str_space_{n}") // JS _str_space_{n} + + /* close the string, check for double quote */ + if !doubleQuote { + self.check_size(1) // SIZE $1 + self.add_char('"') // CHAR $'"' + self.Sjmp("JMP", "_str_end_{n}") // JMP _str_end_{n} + } else { + self.check_size(3) // SIZE $3 + self.add_text("\\\"\"") // TEXT $'\""' + self.Sjmp("JMP", "_str_end_{n}") // JMP _str_end_{n} + } + + /* not enough space to contain the quoted string */ + self.Link("_str_space_{n}") // _str_space_{n}: + self.Emit("NOTQ", _AX) // NOTQ AX + self.Emit("ADDQ", _AX, _VAR_sp) // ADDQ AX, sp + self.Emit("LEAQ", jit.Sib(_RC, _RC, 1, 0), _AX) // LEAQ (RC)(RC), AX + self.slice_grow_ax("_str_loop_{n}") // GROW _str_loop_{n} + + /* empty string, check for double quote */ + if !doubleQuote { + self.Link("_str_empty_{n}") // _str_empty_{n}: + self.check_size(2) // SIZE $2 + self.add_text("\"\"") // TEXT $'""' + self.Link("_str_end_{n}") // _str_end_{n}: + } else { + self.Link("_str_empty_{n}") // _str_empty_{n}: + self.check_size(6) // SIZE $6 + self.add_text("\"\\\"\\\"\"") // TEXT $'"\"\""' + self.Link("_str_end_{n}") // _str_end_{n}: + } +} + +/** OpCode Assembler Functions **/ + +var ( + _T_json_Marshaler = rt.UnpackType(jsonMarshalerType) + _T_encoding_TextMarshaler = rt.UnpackType(encodingTextMarshalerType) +) + +var ( + _F_f64toa = jit.Imm(int64(native.S_f64toa)) + _F_f32toa = jit.Imm(int64(native.S_f32toa)) + _F_i64toa = jit.Imm(int64(native.S_i64toa)) + _F_u64toa = jit.Imm(int64(native.S_u64toa)) + _F_b64encode = jit.Imm(int64(_subr__b64encode)) +) + +var ( + _F_memmove = jit.Func(memmove) + _F_error_number = jit.Func(error_number) + _F_isValidNumber = jit.Func(isValidNumber) +) + +var ( + _F_iteratorStop = jit.Func(iteratorStop) + _F_iteratorNext = jit.Func(iteratorNext) + _F_iteratorStart = jit.Func(iteratorStart) +) + +var ( + _F_encodeTypedPointer obj.Addr + _F_encodeJsonMarshaler obj.Addr + _F_encodeTextMarshaler obj.Addr +) + +const ( + _MODE_AVX2 = 1 << 2 +) + +func init() { + _F_encodeTypedPointer = jit.Func(encodeTypedPointer) + _F_encodeJsonMarshaler = jit.Func(encodeJsonMarshaler) + _F_encodeTextMarshaler = jit.Func(encodeTextMarshaler) +} + +func (self *_Assembler) _asm_OP_null(_ *_Instr) { + self.check_size(4) + self.Emit("MOVL", jit.Imm(_IM_null), jit.Sib(_RP, _RL, 1, 0)) // MOVL $'null', (RP)(RL*1) + self.Emit("ADDQ", jit.Imm(4), _RL) // ADDQ $4, RL +} + +func (self *_Assembler) _asm_OP_empty_arr(_ *_Instr) { + self.Emit("BTQ", jit.Imm(int64(bitNoNullSliceOrMap)), _ARG_fv) + self.Sjmp("JC", "_empty_arr_{n}") + self._asm_OP_null(nil) + self.Sjmp("JMP", "_empty_arr_end_{n}") + self.Link("_empty_arr_{n}") + self.check_size(2) + self.Emit("MOVW", jit.Imm(_IM_array), jit.Sib(_RP, _RL, 1, 0)) + self.Emit("ADDQ", jit.Imm(2), _RL) + self.Link("_empty_arr_end_{n}") +} + +func (self *_Assembler) _asm_OP_empty_obj(_ *_Instr) { + self.Emit("BTQ", jit.Imm(int64(bitNoNullSliceOrMap)), _ARG_fv) + self.Sjmp("JC", "_empty_obj_{n}") + self._asm_OP_null(nil) + self.Sjmp("JMP", "_empty_obj_end_{n}") + self.Link("_empty_obj_{n}") + self.check_size(2) + self.Emit("MOVW", jit.Imm(_IM_object), jit.Sib(_RP, _RL, 1, 0)) + self.Emit("ADDQ", jit.Imm(2), _RL) + self.Link("_empty_obj_end_{n}") +} + +func (self *_Assembler) _asm_OP_bool(_ *_Instr) { + self.Emit("CMPB", jit.Ptr(_SP_p, 0), jit.Imm(0)) // CMPB (SP.p), $0 + self.Sjmp("JE" , "_false_{n}") // JE _false_{n} + self.check_size(4) // SIZE $4 + self.Emit("MOVL", jit.Imm(_IM_true), jit.Sib(_RP, _RL, 1, 0)) // MOVL $'true', (RP)(RL*1) + self.Emit("ADDQ", jit.Imm(4), _RL) // ADDQ $4, RL + self.Sjmp("JMP" , "_end_{n}") // JMP _end_{n} + self.Link("_false_{n}") // _false_{n}: + self.check_size(5) // SIZE $5 + self.Emit("MOVL", jit.Imm(_IM_fals), jit.Sib(_RP, _RL, 1, 0)) // MOVL $'fals', (RP)(RL*1) + self.Emit("MOVB", jit.Imm('e'), jit.Sib(_RP, _RL, 1, 4)) // MOVB $'e', 4(RP)(RL*1) + self.Emit("ADDQ", jit.Imm(5), _RL) // ADDQ $5, RL + self.Link("_end_{n}") // _end_{n}: +} + +func (self *_Assembler) _asm_OP_i8(_ *_Instr) { + self.store_int(4, _F_i64toa, "MOVBQSX") +} + +func (self *_Assembler) _asm_OP_i16(_ *_Instr) { + self.store_int(6, _F_i64toa, "MOVWQSX") +} + +func (self *_Assembler) _asm_OP_i32(_ *_Instr) { + self.store_int(17, _F_i64toa, "MOVLQSX") +} + +func (self *_Assembler) _asm_OP_i64(_ *_Instr) { + self.store_int(21, _F_i64toa, "MOVQ") +} + +func (self *_Assembler) _asm_OP_u8(_ *_Instr) { + self.store_int(3, _F_u64toa, "MOVBQZX") +} + +func (self *_Assembler) _asm_OP_u16(_ *_Instr) { + self.store_int(5, _F_u64toa, "MOVWQZX") +} + +func (self *_Assembler) _asm_OP_u32(_ *_Instr) { + self.store_int(16, _F_u64toa, "MOVLQZX") +} + +func (self *_Assembler) _asm_OP_u64(_ *_Instr) { + self.store_int(20, _F_u64toa, "MOVQ") +} + +func (self *_Assembler) _asm_OP_f32(_ *_Instr) { + self.check_size(32) + self.Emit("MOVL" , jit.Ptr(_SP_p, 0), _AX) // MOVL (SP.p), AX + self.Emit("ANDL" , jit.Imm(_FM_exp32), _AX) // ANDL $_FM_exp32, AX + self.Emit("XORL" , jit.Imm(_FM_exp32), _AX) // XORL $_FM_exp32, AX + self.Sjmp("JZ" , _LB_error_nan_or_infinite) // JZ _error_nan_or_infinite + self.save_c() // SAVE $C_regs + self.rbuf_di() // MOVQ RP, DI + self.Emit("MOVSS" , jit.Ptr(_SP_p, 0), _X0) // MOVSS (SP.p), X0 + self.call_c(_F_f32toa) // CALL_C f64toa + self.Emit("ADDQ" , _AX, _RL) // ADDQ AX, RL +} + +func (self *_Assembler) _asm_OP_f64(_ *_Instr) { + self.check_size(32) + self.Emit("MOVQ" , jit.Ptr(_SP_p, 0), _AX) // MOVQ (SP.p), AX + self.Emit("MOVQ" , jit.Imm(_FM_exp64), _CX) // MOVQ $_FM_exp64, CX + self.Emit("ANDQ" , _CX, _AX) // ANDQ CX, AX + self.Emit("XORQ" , _CX, _AX) // XORQ CX, AX + self.Sjmp("JZ" , _LB_error_nan_or_infinite) // JZ _error_nan_or_infinite + self.save_c() // SAVE $C_regs + self.rbuf_di() // MOVQ RP, DI + self.Emit("MOVSD" , jit.Ptr(_SP_p, 0), _X0) // MOVSD (SP.p), X0 + self.call_c(_F_f64toa) // CALL_C f64toa + self.Emit("ADDQ" , _AX, _RL) // ADDQ AX, RL +} + +func (self *_Assembler) _asm_OP_str(_ *_Instr) { + self.encode_string(false) +} + +func (self *_Assembler) _asm_OP_bin(_ *_Instr) { + self.Emit("MOVQ", jit.Ptr(_SP_p, 8), _AX) // MOVQ 8(SP.p), AX + self.Emit("ADDQ", jit.Imm(2), _AX) // ADDQ $2, AX + self.Emit("MOVQ", jit.Imm(_IM_mulv), _CX) // MOVQ $_MF_mulv, CX + self.Emit("MOVQ", _DX, _BX) // MOVQ DX, BX + self.From("MULQ", _CX) // MULQ CX + self.Emit("LEAQ", jit.Sib(_DX, _DX, 1, 1), _AX) // LEAQ 1(DX)(DX), AX + self.Emit("ORQ" , jit.Imm(2), _AX) // ORQ $2, AX + self.Emit("MOVQ", _BX, _DX) // MOVQ BX, DX + self.check_size_r(_AX, 0) // SIZE AX + self.add_char('"') // CHAR $'"' + self.Emit("MOVQ", _ARG_rb, _DI) // MOVQ rb<>+0(FP), DI + self.Emit("MOVQ", _RL, jit.Ptr(_DI, 8)) // MOVQ SI, 8(DI) + self.Emit("MOVQ", _SP_p, _SI) // MOVQ SP.p, SI + + /* check for AVX2 support */ + if !cpu.HasAVX2 { + self.Emit("XORL", _DX, _DX) // XORL DX, DX + } else { + self.Emit("MOVL", jit.Imm(_MODE_AVX2), _DX) // MOVL $_MODE_AVX2, DX + } + + /* call the encoder */ + self.call_b64(_F_b64encode) // CALL b64encode + self.load_buffer_AX() // LOAD {buf} + self.add_char('"') // CHAR $'"' +} + +func (self *_Assembler) _asm_OP_quote(_ *_Instr) { + self.encode_string(true) +} + +func (self *_Assembler) _asm_OP_number(_ *_Instr) { + self.Emit("MOVQ" , jit.Ptr(_SP_p, 8), _BX) // MOVQ (SP.p), BX + self.Emit("TESTQ", _BX, _BX) // TESTQ BX, BX + self.Sjmp("JZ" , "_empty_{n}") + self.Emit("MOVQ" , jit.Ptr(_SP_p, 0), _AX) // MOVQ (SP.p), AX + self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX + self.Sjmp("JNZ" , "_number_next_{n}") + self.Emit("MOVQ", jit.Imm(int64(panicNilPointerOfNonEmptyString)), _AX) + self.Sjmp("JMP", _LB_panic) + self.Link("_number_next_{n}") + self.call_go(_F_isValidNumber) // CALL_GO isValidNumber + self.Emit("CMPB" , _AX, jit.Imm(0)) // CMPB AX, $0 + self.Sjmp("JE" , _LB_error_invalid_number) // JE _error_invalid_number + self.Emit("MOVQ" , jit.Ptr(_SP_p, 8), _BX) // MOVQ (SP.p), BX + self.check_size_r(_BX, 0) // SIZE BX + self.Emit("LEAQ" , jit.Sib(_RP, _RL, 1, 0), _AX) // LEAQ (RP)(RL), AX + self.Emit("ADDQ" , jit.Ptr(_SP_p, 8), _RL) // ADDQ 8(SP.p), RL + self.Emit("MOVQ", jit.Ptr(_SP_p, 0), _BX) // MOVOU (SP.p), BX + self.Emit("MOVQ", jit.Ptr(_SP_p, 8), _CX) // MOVOU X0, 8(SP) + self.call_go(_F_memmove) // CALL_GO memmove + self.Emit("MOVQ", _ARG_rb, _AX) // MOVQ rb<>+0(FP), AX + self.Emit("MOVQ", _RL, jit.Ptr(_AX, 8)) // MOVQ RL, 8(AX) + self.Sjmp("JMP" , "_done_{n}") // JMP _done_{n} + self.Link("_empty_{n}") // _empty_{n} + self.check_size(1) // SIZE $1 + self.add_char('0') // CHAR $'0' + self.Link("_done_{n}") // _done_{n}: +} + +func (self *_Assembler) _asm_OP_eface(_ *_Instr) { + self.prep_buffer_AX() // MOVE {buf}, AX + self.Emit("MOVQ" , jit.Ptr(_SP_p, 0), _BX) // MOVQ (SP.p), BX + self.Emit("LEAQ" , jit.Ptr(_SP_p, 8), _CX) // LEAQ 8(SP.p), CX + self.Emit("MOVQ" , _ST, _DI) // MOVQ ST, DI + self.Emit("MOVQ" , _ARG_fv, _SI) // MOVQ fv, AX + self.call_encoder(_F_encodeTypedPointer) // CALL encodeTypedPointer + self.Emit("TESTQ", _ET, _ET) // TESTQ ET, ET + self.Sjmp("JNZ" , _LB_error) // JNZ _error + self.load_buffer_AX() +} + +func (self *_Assembler) _asm_OP_iface(_ *_Instr) { + self.prep_buffer_AX() // MOVE {buf}, AX + self.Emit("MOVQ" , jit.Ptr(_SP_p, 0), _CX) // MOVQ (SP.p), CX + self.Emit("MOVQ" , jit.Ptr(_CX, 8), _BX) // MOVQ 8(CX), BX + self.Emit("LEAQ" , jit.Ptr(_SP_p, 8), _CX) // LEAQ 8(SP.p), CX + self.Emit("MOVQ" , _ST, _DI) // MOVQ ST, DI + self.Emit("MOVQ" , _ARG_fv, _SI) // MOVQ fv, AX + self.call_encoder(_F_encodeTypedPointer) // CALL encodeTypedPointer + self.Emit("TESTQ", _ET, _ET) // TESTQ ET, ET + self.Sjmp("JNZ" , _LB_error) // JNZ _error + self.load_buffer_AX() +} + +func (self *_Assembler) _asm_OP_byte(p *_Instr) { + self.check_size(1) + self.Emit("MOVB", jit.Imm(p.i64()), jit.Sib(_RP, _RL, 1, 0)) // MOVL p.vi(), (RP)(RL*1) + self.Emit("ADDQ", jit.Imm(1), _RL) // ADDQ $1, RL +} + +func (self *_Assembler) _asm_OP_text(p *_Instr) { + self.check_size(len(p.vs())) // SIZE ${len(p.vs())} + self.add_text(p.vs()) // TEXT ${p.vs()} +} + +func (self *_Assembler) _asm_OP_deref(_ *_Instr) { + self.Emit("MOVQ", jit.Ptr(_SP_p, 0), _SP_p) // MOVQ (SP.p), SP.p +} + +func (self *_Assembler) _asm_OP_index(p *_Instr) { + self.Emit("MOVQ", jit.Imm(p.i64()), _AX) // MOVQ $p.vi(), AX + self.Emit("ADDQ", _AX, _SP_p) // ADDQ AX, SP.p +} + +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, -24), _SP_x) // MOVQ -24(ST)(AX), SP.x + self.Emit("MOVQ", jit.Sib(_ST, _AX, 1, -8), _SP_p) // MOVQ -8(ST)(AX), SP.p + self.Emit("MOVQ", jit.Sib(_ST, _AX, 1, 0), _SP_q) // MOVQ (ST)(AX), SP.q +} + +func (self *_Assembler) _asm_OP_save(_ *_Instr) { + self.save_state() +} + +func (self *_Assembler) _asm_OP_drop(_ *_Instr) { + self.drop_state(_StateSize) +} + +func (self *_Assembler) _asm_OP_drop_2(_ *_Instr) { + self.drop_state(_StateSize * 2) // DROP $(_StateSize * 2) + self.Emit("MOVOU", _X0, jit.Sib(_ST, _AX, 1, 56)) // MOVOU X0, 56(ST)(AX) +} + +func (self *_Assembler) _asm_OP_recurse(p *_Instr) { + self.prep_buffer_AX() // MOVE {buf}, (SP) + vt, pv := p.vp() + self.Emit("MOVQ", jit.Type(vt), _BX) // MOVQ $(type(p.vt())), BX + + /* check for indirection */ + if !rt.UnpackType(vt).Indirect() { + self.Emit("MOVQ", _SP_p, _CX) // MOVQ SP.p, CX + } else { + self.Emit("MOVQ", _SP_p, _VAR_vp) // MOVQ SP.p, VAR.vp + self.Emit("LEAQ", _VAR_vp, _CX) // LEAQ VAR.vp, CX + } + + /* call the encoder */ + self.Emit("MOVQ" , _ST, _DI) // MOVQ ST, DI + self.Emit("MOVQ" , _ARG_fv, _SI) // MOVQ $fv, SI + if pv { + self.Emit("BTCQ", jit.Imm(bitPointerValue), _SI) // BTCQ $1, SI + } + self.call_encoder(_F_encodeTypedPointer) // CALL encodeTypedPointer + self.Emit("TESTQ", _ET, _ET) // TESTQ ET, ET + self.Sjmp("JNZ" , _LB_error) // JNZ _error + self.load_buffer_AX() +} + +func (self *_Assembler) _asm_OP_is_nil(p *_Instr) { + self.Emit("CMPQ", jit.Ptr(_SP_p, 0), jit.Imm(0)) // CMPQ (SP.p), $0 + self.Xjmp("JE" , p.vi()) // JE p.vi() +} + +func (self *_Assembler) _asm_OP_is_nil_p1(p *_Instr) { + self.Emit("CMPQ", jit.Ptr(_SP_p, 8), jit.Imm(0)) // CMPQ 8(SP.p), $0 + self.Xjmp("JE" , p.vi()) // JE p.vi() +} + +func (self *_Assembler) _asm_OP_is_zero_1(p *_Instr) { + self.Emit("CMPB", jit.Ptr(_SP_p, 0), jit.Imm(0)) // CMPB (SP.p), $0 + self.Xjmp("JE" , p.vi()) // JE p.vi() +} + +func (self *_Assembler) _asm_OP_is_zero_2(p *_Instr) { + self.Emit("CMPW", jit.Ptr(_SP_p, 0), jit.Imm(0)) // CMPW (SP.p), $0 + self.Xjmp("JE" , p.vi()) // JE p.vi() +} + +func (self *_Assembler) _asm_OP_is_zero_4(p *_Instr) { + self.Emit("CMPL", jit.Ptr(_SP_p, 0), jit.Imm(0)) // CMPL (SP.p), $0 + self.Xjmp("JE" , p.vi()) // JE p.vi() +} + +func (self *_Assembler) _asm_OP_is_zero_8(p *_Instr) { + self.Emit("CMPQ", jit.Ptr(_SP_p, 0), jit.Imm(0)) // CMPQ (SP.p), $0 + self.Xjmp("JE" , p.vi()) // JE p.vi() +} + +func (self *_Assembler) _asm_OP_is_zero_map(p *_Instr) { + self.Emit("MOVQ" , jit.Ptr(_SP_p, 0), _AX) // MOVQ (SP.p), AX + self.Emit("TESTQ", _AX, _AX) // TESTQ AX, AX + self.Xjmp("JZ" , p.vi()) // JZ p.vi() + self.Emit("CMPQ" , jit.Ptr(_AX, 0), jit.Imm(0)) // CMPQ (AX), $0 + self.Xjmp("JE" , p.vi()) // JE p.vi() +} + +func (self *_Assembler) _asm_OP_goto(p *_Instr) { + self.Xjmp("JMP", p.vi()) +} + +func (self *_Assembler) _asm_OP_map_iter(p *_Instr) { + self.Emit("MOVQ" , jit.Type(p.vt()), _AX) // MOVQ $p.vt(), AX + self.Emit("MOVQ" , jit.Ptr(_SP_p, 0), _BX) // MOVQ (SP.p), BX + self.Emit("MOVQ" , _ARG_fv, _CX) // MOVQ fv, CX + self.call_go(_F_iteratorStart) // CALL_GO iteratorStart + self.Emit("MOVQ" , _AX, _SP_q) // MOVQ AX, SP.q + self.Emit("MOVQ" , _BX, _ET) // MOVQ 32(SP), ET + self.Emit("MOVQ" , _CX, _EP) // MOVQ 40(SP), EP + self.Emit("TESTQ", _ET, _ET) // TESTQ ET, ET + self.Sjmp("JNZ" , _LB_error) // JNZ _error +} + +func (self *_Assembler) _asm_OP_map_stop(_ *_Instr) { + self.Emit("MOVQ", _SP_q, _AX) // MOVQ SP.q, AX + self.call_go(_F_iteratorStop) // CALL_GO iteratorStop + self.Emit("XORL", _SP_q, _SP_q) // XORL SP.q, SP.q +} + +func (self *_Assembler) _asm_OP_map_check_key(p *_Instr) { + self.Emit("MOVQ" , jit.Ptr(_SP_q, 0), _SP_p) // MOVQ (SP.q), SP.p + self.Emit("TESTQ", _SP_p, _SP_p) // TESTQ SP.p, SP.p + self.Xjmp("JZ" , p.vi()) // JNZ p.vi() +} + +func (self *_Assembler) _asm_OP_map_write_key(p *_Instr) { + self.Emit("BTQ", jit.Imm(bitSortMapKeys), _ARG_fv) // BTQ ${SortMapKeys}, fv + self.Sjmp("JNC", "_unordered_key_{n}") // JNC _unordered_key_{n} + self.encode_string(false) // STR $false + self.Xjmp("JMP", p.vi()) // JMP ${p.vi()} + self.Link("_unordered_key_{n}") // _unordered_key_{n}: +} + +func (self *_Assembler) _asm_OP_map_value_next(_ *_Instr) { + self.Emit("MOVQ", jit.Ptr(_SP_q, 8), _SP_p) // MOVQ 8(SP.q), SP.p + self.Emit("MOVQ", _SP_q, _AX) // MOVQ SP.q, AX + self.call_go(_F_iteratorNext) // CALL_GO iteratorNext +} + +func (self *_Assembler) _asm_OP_slice_len(_ *_Instr) { + self.Emit("MOVQ" , jit.Ptr(_SP_p, 8), _SP_x) // MOVQ 8(SP.p), SP.x + self.Emit("MOVQ" , jit.Ptr(_SP_p, 0), _SP_p) // MOVQ (SP.p), SP.p + self.Emit("ORQ" , jit.Imm(1 << _S_init), _SP_f) // ORQ $(1<<_S_init), SP.f +} + +func (self *_Assembler) _asm_OP_slice_next(p *_Instr) { + self.Emit("TESTQ" , _SP_x, _SP_x) // TESTQ SP.x, SP.x + self.Xjmp("JZ" , p.vi()) // JZ p.vi() + self.Emit("SUBQ" , jit.Imm(1), _SP_x) // SUBQ $1, SP.x + self.Emit("BTRQ" , jit.Imm(_S_init), _SP_f) // BTRQ $_S_init, SP.f + self.Emit("LEAQ" , jit.Ptr(_SP_p, int64(p.vlen())), _AX) // LEAQ $(p.vlen())(SP.p), AX + self.Emit("CMOVQCC", _AX, _SP_p) // CMOVQNC AX, SP.p +} + +func (self *_Assembler) _asm_OP_marshal(p *_Instr) { + self.call_marshaler(_F_encodeJsonMarshaler, _T_json_Marshaler, p.vt()) +} + +func (self *_Assembler) _asm_OP_marshal_p(p *_Instr) { + if p.vk() != reflect.Ptr { + panic("marshal_p: invalid type") + } else { + self.call_marshaler_v(_F_encodeJsonMarshaler, _T_json_Marshaler, p.vt(), false) + } +} + +func (self *_Assembler) _asm_OP_marshal_text(p *_Instr) { + self.call_marshaler(_F_encodeTextMarshaler, _T_encoding_TextMarshaler, p.vt()) +} + +func (self *_Assembler) _asm_OP_marshal_text_p(p *_Instr) { + if p.vk() != reflect.Ptr { + panic("marshal_text_p: invalid type") + } else { + self.call_marshaler_v(_F_encodeTextMarshaler, _T_encoding_TextMarshaler, p.vt(), false) + } +} + +func (self *_Assembler) _asm_OP_cond_set(_ *_Instr) { + self.Emit("ORQ", jit.Imm(1 << _S_cond), _SP_f) // ORQ $(1<<_S_cond), SP.f +} + +func (self *_Assembler) _asm_OP_cond_testc(p *_Instr) { + self.Emit("BTRQ", jit.Imm(_S_cond), _SP_f) // BTRQ $_S_cond, SP.f + self.Xjmp("JC" , p.vi()) +} + +func (self *_Assembler) print_gc(i int, p1 *_Instr, p2 *_Instr) { + self.Emit("MOVQ", jit.Imm(int64(p2.op())), _CX) // MOVQ $(p2.op()), AX + self.Emit("MOVQ", jit.Imm(int64(p1.op())), _BX) // MOVQ $(p1.op()), BX + self.Emit("MOVQ", jit.Imm(int64(i)), _AX) // MOVQ $(i), CX + self.call_go(_F_println) +} + +var ( + _V_writeBarrier = jit.Imm(int64(uintptr(unsafe.Pointer(&_runtime_writeBarrier)))) + + _F_gcWriteBarrierAX = jit.Func(gcWriteBarrierAX) +) + +func (self *_Assembler) WriteRecNotAX(i int, ptr obj.Addr, rec obj.Addr) { + if rec.Reg == x86.REG_AX || rec.Index == x86.REG_AX { + panic("rec contains AX!") + } + self.Emit("MOVQ", _V_writeBarrier, _BX) + self.Emit("CMPL", jit.Ptr(_BX, 0), jit.Imm(0)) + self.Sjmp("JE", "_no_writeBarrier" + strconv.Itoa(i) + "_{n}") + self.xsave(_DI) + self.Emit("MOVQ", ptr, _AX) + self.Emit("LEAQ", rec, _DI) + self.Emit("MOVQ", _F_gcWriteBarrierAX, _BX) // MOVQ ${fn}, AX + self.Rjmp("CALL", _BX) + self.xload(_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}") +} \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/encoder/compiler.go b/vendor/github.com/bytedance/sonic/encoder/compiler.go new file mode 100644 index 00000000000..a949c90f7bd --- /dev/null +++ b/vendor/github.com/bytedance/sonic/encoder/compiler.go @@ -0,0 +1,885 @@ +/* + * 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 ( + `fmt` + `reflect` + `strconv` + `strings` + `unsafe` + + `github.com/bytedance/sonic/internal/resolver` + `github.com/bytedance/sonic/internal/rt` + `github.com/bytedance/sonic/option` +) + +type _Op uint8 + +const ( + _OP_null _Op = iota + 1 + _OP_empty_arr + _OP_empty_obj + _OP_bool + _OP_i8 + _OP_i16 + _OP_i32 + _OP_i64 + _OP_u8 + _OP_u16 + _OP_u32 + _OP_u64 + _OP_f32 + _OP_f64 + _OP_str + _OP_bin + _OP_quote + _OP_number + _OP_eface + _OP_iface + _OP_byte + _OP_text + _OP_deref + _OP_index + _OP_load + _OP_save + _OP_drop + _OP_drop_2 + _OP_recurse + _OP_is_nil + _OP_is_nil_p1 + _OP_is_zero_1 + _OP_is_zero_2 + _OP_is_zero_4 + _OP_is_zero_8 + _OP_is_zero_map + _OP_goto + _OP_map_iter + _OP_map_stop + _OP_map_check_key + _OP_map_write_key + _OP_map_value_next + _OP_slice_len + _OP_slice_next + _OP_marshal + _OP_marshal_p + _OP_marshal_text + _OP_marshal_text_p + _OP_cond_set + _OP_cond_testc +) + +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_null : "null", + _OP_empty_arr : "empty_arr", + _OP_empty_obj : "empty_obj", + _OP_bool : "bool", + _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_str : "str", + _OP_bin : "bin", + _OP_quote : "quote", + _OP_number : "number", + _OP_eface : "eface", + _OP_iface : "iface", + _OP_byte : "byte", + _OP_text : "text", + _OP_deref : "deref", + _OP_index : "index", + _OP_load : "load", + _OP_save : "save", + _OP_drop : "drop", + _OP_drop_2 : "drop_2", + _OP_recurse : "recurse", + _OP_is_nil : "is_nil", + _OP_is_nil_p1 : "is_nil_p1", + _OP_is_zero_1 : "is_zero_1", + _OP_is_zero_2 : "is_zero_2", + _OP_is_zero_4 : "is_zero_4", + _OP_is_zero_8 : "is_zero_8", + _OP_is_zero_map : "is_zero_map", + _OP_goto : "goto", + _OP_map_iter : "map_iter", + _OP_map_stop : "map_stop", + _OP_map_check_key : "map_check_key", + _OP_map_write_key : "map_write_key", + _OP_map_value_next : "map_value_next", + _OP_slice_len : "slice_len", + _OP_slice_next : "slice_next", + _OP_marshal : "marshal", + _OP_marshal_p : "marshal_p", + _OP_marshal_text : "marshal_text", + _OP_marshal_text_p : "marshal_text_p", + _OP_cond_set : "cond_set", + _OP_cond_testc : "cond_testc", +} + +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_is_zero_ints() _Op { + switch _INT_SIZE { + case 32: return _OP_is_zero_4 + case 64: return _OP_is_zero_8 + default: panic("unsupported integer size") + } +} + +type _Instr struct { + u uint64 // union {op: 8, _: 8, vi: 48}, vi maybe int or len(str) + p unsafe.Pointer // maybe GoString.Ptr, or *GoType +} + +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 newInsVs(op _Op, vs string) _Instr { + return _Instr { + u: packOp(op) | rt.PackInt(len(vs)), + p: (*rt.GoString)(unsafe.Pointer(&vs)).Ptr, + } +} + +func newInsVt(op _Op, vt reflect.Type) _Instr { + return _Instr { + u: packOp(op), + p: unsafe.Pointer(rt.UnpackType(vt)), + } +} + +func newInsVp(op _Op, vt reflect.Type, pv bool) _Instr { + i := 0 + if pv { + i = 1 + } + return _Instr { + u: packOp(op) | rt.PackInt(i), + p: unsafe.Pointer(rt.UnpackType(vt)), + } +} + +func (self _Instr) op() _Op { + return _Op(self.u >> 56) +} + +func (self _Instr) vi() int { + return rt.UnpackInt(self.u) +} + +func (self _Instr) vf() uint8 { + return (*rt.GoType)(self.p).KindFlags +} + +func (self _Instr) vs() (v string) { + (*rt.GoString)(unsafe.Pointer(&v)).Ptr = self.p + (*rt.GoString)(unsafe.Pointer(&v)).Len = self.vi() + return +} + +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) vp() (vt reflect.Type, pv bool) { + return (*rt.GoType)(self.p).Pack(), rt.UnpackInt(self.u) == 1 +} + +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_is_nil : fallthrough + case _OP_is_nil_p1 : fallthrough + case _OP_is_zero_1 : fallthrough + case _OP_is_zero_2 : fallthrough + case _OP_is_zero_4 : fallthrough + case _OP_is_zero_8 : fallthrough + case _OP_map_check_key : fallthrough + case _OP_map_write_key : fallthrough + case _OP_slice_next : fallthrough + case _OP_cond_testc : return true + default : return false + } +} + +func (self _Instr) disassemble() string { + switch self.op() { + case _OP_byte : return fmt.Sprintf("%-18s%s", self.op().String(), strconv.QuoteRune(rune(self.vi()))) + case _OP_text : return fmt.Sprintf("%-18s%s", self.op().String(), strconv.Quote(self.vs())) + case _OP_index : return fmt.Sprintf("%-18s%d", self.op().String(), self.vi()) + case _OP_recurse : fallthrough + case _OP_map_iter : fallthrough + case _OP_marshal : fallthrough + case _OP_marshal_p : fallthrough + case _OP_marshal_text : fallthrough + case _OP_marshal_text_p : return fmt.Sprintf("%-18s%s", self.op().String(), self.vt()) + case _OP_goto : fallthrough + case _OP_is_nil : fallthrough + case _OP_is_nil_p1 : fallthrough + case _OP_is_zero_1 : fallthrough + case _OP_is_zero_2 : fallthrough + case _OP_is_zero_4 : fallthrough + case _OP_is_zero_8 : fallthrough + case _OP_is_zero_map : fallthrough + case _OP_cond_testc : fallthrough + case _OP_map_check_key : fallthrough + case _OP_map_write_key : return fmt.Sprintf("%-18sL_%d", self.op().String(), self.vi()) + case _OP_slice_next : return fmt.Sprintf("%-18sL_%d, %s", self.op().String(), self.vi(), self.vt()) + default : return self.op().String() + } +} + +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) key(op _Op) { + *self = append(*self, + newInsVi(_OP_byte, '"'), + newInsOp(op), + newInsVi(_OP_byte, '"'), + ) +} + +func (self *_Program) int(op _Op, vi int) { + *self = append(*self, newInsVi(op, vi)) +} + +func (self *_Program) str(op _Op, vs string) { + *self = append(*self, newInsVs(op, vs)) +} + +func (self *_Program) rtt(op _Op, vt reflect.Type) { + *self = append(*self, newInsVt(op, vt)) +} + +func (self *_Program) vp(op _Op, vt reflect.Type, pv bool) { + *self = append(*self, newInsVp(op, vt, pv)) +} + +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() { + tab[ins.vi()] = 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 + 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 _Program, err error) { + defer self.rescue(&err) + self.compileOne(&ret, 0, vt, pv) + return +} + +func (self *_Compiler) compileOne(p *_Program, sp int, vt reflect.Type, pv bool) { + if self.tab[vt] { + p.vp(_OP_recurse, vt, pv) + } else { + self.compileRec(p, sp, vt, pv) + } +} + +func (self *_Compiler) compileRec(p *_Program, sp int, vt reflect.Type, pv bool) { + pr := self.pv + pt := reflect.PtrTo(vt) + + /* check for addressable `json.Marshaler` with pointer receiver */ + if pv && pt.Implements(jsonMarshalerType) { + p.rtt(_OP_marshal_p, pt) + return + } + + /* check for `json.Marshaler` */ + if vt.Implements(jsonMarshalerType) { + self.compileMarshaler(p, _OP_marshal, vt, jsonMarshalerType) + return + } + + /* check for addressable `encoding.TextMarshaler` with pointer receiver */ + if pv && pt.Implements(encodingTextMarshalerType) { + p.rtt(_OP_marshal_text_p, pt) + return + } + + /* check for `encoding.TextMarshaler` */ + if vt.Implements(encodingTextMarshalerType) { + self.compileMarshaler(p, _OP_marshal_text, vt, encodingTextMarshalerType) + 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 *_Program, sp int, vt reflect.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 : 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 (error_type(vt)) + } +} + +func (self *_Compiler) compileNil(p *_Program, sp int, vt reflect.Type, nil_op _Op, fn func(*_Program, int, reflect.Type)) { + x := p.pc() + p.add(_OP_is_nil) + fn(p, sp, vt) + e := p.pc() + p.add(_OP_goto) + p.pin(x) + p.add(nil_op) + p.pin(e) +} + +func (self *_Compiler) compilePtr(p *_Program, sp int, vt reflect.Type) { + self.compileNil(p, sp, vt, _OP_null, self.compilePtrBody) +} + +func (self *_Compiler) compilePtrBody(p *_Program, sp int, vt reflect.Type) { + p.tag(sp) + p.add(_OP_save) + p.add(_OP_deref) + self.compileOne(p, sp + 1, vt, true) + p.add(_OP_drop) +} + +func (self *_Compiler) compileMap(p *_Program, sp int, vt reflect.Type) { + self.compileNil(p, sp, vt, _OP_empty_obj, self.compileMapBody) +} + +func (self *_Compiler) compileMapBody(p *_Program, sp int, vt reflect.Type) { + p.tag(sp + 1) + p.int(_OP_byte, '{') + p.add(_OP_save) + p.rtt(_OP_map_iter, vt) + p.add(_OP_save) + i := p.pc() + p.add(_OP_map_check_key) + u := p.pc() + p.add(_OP_map_write_key) + self.compileMapBodyKey(p, vt.Key()) + p.pin(u) + p.int(_OP_byte, ':') + p.add(_OP_map_value_next) + self.compileOne(p, sp + 2, vt.Elem(), false) + j := p.pc() + p.add(_OP_map_check_key) + p.int(_OP_byte, ',') + v := p.pc() + p.add(_OP_map_write_key) + self.compileMapBodyKey(p, vt.Key()) + p.pin(v) + p.int(_OP_byte, ':') + p.add(_OP_map_value_next) + self.compileOne(p, sp + 2, vt.Elem(), false) + p.int(_OP_goto, j) + p.pin(i) + p.pin(j) + p.add(_OP_map_stop) + p.add(_OP_drop_2) + p.int(_OP_byte, '}') +} + +func (self *_Compiler) compileMapBodyKey(p *_Program, vk reflect.Type) { + if !vk.Implements(encodingTextMarshalerType) { + self.compileMapBodyTextKey(p, vk) + } else { + self.compileMapBodyUtextKey(p, vk) + } +} + +func (self *_Compiler) compileMapBodyTextKey(p *_Program, vk reflect.Type) { + switch vk.Kind() { + case reflect.Invalid : panic("map key is nil") + case reflect.Bool : p.key(_OP_bool) + case reflect.Int : p.key(_OP_int()) + case reflect.Int8 : p.key(_OP_i8) + case reflect.Int16 : p.key(_OP_i16) + case reflect.Int32 : p.key(_OP_i32) + case reflect.Int64 : p.key(_OP_i64) + case reflect.Uint : p.key(_OP_uint()) + case reflect.Uint8 : p.key(_OP_u8) + case reflect.Uint16 : p.key(_OP_u16) + case reflect.Uint32 : p.key(_OP_u32) + case reflect.Uint64 : p.key(_OP_u64) + case reflect.Uintptr : p.key(_OP_uintptr()) + case reflect.Float32 : p.key(_OP_f32) + case reflect.Float64 : p.key(_OP_f64) + case reflect.String : self.compileString(p, vk) + default : panic(error_type(vk)) + } +} + +func (self *_Compiler) compileMapBodyUtextKey(p *_Program, vk reflect.Type) { + if vk.Kind() != reflect.Ptr { + p.rtt(_OP_marshal_text, vk) + } else { + self.compileMapBodyUtextPtr(p, vk) + } +} + +func (self *_Compiler) compileMapBodyUtextPtr(p *_Program, vk reflect.Type) { + i := p.pc() + p.add(_OP_is_nil) + p.rtt(_OP_marshal_text, vk) + j := p.pc() + p.add(_OP_goto) + p.pin(i) + p.str(_OP_text, "\"\"") + p.pin(j) +} + +func (self *_Compiler) compileSlice(p *_Program, sp int, vt reflect.Type) { + self.compileNil(p, sp, vt, _OP_empty_arr, self.compileSliceBody) +} + +func (self *_Compiler) compileSliceBody(p *_Program, sp int, vt reflect.Type) { + if isSimpleByte(vt) { + p.add(_OP_bin) + } else { + self.compileSliceArray(p, sp, vt) + } +} + +func (self *_Compiler) compileSliceArray(p *_Program, sp int, vt reflect.Type) { + p.tag(sp) + p.int(_OP_byte, '[') + p.add(_OP_save) + p.add(_OP_slice_len) + i := p.pc() + p.rtt(_OP_slice_next, vt) + self.compileOne(p, sp + 1, vt, true) + j := p.pc() + p.rtt(_OP_slice_next, vt) + p.int(_OP_byte, ',') + self.compileOne(p, sp + 1, vt, true) + p.int(_OP_goto, j) + p.pin(i) + p.pin(j) + p.add(_OP_drop) + p.int(_OP_byte, ']') +} + +func (self *_Compiler) compileArray(p *_Program, sp int, vt reflect.Type, nb int) { + p.tag(sp) + p.int(_OP_byte, '[') + p.add(_OP_save) + + /* first item */ + if nb != 0 { + self.compileOne(p, sp + 1, vt, self.pv) + p.add(_OP_load) + } + + /* remaining items */ + for i := 1; i < nb; i++ { + p.int(_OP_byte, ',') + p.int(_OP_index, i * int(vt.Size())) + self.compileOne(p, sp + 1, vt, self.pv) + p.add(_OP_load) + } + + /* end of array */ + p.add(_OP_drop) + p.int(_OP_byte, ']') +} + +func (self *_Compiler) compileString(p *_Program, vt reflect.Type) { + if vt != jsonNumberType { + p.add(_OP_str) + } else { + p.add(_OP_number) + } +} + +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.vp(_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 *_Program, sp int, vt reflect.Type) { + p.tag(sp) + p.int(_OP_byte, '{') + p.add(_OP_save) + p.add(_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(_OP_index, int(o.Size)); o.Kind == resolver.F_deref { + s = append(s, p.pc()) + p.add(_OP_is_nil) + p.add(_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(_OP_cond_testc) + p.int(_OP_byte, ',') + p.pin(i) + + /* compile the key and value */ + ft := fv.Type + p.str(_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(_OP_load) + } + + /* end of object */ + p.add(_OP_drop) + p.int(_OP_byte, '}') +} + +func (self *_Compiler) compileStructFieldStr(p *_Program, sp int, vt reflect.Type) { + 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(_OP_is_nil) + p.add(_OP_deref) + } + + /* special case of a double-quoted string */ + if ft != jsonNumberType && ft.Kind() == reflect.String { + p.add(_OP_quote) + } else { + self.compileStructFieldQuoted(p, sp, vt) + } + + /* the "null" case of the pointer */ + if pc != -1 { + e := p.pc() + p.add(_OP_goto) + p.pin(pc) + p.add(_OP_null) + p.pin(e) + } +} + +func (self *_Compiler) compileStructFieldZero(p *_Program, vt reflect.Type) { + switch vt.Kind() { + case reflect.Bool : p.add(_OP_is_zero_1) + case reflect.Int : p.add(_OP_is_zero_ints()) + case reflect.Int8 : p.add(_OP_is_zero_1) + case reflect.Int16 : p.add(_OP_is_zero_2) + case reflect.Int32 : p.add(_OP_is_zero_4) + case reflect.Int64 : p.add(_OP_is_zero_8) + case reflect.Uint : p.add(_OP_is_zero_ints()) + case reflect.Uint8 : p.add(_OP_is_zero_1) + case reflect.Uint16 : p.add(_OP_is_zero_2) + case reflect.Uint32 : p.add(_OP_is_zero_4) + case reflect.Uint64 : p.add(_OP_is_zero_8) + case reflect.Uintptr : p.add(_OP_is_nil) + case reflect.Float32 : p.add(_OP_is_zero_4) + case reflect.Float64 : p.add(_OP_is_zero_8) + case reflect.String : p.add(_OP_is_nil_p1) + case reflect.Interface : p.add(_OP_is_nil_p1) + case reflect.Map : p.add(_OP_is_zero_map) + case reflect.Ptr : p.add(_OP_is_nil) + case reflect.Slice : p.add(_OP_is_nil_p1) + default : panic(error_type(vt)) + } +} + +func (self *_Compiler) compileStructFieldQuoted(p *_Program, sp int, vt reflect.Type) { + p.int(_OP_byte, '"') + self.compileOne(p, sp, vt, self.pv) + p.int(_OP_byte, '"') +} + +func (self *_Compiler) compileInterface(p *_Program, vt reflect.Type) { + x := p.pc() + p.add(_OP_is_nil_p1) + + /* iface and efaces are different */ + if vt.NumMethod() == 0 { + p.add(_OP_eface) + } else { + p.add(_OP_iface) + } + + /* the "null" value */ + e := p.pc() + p.add(_OP_goto) + p.pin(x) + p.add(_OP_null) + p.pin(e) +} + +func (self *_Compiler) compileMarshaler(p *_Program, op _Op, vt reflect.Type, mt reflect.Type) { + pc := p.pc() + vk := vt.Kind() + + /* direct receiver */ + if vk != reflect.Ptr { + p.rtt(op, vt) + return + } + + /* value receiver with a pointer type, check for nil before calling the marshaler */ + p.add(_OP_is_nil) + p.rtt(op, vt) + i := p.pc() + p.add(_OP_goto) + p.pin(pc) + p.add(_OP_null) + p.pin(i) +} diff --git a/vendor/github.com/bytedance/sonic/encoder/debug_go116.go b/vendor/github.com/bytedance/sonic/encoder/debug_go116.go new file mode 100644 index 00000000000..4bc9c15c1db --- /dev/null +++ b/vendor/github.com/bytedance/sonic/encoder/debug_go116.go @@ -0,0 +1,66 @@ +// +build go1.15,!go1.17 + +/* + * 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 ( + `os` + `strings` + `runtime` + `runtime/debug` + + `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_null) + + _F_gc = jit.Func(runtime.GC) + _F_force_gc = jit.Func(debug.FreeOSMemory) + _F_println = jit.Func(println_wrapper) +) + +func println_wrapper(i int, op1 int, op2 int){ + println(i, " Intrs ", op1, _OpNames[op1], "next: ", op2, _OpNames[op2]) +} + +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/encoder/debug_go117.go b/vendor/github.com/bytedance/sonic/encoder/debug_go117.go new file mode 100644 index 00000000000..e1016de3234 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/encoder/debug_go117.go @@ -0,0 +1,205 @@ +// +build go1.17,!go1.21 + +/* + * 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 ( + `fmt` + `os` + `runtime` + `strings` + `unsafe` + + `github.com/bytedance/sonic/internal/jit` + `github.com/twitchyliquid64/golang-asm/obj` +) + +const _FP_debug = 128 + +var ( + debugSyncGC = os.Getenv("SONIC_SYNC_GC") != "" + debugAsyncGC = os.Getenv("SONIC_NO_ASYNC_GC") == "" + debugCheckPtr = os.Getenv("SONIC_CHECK_POINTER") != "" +) + +var ( + _Instr_End = newInsOp(_OP_is_nil) + + _F_gc = jit.Func(gc) + _F_println = jit.Func(println_wrapper) + _F_print = jit.Func(print) +) + +func (self *_Assembler) dsave(r ...obj.Addr) { + for i, v := range r { + if i > _FP_debug / 8 - 1 { + panic("too many registers to save") + } else { + self.Emit("MOVQ", v, jit.Ptr(_SP, _FP_fargs + _FP_saves + _FP_locals + int64(i) * 8)) + } + } +} + +func (self *_Assembler) dload(r ...obj.Addr) { + for i, v := range r { + if i > _FP_debug / 8 - 1 { + panic("too many registers to load") + } else { + self.Emit("MOVQ", jit.Ptr(_SP, _FP_fargs + _FP_saves + _FP_locals + int64(i) * 8), v) + } + } +} + +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 gc() { + if !debugSyncGC { + return + } + runtime.GC() + // debug.FreeOSMemory() +} + +func (self *_Assembler) dcall(fn obj.Addr) { + self.Emit("MOVQ", fn, _R10) // MOVQ ${fn}, R10 + self.Rjmp("CALL", _R10) // CALL R10 +} + +func (self *_Assembler) debug_gc() { + if !debugSyncGC { + return + } + self.dsave(_REG_debug...) + self.dcall(_F_gc) + self.dload(_REG_debug...) +} + +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.debug_gc() + } +} + +//go:noescape +//go:linkname checkptrBase runtime.checkptrBase +func checkptrBase(p unsafe.Pointer) uintptr + +//go:noescape +//go:linkname findObject runtime.findObject +func findObject(p, refBase, refOff uintptr) (base uintptr, s unsafe.Pointer, objIndex uintptr) + +var ( + _F_checkptr = jit.Func(checkptr) + _F_printptr = jit.Func(printptr) +) + +var ( + _R10 = jit.Reg("R10") +) +var _REG_debug = []obj.Addr { + jit.Reg("AX"), + jit.Reg("BX"), + jit.Reg("CX"), + jit.Reg("DX"), + jit.Reg("DI"), + jit.Reg("SI"), + jit.Reg("BP"), + jit.Reg("SP"), + jit.Reg("R8"), + jit.Reg("R9"), + jit.Reg("R10"), + jit.Reg("R11"), + jit.Reg("R12"), + jit.Reg("R13"), + jit.Reg("R14"), + jit.Reg("R15"), +} + +func checkptr(ptr uintptr) { + if ptr == 0 { + return + } + fmt.Printf("pointer: %x\n", ptr) + f := checkptrBase(unsafe.Pointer(uintptr(ptr))) + if f == 0 { + fmt.Printf("! unknown-based pointer: %x\n", ptr) + } else if f == 1 { + fmt.Printf("! stack pointer: %x\n", ptr) + } else { + fmt.Printf("base: %x\n", f) + } + findobj(ptr) +} + +func findobj(ptr uintptr) { + base, s, objIndex := findObject(ptr, 0, 0) + if s != nil && base == 0 { + fmt.Printf("! invalid pointer: %x\n", ptr) + } + fmt.Printf("objIndex: %d\n", objIndex) +} + +func (self *_Assembler) check_ptr(ptr obj.Addr, lea bool) { + if !debugCheckPtr { + return + } + + self.dsave(_REG_debug...) + if lea { + self.Emit("LEAQ", ptr, _R10) + } else { + self.Emit("MOVQ", ptr, _R10) + } + self.Emit("MOVQ", _R10, jit.Ptr(_SP, 0)) + self.dcall(_F_checkptr) + self.dload(_REG_debug...) +} + +func printptr(i int, ptr uintptr) { + fmt.Printf("[%d] ptr: %x\n", i, ptr) +} + +func (self *_Assembler) print_ptr(i int, ptr obj.Addr, lea bool) { + self.dsave(_REG_debug...) + if lea { + self.Emit("LEAQ", ptr, _R10) + } else { + self.Emit("MOVQ", ptr, _R10) + } + + self.Emit("MOVQ", jit.Imm(int64(i)), _AX) + self.Emit("MOVQ", _R10, _BX) + self.dcall(_F_printptr) + self.dload(_REG_debug...) +} \ No newline at end of file diff --git a/vendor/github.com/bytedance/sonic/encoder/encoder.go b/vendor/github.com/bytedance/sonic/encoder/encoder.go new file mode 100644 index 00000000000..7a133016668 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/encoder/encoder.go @@ -0,0 +1,311 @@ +/* + * 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` + + `github.com/bytedance/sonic/internal/native` + `github.com/bytedance/sonic/internal/native/types` + `github.com/bytedance/sonic/internal/rt` + `github.com/bytedance/sonic/utf8` + `github.com/bytedance/sonic/option` +) + +// Options is a set of encoding options. +type Options uint64 + +const ( + bitSortMapKeys = iota + bitEscapeHTML + bitCompactMarshaler + bitNoQuoteTextMarshaler + bitNoNullSliceOrMap + bitValidateString + + // used for recursive compile + bitPointerValue = 63 +) + +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 << 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 << bitEscapeHTML + + // CompactMarshaler indicates that the output JSON from json.Marshaler + // is always compact and needs no validation + CompactMarshaler Options = 1 << bitCompactMarshaler + + // NoQuoteTextMarshaler indicates that the output text from encoding.TextMarshaler + // is always escaped string and needs no quoting + NoQuoteTextMarshaler Options = 1 << bitNoQuoteTextMarshaler + + // NoNullSliceOrMap indicates all empty Array or Object are encoded as '[]' or '{}', + // instead of 'null' + NoNullSliceOrMap Options = 1 << bitNoNullSliceOrMap + + // ValidateString indicates that encoder should validate the input string + // before encoding it into JSON. + ValidateString Options = 1 << bitValidateString + + // CompatibleWithStd is used to be compatible with std encoder. + CompatibleWithStd Options = SortMapKeys | EscapeHTML | CompactMarshaler +) + +// 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 + } +} + +// 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 { + var n int + var p []byte + + /* check for empty string */ + if s == "" { + return `""` + } + + /* allocate space for result */ + n = len(s) + 2 + p = make([]byte, 0, n) + + /* call the encoder */ + _ = encodeString(&p, s) + return rt.Mem2Str(p) +} + +// Encode returns the JSON encoding of val, encoded with opts. +func Encode(val interface{}, opts Options) ([]byte, error) { + buf := newBytes() + err := EncodeInto(&buf, val, opts) + + /* check for errors */ + if err != nil { + freeBytes(buf) + return nil, err + } + + if opts & EscapeHTML != 0 || opts & ValidateString != 0 { + return buf, nil + } + + /* make a copy of the result */ + ret := make([]byte, len(buf)) + copy(ret, buf) + + freeBytes(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 { + stk := newStack() + efv := rt.UnpackEface(val) + err := encodeTypedPointer(buf, efv.Type, &efv.Value, stk, uint64(opts)) + + /* return the stack into pool */ + if err != nil { + resetStack(stk) + } + freeStack(stk) + + /* EscapeHTML needs to allocate a new buffer*/ + if opts & EscapeHTML != 0 { + dest := HTMLEscape(nil, *buf) + freeBytes(*buf) // free origin used buffer + *buf = dest + } + + if opts & ValidateString != 0 && !utf8.Validate(*buf) { + dest := utf8.CorrectWith(nil, *buf, `\ufffd`) + freeBytes(*buf) // free origin used buffer + *buf = dest + } + + /* avoid GC ahead */ + runtime.KeepAlive(buf) + runtime.KeepAlive(efv) + return err +} + +var typeByte = rt.UnpackType(reflect.TypeOf(byte(0))) + +// 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

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�tt2Kq5OGeWCc4{7--TEw%t2RU#fUAvORd_Ld9hKi%AaSooYl_hgv#)Ox`LS*P z^9`q89~5mf|22-pZc@rMY^kON^{(fAsavCTZPxE!)9iZ2%KYobsy`~vZS}M4{>-MX zrRzIInN{4+f2sS@HQSUYBl>~>1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SLT+0=iySL}3U(00Izz00bZa0SG_<0uV4Pp!vzEEB{4x7ll2JTrIdLa8-M1 zT64PVnE!GtMlXkJ@?ZA8p2WLmoT3$BqBOOr%B6{2858U)yf_QyQ2E_ogfnKbG1hwA za?r2gkmH)ss!JLh z;j$(nOh~7s$%0D)S4DfzyV6ki>;AUk>s5?Ao%O{ZyU0(ETS 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